【问题标题】:Android 6.0 app crash with error on google map nullAndroid 6.0 应用程序崩溃并在谷歌地图 null 上出现错误
【发布时间】:2016-07-18 20:13:05
【问题描述】:

我的应用程序使用带有地图片段和列表片段的滑动选项卡运行。 该应用程序在 API 4.3 到 5.1 的所有设备上都可以正常工作,但是当我在 API 6.0 的 Android 设备上运行时,我收到此错误:

java.lang.NullPointerException: Attempt to invoke virtual method 'com.google.android.gms.maps.GoogleMap com.google.android.gms.maps.SupportMapFragment.getMap()' on a null object reference

这是一个文件生成错误的sn-p代码:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    // Inflate the layout for this fragment
    v = inflater.inflate(R.layout.fragment_mappa, null, false);

    // To get City-Name from coordinates
    GPSTracker gpsTracker = new GPSTracker(getActivity());

    String cityName = null;
    Geocoder gcd = new Geocoder(getContext(), Locale.getDefault());
    List<Address> addresses = null;
    try {
        addresses = gcd.getFromLocation(gpsTracker.getLatitude(), gpsTracker.getLongitude(), 1);
        if (addresses.size() > 0) {
            System.out.println(addresses.get(0).getLocality());
            cityName = addresses.get(0).getLocality();
        }
        else {
            //gpsTracker.showSettingsAlert();
        }
        if (cityName == "Rome"){
            nome_citta = "Roma";
        }
        if (cityName == "Florence") {
            nome_citta = "Firenze";
        }
        if (cityName == "Valencia") {
            nome_citta = "Valence";
        }
        nome_citta = cityName;

    } catch (IOException e) {
        e.printStackTrace();

    }

    /*ImageButton b = (ImageButton) v.findViewById(R.id.refresh);
    b.setOnClickListener(new View.OnClickListener()
    {
        @Override
        public void onClick(View v)
        {
            getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new TabFragment()).commit();
        }
    });*/






    GPSTracker mGPS = new GPSTracker(getActivity());
    GPSService mGPSService = new GPSService(getActivity());
    Double la = mGPSService.getLatitude();
    /*mGPSService.getLocation();
    if (mGPS.canGetLocation()) {
        address = mGPSService.getLocationAddress();
        Log.d("Address","Adrress"+address);
    } else {
        mGPS.showSettingsAlert();
    }*/



    processMap(v,10);

    // map.setOnCameraChangeListener(getCameraChangeListener());

    mClusterManager = new ClusterManager<Car2GoClusterItem>(getActivity(), map);

    map.setOnCameraChangeListener(mClusterManager);
    map.setInfoWindowAdapter(mClusterManager.getMarkerManager());
    map.setOnMarkerClickListener(mClusterManager);

    mClusterManager.setOnClusterItemClickListener(new ClusterManager.OnClusterItemClickListener<Car2GoClusterItem>() {
        @Override
        public boolean onClusterItemClick(Car2GoClusterItem item) {
            clickedClusterItem = item;
            return false;
        }
    });

    //      map.setOnMarkerClickListener(mClusterManager);
    return v;



}

public GoogleMap.OnCameraChangeListener getCameraChangeListener()
{
    return new GoogleMap.OnCameraChangeListener()
    {
        @Override
        public void onCameraChange(CameraPosition position)
        {
            Log.d("Zoom", "Zoom: " + position.zoom);

            if(previousZoomLevel<=15 && position.zoom>15)
            {
                map.clear();
                processMap(v, 16);
            }

            if(previousZoomLevel>=15 && position.zoom<15)
            {
                map.clear();
                processMap(v, 14);
            }

            previousZoomLevel = position.zoom;
        }
    };
}

public void processMap(View v, int zoom) {
    if(map == null) {
        map = ((SupportMapFragment)getChildFragmentManager().findFragmentById(R.id.map)).getMap();

    }


    if(map != null){
     // othe code here ....................
    }

为什么我只在 Android 6 上出现此错误? 我该如何解决这个问题? 谢谢

如果我设置

 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    // Inflate the layout for this fragment
    v = inflater.inflate(R.layout.fragment_mappa, null, false);

    // To get City-Name from coordinates
    GPSTracker gpsTracker = new GPSTracker(getActivity());

    String cityName = null;
    Geocoder gcd = new Geocoder(getContext(), Locale.getDefault());
    List<Address> addresses = null;
    try {
        addresses = gcd.getFromLocation(gpsTracker.getLatitude(), gpsTracker.getLongitude(), 1);
        if (addresses.size() > 0) {
            System.out.println(addresses.get(0).getLocality());
            cityName = addresses.get(0).getLocality();
        }
        else {
            //gpsTracker.showSettingsAlert();
        }
        if (cityName == "Rome"){
            nome_citta = "Roma";
        }
        if (cityName == "Florence") {
            nome_citta = "Firenze";
        }
        if (cityName == "Valencia") {
            nome_citta = "Valence";
        }
        nome_citta = cityName;

    } catch (IOException e) {
        e.printStackTrace();

    }

    /*ImageButton b = (ImageButton) v.findViewById(R.id.refresh);
    b.setOnClickListener(new View.OnClickListener()
    {
        @Override
        public void onClick(View v)
        {
            getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new TabFragment()).commit();
        }
    });*/






    GPSTracker mGPS = new GPSTracker(getActivity());
    GPSService mGPSService = new GPSService(getActivity());
    Double la = mGPSService.getLatitude();
    /*mGPSService.getLocation();
    if (mGPS.canGetLocation()) {
        address = mGPSService.getLocationAddress();
        Log.d("Address","Adrress"+address);
    } else {
        mGPS.showSettingsAlert();
    }*/



    processMap(v,10);

    // map.setOnCameraChangeListener(getCameraChangeListener());

    mClusterManager = new ClusterManager<Car2GoClusterItem>(getActivity(), map);

    map.setOnCameraChangeListener(mClusterManager);
    map.setInfoWindowAdapter(mClusterManager.getMarkerManager());
    map.setOnMarkerClickListener(mClusterManager);

    mClusterManager.setOnClusterItemClickListener(new ClusterManager.OnClusterItemClickListener<Car2GoClusterItem>() {
        @Override
        public boolean onClusterItemClick(Car2GoClusterItem item) {
            clickedClusterItem = item;
            return false;
        }
    });

    //      map.setOnMarkerClickListener(mClusterManager);
    return v;



}

public GoogleMap.OnCameraChangeListener getCameraChangeListener()
{
    return new GoogleMap.OnCameraChangeListener()
    {
        @Override
        public void onCameraChange(CameraPosition position)
        {
            Log.d("Zoom", "Zoom: " + position.zoom);

            if(previousZoomLevel<=15 && position.zoom>15)
            {
                map.clear();
                processMap(v, 16);
            }

            if(previousZoomLevel>=15 && position.zoom<15)
            {
                map.clear();
                processMap(v, 14);
            }

            previousZoomLevel = position.zoom;
        }
    };
}

public void processMap(View v, int zoom) {


    if(map == null) {
        map = ((SupportMapFragment)getChildFragmentManager().findFragmentById(R.id.map)).getMapAsync(this);




    }


    if(map != null){
    }

并实现 OnMapReadyCallback 我在这一行有错误:

map = ((SupportMapFragment)getChildFragmentManager().findFragmentById(R.id.map)).getMapAsync(this);

错误 getMapAsync 返回 GoogleMap

【问题讨论】:

    标签: android google-maps


    【解决方案1】:

    getMap() 在 Android 6.0 中已弃用,请使用 getMapAsync()

    以前不推荐使用的 getMap() 函数在 Google Play 服务 SDK。 (它仍然可以在 Google 提供给 Android 设备的播放服务 APK。) getMap() 功能自 2014 年 12 月起已弃用。请参阅发布博客 发布从 getMap() 转换为 getMapAsync() 的帮助。

    更多信息在这里:

    https://developers.google.com/maps/documentation/android-api/releases

    改变这个:

    public void processMap(View v, int zoom) {
        if(map == null) {
            map = ((SupportMapFragment)getChildFragmentManager().findFragmentById(R.id.map)).getMap();
    
        }
    
    
        if(map != null){
         // othe code here ....................
        }
    

    为此:

    public void processMap(View v, int zoom) {
        if(map == null) {
            map = ((SupportMapFragment)getChildFragmentManager().findFragmentById(R.id.map)).getMapAsync(this);
    
        }
    
    
        if(map != null){
         // othe code here ....................
        }
    
    @Override
     public void onMapReady(GoogleMap map) {
         mMap = map;
         doStuff();
     }
    

    并实现OnMapReadyCallback

    更多信息在这里:

    http://googlegeodevelopers.blogspot.co.uk/2016/06/marker-zindex-and-more-come-to-google.html

    【讨论】:

    • 感谢您的帮助。我已经看到了 getMapAsync 但我有一个片段,如果我使用您的更改,在线上有关于 getMapAsync 的错误并且无法解析 doStuff() 方法
    • doStuff() 是一个模拟函数,根据您的功能进行更改
    猜你喜欢
    • 1970-01-01
    • 2012-11-27
    • 1970-01-01
    • 1970-01-01
    • 2020-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多