Я сталкиваюсь с этой ошибкой, когда использую Android Studio для создания своего приложения. APK скомпилирован, но когда я пытаюсь запустить приложение на эмуляторе Android P, оно вылетает и выдает следующую ошибку. Подробности смотрите в приложениях:
java.lang.NoClassDefFoundError:failed resolution of :Lorg/apache/http/ProtocolVersion

Это мой файл build.grade. Если у кого-нибудь есть предложение о том, в чем может быть проблема, я был бы признателен. Большое спасибо.
android {
compileSdkVersion 'android-P'
buildToolsVersion '28-rc1'
useLibrary 'org.apache.http.legacy'
//for Lambda
compileOptions {
targetCompatibility JavaVersion.VERSION_1_8
sourceCompatibility JavaVersion.VERSION_1_8
}
packagingOptions {
exclude 'META-INF/LICENSE'
exclude 'META-INF/NOTICE'
}
defaultConfig {
applicationId "xxx.xxx.xxx"
minSdkVersion 17
targetSdkVersion 27
versionCode xxxx
versionName "Vx.x.x"
multiDexEnabled true
//other setting required
ndk {
abiFilters 'armeabi', 'armeabi-v7a', 'armeabi-v8a', 'x86', 'x86_64', 'mips', 'mips64'
}
Также сообщается об отслеживании ошибок Android: https://issuetracker.google.com/issues/79478779
Обновление: это больше не ошибка или обходной путь, это необходимо, если ваше приложение нацелено на уровень API 28 (Android 9.0) или выше и использует SDK Google Maps для Android 16.0.0 или ниже (или если ваше приложение использует Apache HTTP Устаревшая библиотека). Теперь он включен в официальные документы. Общедоступная проблема была закрыто как предполагаемое поведение.
Это ошибка на стороне сервисов Google Play, пока он не будет исправлен, вы сможете найти обходной путь, добавив это в свой AndroidManifest.xml внутри тега <application>:
<uses-library android:name = "org.apache.http.legacy" android:required = "false" />
Это больше не обходное решение. Теперь это правильный путь developers.google.com/maps/documentation/android-sdk/…
@AdamK, Android 9 - это уровень API 28. = P (ошибка не на стороне сервера, а об изменении поведения P)
Кто-нибудь, не использующий карты, тоже сталкивался с этим?
Да, вы также можете столкнуться с этим, если используете библиотеку Apache HTTP Legacy (или одну из ваших зависимостей).
Я использую библиотеку Apache HTTP Legacy, и это меня просто спасло. Спасибо!
Проблема с Firebase все еще возникает? Я думаю, что у меня такая же проблема, но при использовании других служб Firebase, таких как Crashlytics
@androiddeveloper, возможно, это связано с GeoFire.
Получил ту же ошибку при использовании устаревшего Volley, который пытался получить доступ к DateUtils из apache. Это исправление сработало.
Я потратил час на то, чтобы понять это. Я даже пробовал сравнивать каждый файл со старым приложением (api27). Слава богу, я проглотил свое эго и начал искать здесь. Также большое спасибо Адаму и Кевину.
Работал как шарм. Спасибо!!
@RobinDijkhof, я использую рекламу Google, и у меня точно такая же проблема, и это исправило ее.
Но почему эта проблема возникает на некоторых устройствах, в частности, она вызывает сбой на Samsung, но отлично работает на Honor.
Отлично, спас мне день.Спасибо
Эта ссылка android-9.0-changes-28 -> Прекращение поддержки HTTP-клиента Apache объясняет причину добавления следующего в ваш AndroidManifest.xml:
<uses-library android:name = "org.apache.http.legacy" android:required = "false"/>
With Android 6.0, we removed support for the Apache HTTP client. Beginning with Android 9, that library is removed from the bootclasspath and is not available to apps by default.
Выполните любое из следующих действий:
1- Обновите библиотеку play-services-maps до последней версии:
com.google.android.gms:play-services-maps:16.1.0
2- Или включите следующее объявление в элемент <application>AndroidManifest.xml.
<uses-library
android:name = "org.apache.http.legacy"
android:required = "false" />
Опять же, это большой позор для разработчиков Android 9 и, конечно же, для Google. Я надеюсь, что они пересмотрят реализацию и поведение Android 9, так как в нем много ошибок. К сожалению, Google настаивает на том, чтобы называть эти ошибки изменениями поведения!
Если вы используете com.google.android.gms: play-services-maps: 16.0.0 или ниже и ваше приложение нацелено на уровень API 28 (Android 9.0) или выше, вы должны включить следующее объявление в элемент AndroidManifest. xml.
<uses-library
android:name = "org.apache.http.legacy"
android:required = "false" />
Это делается за вас, если вы используете com.google.android.gms: play-services-maps: 16.1.0, и в этом нет необходимости, если ваше приложение ориентировано на более низкий уровень API.
Чтобы полностью запустить org.apache.http.legacy в Android 9.0 Pie, создайте xml-файл res/xml/network_security_config.xml.
<?xml version = "1.0" encoding = "utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted = "true">
<trust-anchors>
<certificates src = "system" />
</trust-anchors>
</base-config>
</network-security-config>
И добавьте 2 тега тега в свой AndroidManifest.xml
android:networkSecurityConfig = "@xml/network_security_config" android:name = "org.apache.http.legacy"
<?xml version = "1.0" encoding = "utf-8"?>
<manifest......>
<application android:networkSecurityConfig = "@xml/network_security_config">
<activity..../>
......
......
<uses-library
android:name = "org.apache.http.legacy"
android:required = "false"/>
</application>
Также добавьте useLibrary 'org.apache.http.legacy' в Gradle сборки вашего приложения.
android {
compileSdkVersion 28
defaultConfig {
applicationId "your application id"
minSdkVersion 15
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
useLibrary 'org.apache.http.legacy'
}
Это похоже на то, что вам не следует делать, когда вы собираетесь запустить приложение для публики. Для разработки, возможно, это имеет смысл, но тогда он все равно не будет работать на производстве, поэтому в этом нет смысла.
Этот ответ должен быть принятым ответом, я пробовал много способов, но не работал. Хорошая работа @Gitesh
Согласно этот ТАК ответ, это происходит из-за ошибки AWS SDK, которая, похоже, решена в версии 2.6.30 SDK, поэтому обновление версии до более новой может помочь вам решить проблему.
Если вы используете Android 9.0 с устаревшим jar, вам нужно его использовать. в вашем файле mainfest.
<uses-library android:name = "org.apache.http.legacy" android:required = "false"/>
В react native у меня была ошибка: не показывать карты и закрывать приложение, запускать adb logcat и показывать ошибку в консоли:
java.lang.NoClassDefFoundError:failed resolution of :Lorg/apache/http/ProtocolVersion
исправить это, добавив в androidManifest.xml
<uses-library
android:name = "org.apache.http.legacy"
android:required = "false" />
Если вы используете com.google.android.gms:play-services-maps:16.0.0 или ниже, и ваше приложение нацелено на уровень API 28 (Android 9.0) или выше, вы должны включить следующее объявление в элемент AndroidManifest.xml
<uses-library
android:name = "org.apache.http.legacy"
android:required = "false" />
Проверьте эту ссылку - https://developers.google.com/maps/documentation/android-sdk/config#specify_requirement_for_apache_http_legacy_library
In your AndroidManifest.xml add this two-line.
android:usesCleartextTraffic = "true"
<uses-library android:name = "org.apache.http.legacy" android:required = "false"/>
See this below code
<application
android:allowBackup = "true"
android:icon = "@mipmap/ic_launcher"
android:label = "@string/app_name"
android:roundIcon = "@mipmap/ic_launcher"
android:supportsRtl = "true"
android:usesCleartextTraffic = "true"
android:theme = "@style/AppTheme"
tools:ignore = "AllowBackup,GoogleAppIndexingWarning">
<activity android:name = ".activity.SplashActivity">
<intent-filter>
<action android:name = "android.intent.action.MAIN" />
<category android:name = "android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<uses-library android:name = "org.apache.http.legacy" android:required = "false"/>
</application>
Это может быть поздний ответ. но я надеюсь, что это сэкономит кому-то время:
Если вы используете com.google.android.gms: play-services-maps: 16.0.0 или ниже, а ваше приложение целевой уровень API 28 (Android 9.0) или выше, вы должны включить следующее объявление в элемент AndroidManifest.xml
<application
...
...
android:usesCleartextTraffic = "true"
android:requestLegacyExternalStorage = "true">
<uses-library
android:name = "org.apache.http.legacy"
android:required = "false" />
</application>
Примечание: android:requestLegacyExternalStorage = "true" требуется для Android 10+ для доступа к хранилищу R / W
Android 6.0 представил атрибут useCleartextTraffic в элементе приложения в манифесте Android. Значение по умолчанию в Android P «ложный». Установка этого параметра на правда указывает, что приложение намеревается использовать чистый сетевой трафик.
Если ваше приложение отказывается от ограниченного хранилища при работе на Устройства Android 10, рекомендуется продолжить установку requestLegacyExternalStorage в true в файле манифеста вашего приложения. Таким образом, ваше приложение может продолжать вести себя должным образом на устройствах, на которых запущен Android 10.
И это также в документации developers.google.com/maps/documentation/android-sdk/…