【问题标题】:Android Maps API requires openGL es 2Android 地图 API 需要 openGL es 2
【发布时间】:2012-12-05 00:38:47
【问题描述】:

地图 v2 文档指出:

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

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

这会通知外部服务 要求。特别是具有阻止谷歌的作用 Play 商店不会在不支持的设备上显示您的应用 OpenGL ES 版本 2。

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

那我该怎么做呢?是否必须是多个APKs 和不同的manifests

【问题讨论】:

  • 只是 android:required="false"。那么它不应该被过滤。
  • android:required="false" 在 Nexus S 4.1.2 上产生 12-05 22:18:31.484: E/AndroidRuntime(9618): Caused by: java.lang.RuntimeException: Google Maps Android API only supports OpenGL ES 2.0 andabove. Please add &lt;uses-feature android:glEsVersion="0x00020000" android:required="true" /&gt; into AndroidManifest.xml
  • 同样的问题,如果我从清单中删除要求(或设置 required="false"),MapFragment 会在支持 OpenGL ES 2.0 的设备上引发异常。就好像 MapFragment 是在 Activity 服务配置中寻找需求,而不是检查设备本身是否支持 OpenGL ES 2.0。

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


【解决方案1】:

最终更新

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

更新

从 Google Play 服务 SDK 插件的第 7 版开始,此问题已得到修复。使用&lt;uses-feature android:glEsVersion="0x00020000" android:required="false"/&gt;detect OpenGL ES 2.0 at runtime 是安全的。

原答案

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

在特定设备 (Motorola 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;

但是,当清单中没有 &lt;uses-feature&gt; 声明时,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 体验还是回退到另一个兼容的解决方案。

【讨论】:

【解决方案2】:

issue #4699 中所述,此问题已得到修复,并将与下一版 Android 地图 API 一起发布

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多