NoSuchFieldError: Няма статично поле MapAttrs от тип при използване на MapFragment с Play Services 6.5

Може би пропускам нещо тук, но не мога да използвам новата зависимост само за Карти в 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


person Philipp E.    schedule 09.12.2014    source източник
comment
Все още се опитвам да разбера защо се случва това, но предлагам да включите целия пакет gms вместо само play-services-maps   -  person Pedro Oliveira    schedule 09.12.2014
comment
@PedroOliveira Връзките за зависимост в основния пакет, така че няма нужда   -  person pablisco    schedule 09.12.2014
comment
проблемът е com.google.android.gms.R$styleable.MapAttrs, но генерираният R файл за карти има различен пакет com.google.android.gms.maps.R$styleable.MapAttrs изглежда като грешка с тези версии на granualr зависи и както е сега Selectively compiling APIs не може да се използва ...   -  person Selvin    schedule 09.12.2014
comment
Решението от @PedroOliveira работи за мен, но все пак надхвърля смисъла на новата структура...   -  person Joris    schedule 09.12.2014
comment
Успях да го накарам да работи (apk размер: maps+base 1,9 MB цял gms: 2,5MB) ... стъпки: 1. копирайте карти и базови aar файлове в папката libs на проекта 2. добавете зависимост към em в gradle вместо oryginal 3. модифицирайте пакета вътре в AndroidManifest.xml вътре maps.aar (премахнете: .maps) 4. дезактивирайте enforceUniquePackageName (задайте го на false) ... с други думи: не си струва времето ... трябва да изчакай гугъл да го оправи   -  person Selvin    schedule 09.12.2014
comment
Добре, значи това всъщност е счупено. Озадачен съм, че очевидно никой в ​​Google не се е сетил да тества това, преди да го пусне.   -  person Philipp E.    schedule 09.12.2014
comment
добре, направих доклад за грешка: code.google.com/ p/android/issues/   -  person Selvin    schedule 09.12.2014
comment
Можете да създадете екземпляр на MapFragment и да го добавите към контейнер в транзакция на фрагмент. Работи за мен, но имам проста карта с почти никаква логика в приложението си.   -  person ibit    schedule 09.12.2014
comment
@Selvin има и доклад за грешка от вчера: код. google.com/p/gmaps-api-issues/issues/detail?id=7432 Означих и двете със звезда, защото вашият съдържа повече подробности   -  person Michał Klimczak    schedule 09.12.2014
comment
@ibit благодаря, това работи за мен, поне засега. Ако добавите това като отговор, ще го приема.   -  person Philipp E.    schedule 09.12.2014
comment
За бъдещите читатели също изглежда само, че раздуването на фрагмент от карта (или изглед на карта, както е в моя случай) от xml причинява този проблем. Ако инстанциирате фрагмента (или изгледа) в кода, всичко е наред.   -  person krishan711    schedule 09.12.2014


Отговори (5)


Актуализирането на вашето Google Repository до версия 15 чрез SDK Manager трябва да разреши проблемите и да елиминира необходимостта от заобиколни решения. Изисква се чист проект.

Android SDK

Това също се споменава в проблем 7432.

person PaulR    schedule 10.12.2014
comment
Проблемът ми беше причинен от: java.lang.NoSuchFieldError: com.google.android.gms.R$styleable.AdsAttrs и това беше решено. Благодаря - person magirtopcu; 16.02.2015
comment
gradle clean, след това gradle build се изискваше за мен, след като актуализирах Google Repository. Мисля, че когато импортирате нови зависимости или актуализирате, Android Studio има тенденция да изостава малко в намирането на ресурсите правилно. - person Chris Cirefice; 11.06.2015
comment
Разработвам на платформа xamarin и имах същия проблем. Разтворът за почистване е разрешил моя проблем. - person ddagsan; 24.04.2016

Временно решение

заменете фрагмента на 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“ в дейност без никакви други фрагменти, така че се уверете, че адаптирате транзакцията към вашия жизнен цикъл и логика.

person ibit    schedule 09.12.2014
comment
О, човече, този OnMapReadyCallback, нищо чудно, че продължавах да получавам нула за картата. - person Bri6ko; 10.12.2014

Намерих „хакерска“ корекция, за да го накарам да работи с вашето приложение, докато 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')
            }
        }
    }
}
person pablisco    schedule 09.12.2014
comment
Имайте предвид, че това е ужасна корекция, която няма да се мащабира, ако използвате повече от една подбиблиотеки play-services-*. Ще отстраним проблема както трябва. - person Xavier Ducrohet; 09.12.2014
comment
@XavierDucrohet: Да! обединяването им би било прекалено. Представях си, че ще работиш по него... Но е удивително да видя, че си на лов. Бях твърде развълнуван и исках да опитам новите ви библиотеки, хехе. Не беше предназначено за окончателна корекция :) - person pablisco; 09.12.2014
comment
не работи за мен. Трябва ли да направя нещо друго? - person Philipp E.; 10.12.2014
comment
@PhilippE.: Поставяте ли го в app gradle, а не в project gradle? - person pablisco; 10.12.2014
comment
app gradle, под блока android - person Philipp E.; 10.12.2014
comment
Благодарение на вашето предложение успях да поставя xml файла правилно, когато го правех на Eclipse. Отговорът е по-долу. - person Pier Betos; 11.09.2015

Мисля, че имате оформление както в библиотека, така и в модул с едно и също име или надуване на множество xml оформление с дублиран идентификатор на ресурс.

Намерете map_attrs в play-services-lib и заменете с този код:

<?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>
person Adnan    schedule 01.04.2016
comment
Благодаря, вашият отговор също реши проблема ми :) Мисля, че имате оформление както в библиотеката, така и в модула с едно и също име или надуване на множество xml оформление с дублиран идентификатор на ресурс. - person Smit.Satodia; 23.06.2016

Най-накрая разбрах причината. Ако имате навика да отвличате aar файловете за собствената си полза на Eclipse (няма да уча тук как, защото това не е начинът на Android Studio), трябва да преместите файла maps_attrs.xml в папката play-services-base res/values. Това ще подравни атрибутите и генерирания R.class файл по пътя на класа, който библиотеката с карти очаква.

Примерно използване на play-services-base

person Pier Betos    schedule 11.09.2015