NoSuchFieldError:在Play Services 6.5中使用MapFragment时没有静态字段的MapAttrstypes

也许我错过了一些东西,但是我无法在Play Services 6.5中使用新的仅支持Google Maps的依赖关系

我得到以下例外:

java.lang.NoSuchFieldError: No static field MapAttrs of type [I in class Lcom/google/android/gms/R$styleable; or its superclasses (declaration of 'com.google.android.gms.R$styleable' appears in /data/app/com.kaching.merchant.dev1-1/base.apk) at com.google.android.gms.maps.GoogleMapOptions .createFromAttributes(Unknown Source) at com.google.android.gms.maps.SupportMapFragment .onInflate(Unknown Source) 

performance:

 <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" /> <meta-data android:name="com.google.android.maps.v2.API_KEY" android:value="my-awesome-key"/> <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/> 

Gradle文件:

 compile 'com.google.android.gms:play-services-maps:6.5.+' compile 'com.android.support:support-v4:21.0.2' 

布局:

 <fragment android:id="@+id/map" android:name="com.google.android.gms.maps.MapFragment" android:layout_width="match_parent" android:layout_height="match_parent"/> 

这是打破了还是我做错了什么?

完整的捆绑推动了我的dex限制,我宁愿不使用multidex

通过SDKpipe理器将您的Google资源库更新到版本15应该可以解决问题并消除变通方法的需求。 项目干净是必需的。

Android SDK

这也在问题7432中提到。

临时解决scheme

用FrameLayout容器replacexml映射片段

 <FrameLayout android:id="@+id/map_container" android:layout_weight="2" android:layout_width="match_parent" android:layout_height="0dp" /> <!--<fragment android:id="@+id/map"--> <!--android:layout_weight="2"--> <!--android:layout_width="match_parent"--> <!--android:layout_height="0dp"--> <!--android:name="com.google.android.gms.maps.SupportMapFragment"/>--> 

在代码中创build片段并replace容器

 SupportMapFragment supportMapFragment = SupportMapFragment.newInstance(); getSupportFragmentManager().beginTransaction().replace(R.id.map_container,supportMapFragment).commit(); //this you should do anyway supportMapFragment.getMapAsync(new OnMapReadyCallback() { @Override public void onMapReady(GoogleMap googleMap) { //setup map - optional UiSettings settings = googleMap.getUiSettings(); settings.setCompassEnabled(false); settings.setZoomControlsEnabled(false); settings.setAllGesturesEnabled(true); settings.setMyLocationButtonEnabled(true); } }); 

请注意,以上是在'onCreate'中完成的一个没有任何其他片段的活动,所以确保您将交易适应您的生命周期和逻辑。

我发现了一个“hacky”修复程序,使其能够与您的应用程序一起工作,直到Google决定解决这个问题:

将此添加到您的app gradle脚本中:

 afterEvaluate { def pattern = ~/process(.*)Resources/ tasks.matching { pattern.matcher(it.name).find() }.each { def matcher = pattern.matcher(it.name) matcher.find() def buildType = matcher.group(1) buildType = buildType.substring(0, 1).toLowerCase() + buildType.substring(1) def rDirectory = "$project.buildDir/generated/source/r/$buildType" it << { def badFile = file("$rDirectory/com/google/android/gms/R.java") def goodFile = file("$rDirectory/com/google/android/gms/maps/R.java") if (badFile.exists() && goodFile.exists()) { badFile.text = goodFile.text.replaceAll('com.google.android.gms.maps', 'com.google.android.gms') } } } } 

我认为你有相同名称的库和模块的布局,或者使用重复的资源ID膨胀多个XML布局。

在play-services-lib中查找map_attrs并用下面的代码replace:

 <?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="MapAttrs"> <attr name="mapType" format="enum"> <enum name="none" value="0"/> <enum name="normal" value="1"/> <enum name="satellite" value="2"/> <enum name="terrain" value="3"/> <enum name="hybrid" value="4"/> </attr> <attr name="cameraBearing" format="float"/> <attr name="cameraTargetLat" format="float"/> <attr name="cameraTargetLng" format="float"/> <attr name="cameraTilt" format="float"/> <attr name="cameraZoom" format="float"/> <attr name="liteMode" format="boolean"/> <attr name="uiCompass" format="boolean"/> <attr name="uiRotateGestures" format="boolean"/> <attr name="uiScrollGestures" format="boolean"/> <attr name="uiTiltGestures" format="boolean"/> <attr name="uiZoomControls" format="boolean"/> <attr name="uiZoomGestures" format="boolean"/> <attr name="useViewLifecycle" format="boolean"/> <attr name="zOrderOnTop" format="boolean"/> <attr name="uiMapToolbar" format="boolean"/> <attr name="ambientEnabled" format="boolean"/> </declare-styleable> </resources> 

最后我找出原因。 如果你习惯于为自己的Eclipse获益绑架aar文件(我不会教这里,因为它不是Android Studio的方式),你需要将maps_attrs.xml文件移动到play-services-base res / values文件夹。 这将alignment地图库期望的类path上的属性和生成的R.class文件。

使用play-services-base的例子