Android Googleマップjava.lang.NoClassDefFoundError:の解決に失敗:Lorg / apache / http / ProtocolVersion


208

GoogleマップAndroid SDK 11.6.2を使用しています(15.0.1も試しました)が、マップが表示される前にクラッシュします。マニフェストでAPIキーを既に確認しましたが、利用可能ですが、この問題は引き続き発生します。targetSDkのバージョンを28にしていますが、この問題が発生しますか?

java.lang.NoClassDefFoundError: Failed resolution of: Lorg/apache/http/ProtocolVersion;
        at el.b(:com.google.android.gms.dynamite_mapsdynamite@12848063@12.8.48 (100408-196123505):3)
        at ek.a(:com.google.android.gms.dynamite_mapsdynamite@12848063@12.8.48 (100408-196123505):4)
        at em.a(:com.google.android.gms.dynamite_mapsdynamite@12848063@12.8.48 (100408-196123505):51)
        at com.google.maps.api.android.lib6.drd.ap.a(:com.google.android.gms.dynamite_mapsdynamite@12848063@12.8.48 (100408-196123505):11)
        at dw.a(:com.google.android.gms.dynamite_mapsdynamite@12848063@12.8.48 (100408-196123505):16)
        at dw.run(:com.google.android.gms.dynamite_mapsdynamite@12848063@12.8.48 (100408-196123505):61)
     Caused by: java.lang.ClassNotFoundException: Didn't find class "org.apache.http.ProtocolVersion" on path: DexPathList[[zip file "/system/priv-app/PrebuiltGmsCorePi/app_chimera/m/MapsDynamite.apk"],nativeLibraryDirectories=[/data/user_de/0/com.google.android.gms/app_chimera/m/00000036/MapsDynamite.apk!/lib/armeabi-v7a, /data/user_de/0/com.google.android.gms/app_chimera/m/00000036/MapsDynamite.apk!/lib/armeabi, /system/lib]]
        at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:126)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
        at ad.loadClass(:com.google.android.gms.dynamite_dynamiteloader@12848063@12.8.48 (100408-196123505):25)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
        at el.b(:com.google.android.gms.dynamite_mapsdynamite@12848063@12.8.48 (100408-196123505):3) 
        at ek.a(:com.google.android.gms.dynamite_mapsdynamite@12848063@12.8.48 (100408-196123505):4) 
        at em.a(:com.google.android.gms.dynamite_mapsdynamite@12848063@12.8.48 (100408-196123505):51) 
        at com.google.maps.api.android.lib6.drd.ap.a(:com.google.android.gms.dynamite_mapsdynamite@12848063@12.8.48 (100408-196123505):11) 
        at dw.a(:com.google.android.gms.dynamite_mapsdynamite@12848063@12.8.48 (100408-196123505):16) 
        at dw.run(:com.google.android.gms.dynamite_mapsdynamite@12848063@12.8.48 (100408-196123505):61) 

defaultConfigですでにmultiDexEnabledがtrueになっている
Ramprasad

6
この問題はAndroid Pで発生します... Android 5で
正常に機能します

1
それが唯一のAndroid Pベータ2で発生し、これも手に入れた
ハム

私もこのエラーを受け取りました。Android Studioとそのエミュレーターを使用する。
frankliuao 2018

15
APIレベル28(Android 9.0)でこのエラーが発生した場合、Googleマップのドキュメントに、必要なマニフェストエントリが記載されています。
ボブスナイダー、

回答:


496

これをマニフェスト<application>タグに入れます。

<uses-library android:name="org.apache.http.legacy" android:required="false"/>

詳細:https : //issuetracker.google.com/issues/79478779


9
これで問題は解決しました。ただし、これが必要な理由はよくわかりません。MapsActivity私は、すべての定期的な...と思われた使用
frankliuao

8
Android 9.0はすでにリリースされており、Googleはまだマップライブラリを修正していません。また、このライブラリが必要であることも文書化されていません。非常に貧弱な開発サポート。
headsvk 2018年

41
Googleはそれを文書化している@headsvk、以下を参照してくださいdevelopers.google.com/maps/documentation/android-sdk/...を
ハム

それでも、Apache HTTPクライアントのサポートはAndroid 6以降削除されています:https
//developer.android.com/about/versions/marshmallow/android-6.0-changes#behavior-apache-http-client

これjava.lang.NoClassDefFoundError: Failed resolution of: Lorg/apache/http/message/BasicNameValuePair;は、AndroidXに切り替えた後にも修正されました(その後の65Kメソッドの制限の増加)
Someone Somewhere

41

これにより、クラッシュが解決されます。これをマニフェストに適用します

 <application
             ...
             >
             ...
          <uses-library android:name="org.apache.http.legacy" 
           android:required="false"/>
             ...


<application/>

1
何がandroid:usesCleartextTraffic="true"いいの?他の回答はこの行に言及していません。オプションですか?
TimoBähr、

1
@TimoBährそれは答えの一部ではありません。答えはハムの内容です。ニッキーの答えは、この行をアプリケーションタグ内に挿入する必要があることを明確に示しています。
batmaci

@TimoBährは、android:usesCleartextTraffic="true"後で取得することになる問題でもあります。これは、セキュリティ上の目的のためです。
レスターL.

@ Lester.L宣言するandroid:usesCleartextTraffic=”true”と、平文のhttpリンクとの通信が可能になります。これが現状です。したがって、私が理解している限りandroid:usesCleartextTraffic=”false”、アプリはより「安全」になります。私が間違っていたら訂正してください。
TimoBähr19年

1
削除しました。それはそれ自体とは何の関係もないので、誰かがコピーして貼り付けると、セキュリティ違反が発生する可能性があります。
JerabekJakub

16

次の解決策のいずれかを実行します。

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

:どちらのソリューションは、このGoogleドキュメントでサポートされていdevelopers.google.com/maps/documentation/android-sdk/...
アンディ・

9

アプリがAPIレベル28(Android 9.0)以上を対象としている場合は、<application>AndroidManifest.xml の要素内に次の宣言を含める必要があります。

 <uses-library
       android:name="org.apache.http.legacy"
  android:required="false" />


0

これがAndroid 8.0以降で発生する場合は、この行をマニフェストアプリケーションタグに挿入します。

<uses-library android:name="org.apache.http.legacy" android:required="false"/>

0

設定:

multiDexEnabled true

このような:

android {
    compileSdkVersion 28
    defaultConfig {

        multiDexEnabled true

    }
    buildTypes {
        release {

        }
    }
}

0

マニフェストファイルに権限を追加する

`<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION."/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.INTERNET"/>`

一部にはこのコード行を入れます

` <uses-library android:name="org.apache.http.legacy" android:required="false"/>`

同じ問題があり、これで修正されました。


0

これが解決策です

<uses-library android:name="org.apache.http.legacy" android:required="false" />

この行を<application>タグ内のMenifest.xmlに追加します

詳しくは


0

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>

そして、AndroidManifest.xmlに2つのタグタグを追加します

<?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'を追加します

defaultConfig {
        applicationId "com.ascorb"
        minSdkVersion 19
        targetSdkVersion 28
        versionCode 6
        versionName "1.2"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        useLibrary 'org.apache.http.legacy'
    }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.