Android MapView getMap()返回null

MapViewgetMap()方法可以返回null。 我知道这是Google的预期行为。


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



在活动或片段生命周期中,我们是否可以明确地获得非空的GoogleMap (如果我们假设安装了Google Services),是否有任何特殊的地方?

我问这个问题的目的是为了防止if(mapView.getMap() != null)乱七八糟的检查遍布我的代码。 另外,这个问题在StackOverflow中似乎还是经常出现,我想看看是否可以getMap() MapViewgetMap()

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

由您的代码处理场景。 这是你必须编码的。 如果您偏离地图样本中列出的模式,您将会看到空白地图。 每个样品都以同样的方式进行。 如果onCreate中的第一个调用失败,那么仍然有第二次机会在onResume中获取地图。 您的解决scheme是只在一个地方调用getMap() ,并保存返回的地图对象。 遵循地图样本使用的基本模式。 在onCreateonResume方法中,您调用setupmapifneeded ,当地图对象不为null时,它会调用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 * * * * 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; import; import; import; import android.os.Bundle; import; /** * 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 (ie, 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 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( .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")); } } 

Google使用以下方法获得地图的方法更为方便,因为它可能取决于设备和设备以准备好地图! 准备就绪后,使用以下方法获取地图。

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

我有一个Android的Tab3运行Android 4.2.2所有我只需要更新谷歌地图,它的伎俩。