无法加载安卓谷歌地图 V2

Posted

技术标签:

【中文标题】无法加载安卓谷歌地图 V2【英文标题】:Unable to load android Google Maps V2 【发布时间】:2013-04-30 00:25:45 【问题描述】:

我已经在我的应用程序中实现了 android Google maps V2,并且它在大多数设备(Galaxy Ace Plus、Galaxy 7inch Tab、Sony Xperia Z)上都能正常工作我测试。但它不适用于 HTC Desire。我已经交叉验证了该设备中也安装了 Google Play 服务。我花了很多时间寻找解决方案。下面是我的实现。

public class MainActivity extends FragmentActivity 

@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
        SupportMapFragment fragment = new SupportMapFragment();
        getSupportFragmentManager().beginTransaction()
                .add(android.R.id.content, fragment).commit();        


下面是activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:map="http://schemas.android.com/apk/res-auto"
android:id="@+id/the_map"
android:name="com.google.android.gms.maps.SupportMapFragment"
android:layout_
android:layout_
map:cameraTilt="45"
map:cameraZoom="2" />

这里是清单文件。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.raj.googlemapsv2test"
android:versionCode="1"
android:versionName="1.0" >

<permission
    android:name="com.raj.googlemapsv2test.permission.MAPS_RECEIVE"
    android:protectionLevel="signature" />

<uses-permission android:name="com.raj.googlemapsv2test.permission.MAPS_RECEIVE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

<uses-feature
    android:glEsVersion="0x00020000"
    android:required="true" />

<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="17" />

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <meta-data
        android:name="com.google.android.maps.v2.API_KEY"
        android:value="AIzaSyDD6bvUVkTk2UzOLpojdeBtlh5xBYDhy6E" />

    <activity
        android:name="com.raj.googlemapsv2test.MainActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

</manifest>

当我检查日志时,它显示以下错误行。

 Could not find class 'maps.i.k', referenced from method maps.z.ag.a
 Failed to load map.  Could not contact Google servers.
 Failed to load map.  Could not contact Google servers.

最后带着一点疑问,我更新了设备中的 goggle 地图应用程序,之后它就可以工作了。 因此,当任何设备发现此类问题时,我想向用户显示更新警报。但无法知道如何检查。那么任何人都可以提出一些方法来查找设备中的goggle maps appandroid goggle play services是否支持这个android Goggle Maps V2 与否。

我们将不胜感激任何解决方案。

【问题讨论】:

我在 HTC Desire 上遇到了类似的问题,除了我说“找不到类 'maps.af.k',引用自方法 maps.ag.an.a”。它还说它“无法解析 Lmaps/p/w 的超类;(734)”。像你说的那样更新谷歌地图应用并没有解决问题,我仍然看不到地图。 【参考方案1】:

您可以将此代码添加到您的 onResume 方法中。它会检查用户是否拥有 Google Play 服务的更新版本,如果没有,则会显示一个将他重定向到 Google Play 的弹出窗口。

@Override
protected void onResume() 
    super.onResume();
    int errorCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);
    if(errorCode != ConnectionResult.SUCCESS && GooglePlayServicesUtil.isUserRecoverableError(errorCode))
        Dialog d = GooglePlayServicesUtil.getErrorDialog(errorCode, this, 0, new OnCancelListener() 
            @Override
            public void onCancel(DialogInterface dialog) 
                //As my application does a heavy use of maps, if the user cancels the dialog, I just finish the FragmentActivity
                MainFragmentActivity.this.finish();
            
        );
        d.show();
    

希望对您有所帮助,干杯!

【讨论】:

【参考方案2】:
@Override
public void onActivityCreated(Bundle savedInstanceState) 
    super.onActivityCreated(savedInstanceState);
    FragmentManager fm = getChildFragmentManager();

    supportMapFragment = (SupportMapFragment) fm.findFragmentById(R.id.map);
    if (supportMapFragment == null) 
        supportMapFragment = SupportMapFragment.newInstance();
        fm.beginTransaction().replace(R.id.map, supportMapFragment).commit();
    

此时 google play 服务尚未初始化,因此请获取地图并在 onResume() 或 onStart() 中添加您想要的内容

   @Override
public void onResume() 
    super.onResume();
    if (gMap == null) 
        supportMapFragment.getMapAsync(this);
    

添加后你需要实现 OnMapReadyCallback。并用地图做任何你喜欢做的操作。

【讨论】:

以上是关于无法加载安卓谷歌地图 V2的主要内容,如果未能解决你的问题,请参考以下文章

刷新/重新加载地图:谷歌地图 API V2

如何修复“此页面无法正确加载谷歌地图”错误

无法在 laravel 应用程序上加载谷歌地图

无法将谷歌静态地图加载到jquery mobile中的div中

谷歌地图跨平台网址在“应用内导航”后无法在 Android 上加载路线

为啥我的浏览器上的谷歌地图一直在加载? (德尔福 XE6 和安卓)