为显示java.lang.NullPointerException谷歌地图API第2版 [英] java.lang.NullPointerException for google map API v2

查看:196
本文介绍了为显示java.lang.NullPointerException谷歌地图API第2版的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我一直在试图解决这个问题的年龄,我无法找到问题的所在。
我有只运行Android 2.2的一些设备的麻烦。我测试了在Android 4.1.2,它工作正常。

我得到的错误:

 了java.lang.RuntimeException:无法启动活动ComponentInfo {com.coldice.plotfinder / com.coldice.plotfinder.MapFragment}:显示java.lang.NullPointerException
在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2668)
在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2684)
在android.app.ActivityThread.access $ 2300(ActivityThread.java:126)
在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:2038)
在android.os.Handler.dispatchMessage(Handler.java:99)
在android.os.Looper.loop(Looper.java:123)
在android.app.ActivityThread.main(ActivityThread.java:4632)
在java.lang.reflect.Method.invokeNative(本机方法)
在java.lang.reflect.Method.invoke(Method.java:521)
在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:858)
在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
在dalvik.system.NativeStart.main(本机方法)
显示java.lang.NullPointerException:产生的原因
在com.coldice.plotfinder.MapFragment.onCreate(MapFragment.java:67)
在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2632)
... 11更多

所以回过头来看我的课MapFragment 67行是

  googleMap.setMapType(GoogleMap.MAP_TYPE_SATELLITE);

据我所知,GoogleMap的API V2需要API级别12或更高这里指出,但我用更低,因此我称之为

  getSupportFragmentManager();

该MapFragment类code是如下:

 公共类MapFragment扩展SherlockFragmentActivity {
    私有静态最后弦乐TAG =MapFragment;
    私人GoogleMap的GoogleMap的; // 谷歌地图
    私人INT地图类型= GoogleMap.MAP_TYPE_SATELLITE;    私人折线折线;; //使用多边形绘图的土地面积
    私人布尔isDrawn = FALSE;
    静态字符串fileToBeRead = NULL; //读取的文件名    ArrayList的< Cooridnates> cooridnatesList;
    //图像工具降耗
    ImageSaveUtil imageUtil =新ImageSaveUtil();    @覆盖
    公共无效的onCreate(捆绑savedInstanceState){
        setTheme(R.style.Theme_Sherlock);
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.activity_map);        //不同的颜色每个标记
        浮动[] = markerColours {BitmapDescriptorFactory.HUE_AZURE,BitmapDescriptorFactory.HUE_BLUE,BitmapDescriptorFactory.HUE_CYAN,BitmapDescriptorFactory.HUE_GREEN,
        BitmapDescriptorFactory.HUE_MAGENTA,BitmapDescriptorFactory.HUE_ORANGE,BitmapDescriptorFactory.HUE_RED,BitmapDescriptorFactory.HUE_ROSE,
        BitmapDesc​​riptorFactory.HUE_VIOLET,BitmapDesc​​riptorFactory.HUE_YELLOW};        //将code我越来越显示java.lang.NullPointerException
        FragmentManager fragmentManager = getSupportFragmentManager();
        SupportMapFragment mapFragment =(SupportMapFragment)fragmentManager.findFragmentById(R.id.map);
        GoogleMap的= mapFragment.getMap();
        googleMap.setMapType(GoogleMap.MAP_TYPE_SATELLITE);        //如果存在要读取的文件,然后读取坐标
        如果(fileToBeRead!= NULL)
        {
            READDATA(fileToBeRead);
            fileToBeRead = NULL;
        }            //获取坐标列表
        cooridnatesList = MainActivity.getList();
        如果(cooridnatesList!= NULL)
        {
            //从每个点添加标记
            的for(int i = 0; I< cooridnatesList.size();我++)
            {
                的LatLng点=新经纬度(cooridnatesList.get(ⅰ).getLat(),cooridnatesList.get(ⅰ).getLon());
                googleMap.addMarker(新的MarkerOptions()
                .POSITION(点)
                .title伪(我的土地)
                是.snippet(点:+ cooridnatesList.get(ⅰ).getLat()+,+ cooridnatesList.get(ⅰ).getLon())
                .icon(BitmapDesc​​riptorFactory.defaultMarker(markerColours [则i%10])));            }            googleMap.getUiSettings()setCompassEnabled(真)。 //设置在地图中启用了指南针
            googleMap.getUiSettings()setZoomControlsEnabled(真)。 //缩放已启用
            googleMap.getUiSettings()setMyLocationButtonEnabled(真)。 //启用我的位置按钮
            //缩放根据输入的第一个点的相机
            经纬度cameraLatLng =新经纬度(cooridnatesList.get(0).getLat(),cooridnatesList.get(0).getLon());
            浮cameraZoom = 10;            如果(savedInstanceState!= NULL){
                地图类型= savedInstanceState.getInt(map_type,GoogleMap.MAP_TYPE_SATELLITE);                双savedLat = savedInstanceState.getDouble(纬度);
                双savedLng = savedInstanceState.getDouble(LNG);
                cameraLatLng =新的经纬度(savedLat,savedLng);                cameraZoom = savedInstanceState.getFloat(放大,18);
            }            //设置地图类型,如卫星或街景
            googleMap.setMapType(地图类型);
            googleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(cameraLatLng,cameraZoom));
            //显示土地面积
            最终的TextView landInformation =(的TextView)findViewById(R.id.textViewLandInformation);
            双区= calculateArea(cooridnatesList);
            landInformation.setText(的getString(R.string.land_area)+\\ n+ Math.round(区)+平方米);        }    }


尝试将所有code你的GoogleMap的引用,以在onStart()或onResume()。地图中的片段地图不是实例化后才片段已经走过了onCreateView(<一个href=\"https://developers.google.com/maps/documentation/android/reference/com/google/android/gms/maps/MapFragment#getMap%28%29\"相对=nofollow>链接)。此外,您还需要检查你的空GoogleMap的,因为如果没有安装谷歌播放服务,或在地图无法使用某些其他原因,这将是空。

I have been trying to solve this issue for ages and I can't find where the problem is. I am having trouble only with some devices that run Android 2.2. I tested on Android 4.1.2 and it works fine.

The error I am getting:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.coldice.plotfinder/com.coldice.plotfinder.MapFragment}: java.lang.NullPointerException
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2668)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2684)
at android.app.ActivityThread.access$2300(ActivityThread.java:126)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2038)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:4632)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException
at com.coldice.plotfinder.MapFragment.onCreate(MapFragment.java:67)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2632)
... 11 more

So looking back to my class MapFragment line 67 which is

 googleMap.setMapType(GoogleMap.MAP_TYPE_SATELLITE);

I am aware that googlemap API v2 requires API level 12 or higher as noted here, but I am using lower so I called

getSupportFragmentManager();

The MapFragment class code is below:

public class MapFragment extends SherlockFragmentActivity {
    private static final String TAG = "MapFragment";
    private GoogleMap googleMap;                                                    // Google map 
    private int mapType = GoogleMap.MAP_TYPE_SATELLITE;

    private Polyline polyline;;                                                     // Drawing the area of the land by using the polygon
    private boolean isDrawn=false;
    static String fileToBeRead =null;                                               // The file name to be read

    ArrayList<Cooridnates> cooridnatesList;
    // Image utility saving
    ImageSaveUtil imageUtil = new ImageSaveUtil();

    @Override
    public void onCreate(Bundle savedInstanceState) {
        setTheme(R.style.Theme_Sherlock);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_map);

        // Different colors for each marker
        float[] markerColours = {BitmapDescriptorFactory.HUE_AZURE,BitmapDescriptorFactory.HUE_BLUE,BitmapDescriptorFactory.HUE_CYAN,BitmapDescriptorFactory.HUE_GREEN,
        BitmapDescriptorFactory.HUE_MAGENTA,BitmapDescriptorFactory.HUE_ORANGE,BitmapDescriptorFactory.HUE_RED,BitmapDescriptorFactory.HUE_ROSE,
        BitmapDescriptorFactory.HUE_VIOLET,BitmapDescriptorFactory.HUE_YELLOW};

        // The code I am getting java.lang.NullPointerException
        FragmentManager fragmentManager = getSupportFragmentManager();
        SupportMapFragment mapFragment =  (SupportMapFragment)fragmentManager.findFragmentById(R.id.map);
        googleMap = mapFragment.getMap();
        googleMap.setMapType(GoogleMap.MAP_TYPE_SATELLITE);

        // If there is a file to be read, then read the coordinates 
        if(fileToBeRead!=null)
        {
            readData(fileToBeRead);
            fileToBeRead =null;
        }

            // Getting the coordinates List
        cooridnatesList = MainActivity.getList();
        if(cooridnatesList!=null)
        {
            // Adding a marker from each point
            for(int i=0;i<cooridnatesList.size();i++)
            {
                LatLng point = new LatLng(cooridnatesList.get(i).getLat(),cooridnatesList.get(i).getLon());
                googleMap.addMarker(new MarkerOptions()
                .position(point)
                .title("My Land")
                .snippet("Point: "+cooridnatesList.get(i).getLat()+","+cooridnatesList.get(i).getLon())
                .icon(BitmapDescriptorFactory.defaultMarker(markerColours[i%10])));

            }

            googleMap.getUiSettings().setCompassEnabled(true);                      // Setting the compass enabled in the map
            googleMap.getUiSettings().setZoomControlsEnabled(true);                 // Zooming is enabled
            googleMap.getUiSettings().setMyLocationButtonEnabled(true);             // My location button is enabled


            // Zooming the camera from the first point entered 
            LatLng cameraLatLng = new LatLng(cooridnatesList.get(0).getLat(),cooridnatesList.get(0).getLon());
            float cameraZoom = 10;

            if(savedInstanceState != null){
                mapType = savedInstanceState.getInt("map_type", GoogleMap.MAP_TYPE_SATELLITE);

                double savedLat = savedInstanceState.getDouble("lat");
                double savedLng = savedInstanceState.getDouble("lng");
                cameraLatLng = new LatLng(savedLat, savedLng);

                cameraZoom = savedInstanceState.getFloat("zoom",18);
            }

            // Setting the map type such as satellites or street view
            googleMap.setMapType(mapType);
            googleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(cameraLatLng, cameraZoom));


            //Displaying the land area
            final TextView landInformation = (TextView)findViewById(R.id.textViewLandInformation);
            double area = calculateArea(cooridnatesList);
            landInformation.setText(getString(R.string.land_area)+"\n"+Math.round(area)+" SQ.M");

        }

    }

解决方案

Try moving all code that references your GoogleMap to onStart() or onResume(). The map in a map fragment isn't instantiated until after the fragment has gone through onCreateView (link). Also, you need to check your googleMap for null, because if google play services aren't installed, or the map isn't available for some other reason, it will be null.

这篇关于为显示java.lang.NullPointerException谷歌地图API第2版的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆