Android MapView getMap()返回null

时间:2014-03-18 06:20:58

标签: android android-mapview google-maps-android-api-2

MapView的{​​{1}}方法可以返回null。我知道这是Google的预期行为。

有人可以提供关于何时以及在何种情况下getMap()方法返回null的明确的描述?

我知道如果给定设备上的Google服务不可用,getMap()将返回null。这种可能性相对较好地记录在案。我更关注模糊的其他情况,即使在设备上安装了Google服务,getMap()仍然可以返回null。

到目前为止,我的假设是底层地图系统有一些初始化,在此期间您的代码可能会执行并获得一个空地图。

我的假设是否正确?

在Activity或Fragment生命周期中是否有任何特定位置我们可以明确地获得非空getMap()(如果我们假设安装了Google Services IS)?

我提出这个问题的目的是防止在我的代码中散布一连串GoogleMap个问题。此外,这个问题似乎仍然在StackOverflow上定期出现,我想看看我们是否可以充实了if(mapView.getMap() != null)MapView <背后的真相。 / p>

3 个答案:

答案 0 :(得分:13)

由Google处理的方案 如果没有安装google play apk,您将获得null。但它以某种方式内置于从Playstore下载它。但是可能没有安装Playstore,因此您获得了一个空映射。如果互联网不可用并且安装了Play商店,但谷歌播放服务不是你的,因为无法安装谷歌播放服务。但是为你完成了这些senarios的编码。

您的代码处理的方案。 这是你必须编写的代码。如果您偏离地图样本中列出的模式,您将获得一个空地图。每个样本都以同样的方式完成。如果onCreate中的第一次调用失败,那么仍然有第二次机会在onResume中获取地图。您的解决方案是仅在一个地方调用getMap()并保存返回的地图对象。遵循地图样本使用的基本模式。在onCreateonResume方法中,您调用setupmapifneeded,当地图对象不为空时,会调用setupmap

这是第一张地图样本。

/*
 * Copyright (C) 2012 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.gosylvester.testapp;


import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;

import android.os.Bundle;
import android.support.v4.app.FragmentActivity;

/**
 * This shows how to create a simple activity with a map and a marker on the map.
 * <p>
 * Notice how we deal with the possibility that the Google Play services APK is not
 * installed/enabled/updated on a user's device.
 */
public class BasicMapActivity extends FragmentActivity {
    /**
     * Note that this may be null if the Google Play services APK is not available.
     */
    private GoogleMap mMap;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.basic_demo);
        setUpMapIfNeeded();
    }

    @Override
    protected void onResume() {
        super.onResume();
        setUpMapIfNeeded();
    }

    /**
     * Sets up the map if it is possible to do so (i.e., the Google Play services APK is correctly
     * installed) and the map has not already been instantiated.. This will ensure that we only ever
     * call {@link #setUpMap()} once when {@link #mMap} is not null.
     * <p>
     * If it isn't installed {@link SupportMapFragment} (and
     * {@link com.google.android.gms.maps.MapView MapView}) will show a prompt for the user to
     * install/update the Google Play services APK on their device.
     * <p>
     * A user can return to this FragmentActivity after following the prompt and correctly
     * installing/updating/enabling the Google Play services. Since the FragmentActivity may not have been
     * completely destroyed during this process (it is likely that it would only be stopped or
     * paused), {@link #onCreate(Bundle)} may not be called again so we should call this method in
     * {@link #onResume()} to guarantee that it will be called.
     */
    private void setUpMapIfNeeded() {
        // Do a null check to confirm that we have not already instantiated the map.
        if (mMap == null) {
            // Try to obtain the map from the SupportMapFragment.
            mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map))
                    .getMap();
            // Check if we were successful in obtaining the map.
            if (mMap != null) {
                setUpMap();
            }
        }
    }

    /**
     * This is where we can add markers or lines, add listeners or move the camera. In this case, we
     * just add a marker near Africa.
     * <p>
     * This should only be called once and when we are sure that {@link #mMap} is not null.
     */
    private void setUpMap() {
        mMap.addMarker(new MarkerOptions().position(new LatLng(0, 0)).title("Marker"));
    }
}

答案 1 :(得分:7)

Google使用以下方法更方便地获取地图,因为它可能依赖于从设备到设备来准备地图! 使用以下方法在准备就绪时获取地图。

myMapFragment.getMapAsync(new OnMapReadyCallback) {
     @Override
     public void onMapReady(GoogleMap googleMap) {
         myMap = googleMap;
     }
});

答案 2 :(得分:0)

我有Android Tab3运行Android 4.2.2 我所要做的就是更新谷歌地图,它就是诀窍。