36

Maps v2 文档指出:

由于 Google Maps Android API 版本 2 需要 OpenGL ES 版本 2,因此您必须在 AndroidManifest.xml中添加一个<uses-feature>元素作为该元素的子 元素:manifest

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

这会将要求通知外部服务。特别是,它会阻止 Google Play 商店在不支持 OpenGL ES 版本 2 的设备上显示您的应用程序。

事实上,exception如果这不在清单中,它会抛出一个。我不想在商店中过滤我的应用程序,我计划继续将旧地图用于旧设备,并且仅在存在所需功能时才显示新地图,在运行时而不是在安装之前检测到。

那么我该怎么做呢?它必须是类似 multipleAPKs的东西manifests吗?

4

3 回答 3

36

最终更新

截至 2013 年 12 月 20 日,Android 仪表板显示大约 100% 的设备现在支持 OpenGL 2.0+,因此这个答案不再相关。您可能只需要在清单中使用 OpenGL ES 2.0+。

更新

从 Google Play 服务 SDK 插件的第 7 版开始,此问题已得到修复。在运行时使用<uses-feature android:glEsVersion="0x00020000" android:required="false"/>检测 OpenGL ES 2.0是安全的。

原始答案

Google Maps Android API v2 似乎需要明确<uses-feature android:glEsVersion="0x00020000" android:required="true/>声明,AndroidManifest.xml因此无法在不排除所有 OpenGL ES 1.x 设备的情况下部署 Google Maps Android API v2 服务。在撰写本文时,Google 的 Android Dashboard显示,在 1.1 和 2.0 设备中,90.8% 的设备支持 2.0。

在特定设备(摩托罗拉 XOOM)上,此代码导致supportsEs2 = true

// Check if the system supports OpenGL ES 2.0.
final ActivityManager activityManager = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
final ConfigurationInfo configurationInfo = activityManager.getDeviceConfigurationInfo();
final boolean supportsEs2 = configurationInfo.reqGlEsVersion >= 0x20000;

但是,当清单中没有<uses-feature>声明时,MapFragment 会抛出 RuntimeException:

    Caused by: java.lang.RuntimeException: Google Maps Android API only supports OpenGL ES 2.0 andabove. Please add <uses-feature android:glEsVersion="0x00020000" android:required="true" /> into AndroidManifest.xml
    at maps.y.ae.a(Unknown Source)
    at maps.y.bu.a(Unknown Source)
    at maps.y.p.onCreateView(Unknown Source)
    at com.google.android.gms.maps.internal.IMapFragmentDelegate$Stub.onTransact(IMapFragmentDelegate.java:107)
    at android.os.Binder.transact(Binder.java:297)
    at com.google.android.gms.maps.internal.IMapFragmentDelegate$a$a.onCreateView(Unknown Source)
    at com.google.android.gms.maps.SupportMapFragment$a.onCreateView(Unknown Source)
    at com.google.android.gms.internal.c$4.a(Unknown Source)
    at com.google.android.gms.internal.c.a(Unknown Source)
    at com.google.android.gms.internal.c.onCreateView(Unknown Source)
    at com.google.android.gms.maps.SupportMapFragment.onCreateView(Unknown Source)
    at android.support.v4.app.Fragment.performCreateView(Fragment.java:1460)
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:884)
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1066)
    at android.support.v4.app.FragmentManagerImpl.addFragment(FragmentManager.java:1168)
    at android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:280)
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:669)
    ... 22 more

希望地图库的更新能够消除此限制,以便我们可以部署单个 APK 并使用运行时 API 来确定是加载新的 Google Maps v2 体验还是回退到另一个兼容的解决方案。

于 2012-12-05T17:42:31.723 回答
2

如问题 #4699中所述,此问题已修复,并将与 Maps Android API 的下一版本一起发布

于 2013-02-01T10:27:13.700 回答
1

我遇到了同样的问题,环顾四周,模拟器的大多数建议解决方法都对我不起作用。然后我发现一个帖子建议使用Genymotion模拟器。此模拟器支持 OpenGL ES 版本 2。它也比标准模拟器快得多。

于 2013-08-21T11:31:18.687 回答