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>
答案 0 :(得分:13)
由Google处理的方案 如果没有安装google play apk,您将获得null。但它以某种方式内置于从Playstore下载它。但是可能没有安装Playstore,因此您获得了一个空映射。如果互联网不可用并且安装了Play商店,但谷歌播放服务不是你的,因为无法安装谷歌播放服务。但是为你完成了这些senarios的编码。
您的代码处理的方案。
这是你必须编写的代码。如果您偏离地图样本中列出的模式,您将获得一个空地图。每个样本都以同样的方式完成。如果onCreate中的第一次调用失败,那么仍然有第二次机会在onResume中获取地图。您的解决方案是仅在一个地方调用getMap()
并保存返回的地图对象。遵循地图样本使用的基本模式。在onCreate
和onResume
方法中,您调用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 我所要做的就是更新谷歌地图,它就是诀窍。