Ответ 1
Обновление вашего репозитория Google до версии 15
с помощью диспетчера SDK должно решить проблемы и устранить потребности в обходных решениях. Требуется очистить проект.
Это также упоминается в issue 7432.
Возможно, что-то здесь отсутствует, но я не могу использовать новую зависимость только для Карт в 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
Обновление вашего репозитория Google до версии 15
с помощью диспетчера SDK должно решить проблемы и устранить потребности в обходных решениях. Требуется очистить проект.
Это также упоминается в issue 7432.
Временное решение
замените фрагмент карты 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 в действии без каких-либо других фрагментов, поэтому убедитесь, что вы адаптируете транзакцию к вашему жизненному циклу и логике.
Я нашел "хакерское" исправление, чтобы заставить его работать с вашим приложением, пока Google не решит это:
Добавьте это в свой app
gradle script:
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')
}
}
}
}
Я думаю, что у вас есть макет в библиотеке и модуле с тем же именем или раздувание нескольких 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>