web-dev-qa-db-ja.com

NoSuchFieldError:Play Services 6.5でMapFragmentを使用する場合、タイプの静的フィールドMapAttrsはありません

多分私はここに何かが足りないのですが、Play Services 6.5で新しいマップのみの依存関係を使用できません

次の例外が発生します。

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)

マニフェスト:

<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を使用したくない

34
Philipp E.

SDK Managerを使用してGoogleリポジトリをバージョン15に更新すると、問題が解決し、回避策の必要性がなくなります。プロジェクトのクリーンアップが必要です。

Android SDK

これは issue 7432 にも記載されています。

17
PaulR

暫定ソリューション

xmlマップフラグメントをFrameLayoutコンテナに置き換えます

<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"/>-->

コードでフラグメントを作成し、コンテナを置き換えます

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'で行われたので、ライフサイクルとロジックにトランザクションを適合させるようにしてください。

5
ibit

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')
            }
        }
    }
}
4
pablisco

ライブラリとモジュールの両方に同じ名前のレイアウトがあるか、リソースIDが重複している複数のxmlレイアウトを膨らませていると思います。

play-services-libでmap_attrsを見つけて、このコードに置き換えます:

<?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>
1
Adnan

最後に原因を突き止めました。自分のEclipseの利点のためにaarファイルを誘拐する癖がある場合(Android Studioの方法)ではないので、ここではその方法を説明しません)、maps_attrs.xmlファイル(play-services-base res/valuesフォルダー)。これにより、属性と生成されたR.classファイルがマップライブラリが期待するクラスパスに配置されます。

Sample use of play-services-base

0
Pier Betos