5

デバッグモードで開発してMyContentProvider実行すると正常に動作するアプリがあります。

<provider android:name=".MyContentProvider"
        android:authorities="com.contactcities"
        android:exported="false">
</provider>

しかし、アプリをエクスポートしてダウンロードして実行すると、すぐにクラッシュします:

10-10 18:24:37.682 E/AndroidRuntime(10428): FATAL EXCEPTION: main
10-10 18:24:37.682 E/AndroidRuntime(10428): java.lang.RuntimeException: Unable to get provider com.contactcities.MyContentProvider: java.lang.ClassNotFoundException: com.contactcities.MyContentProvider in loader dalvik.system.PathClassLoader[/system/framework/com.google.android.maps.jar:/data/app/com.contactcities-1.apk]
10-10 18:24:37.682 E/AndroidRuntime(10428): at android.app.ActivityThread.installProvider(ActivityThread.java:4509)
10-10 18:24:37.682 E/AndroidRuntime(10428): at android.app.ActivityThread.installContentProviders(ActivityThread.java:4281)
10-10 18:24:37.682 E/AndroidRuntime(10428): at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4237)
10-10 18:24:37.682 E/AndroidRuntime(10428): at android.app.ActivityThread.access$3000(ActivityThread.java:125)
10-10 18:24:37.682 E/AndroidRuntime(10428): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2071)
10-10 18:24:37.682 E/AndroidRuntime(10428): at android.os.Handler.dispatchMessage(Handler.java:99)
10-10 18:24:37.682 E/AndroidRuntime(10428): at android.os.Looper.loop(Looper.java:123)

2.2、4.0、4.1のすべてのデバイスで再現できます

今日はたくさんのスレッドを読みました。それらのいくつかはこれについてProGuardを非難します。追加してみました

-keep public class com.contactcities.MyContentProvider

しかし、運がありません。

私がプロガードを無効にしたときproguard.config=proguard.cfg、私のを入れないことによってproject.properties。リリースバージョンでも同じエラーが発生します。デバッグも問題ありません。たぶん、そのようなプロガードを無効にするのに十分ではありませんか?

たぶんヒントは、このクラッシュでmaps.jarを参照しているということです。なぜそうなるのかわからない

in loader dalvik.system.PathClassLoader[/system/framework/com.google.android.maps.jar

手がかりは大歓迎です

4

5 に答える 5

4

ああ、私はそれを試したと思ったが、しなかったようだ。

Project->clean動作させました

手のひらに直面

于 2012-10-16T10:00:55.350 に答える
1

同じエラーが発生しましたが、 AndroidManifest.xmlandroid:nameのプロバイダータグの属性値が間違っていたことがわかりました。

<provider
    android:authorities="com.example.ProviderClass"
    android:name=".ProviderClass"
    android:exported="false" >
</provider>

したがって、この値が上記のとおりである.ProviderClassか、クラス名が何であれ(ドットで始まる)であることを再確認してください。次に、[プロジェクト]> [クリーン]を実行すると、機能します。

于 2014-03-10T10:17:19.487 に答える
1

Authority属性はコンテンツ権限と一致する必要があり、name属性はカスタムプロバイダークラスのクラス名と一致する必要があります。

例:

      <provider
         android:authorities="com.richa.myapp"
         android:name=".data.CustomProvider"/>
于 2016-02-11T13:07:04.770 に答える
0

たぶん私の経験不足はこのバグで他の誰かを助けるでしょう。それは私にはまったく謎めいたものでしたが、コンピュータのすべてのように、一度知ってしまえば明らかです。

私はこのチュートリアルに従っていましたが、これは全体的に非常に優れています: http ://www.vogella.com/tutorials/AndroidSQLite/article.html

早い段階で、彼は「contentprovider」というパッケージを作成し、その中に「MyTodoContentProvider」というクラスを作成すると言います。これで、Javaスタイルの命名規則に精通している人なら誰でも、これがメインパッケージに関連しているはずだと思ったでしょう。しかし、私はこれに不慣れだったので、どこかでそれを作成しました。

コードを作成する間、すべてがうまくいきました。Eclipseはこのパッケージを見つけて含めましたが、エラーは表示されませんでした。次に、クラッシュと不可解な「プロバイダーを取得できません」というメッセージが表示されます。エラーメッセージのパスは、コードがクラスを探していた存在しないパスであり、非常に長く、「contentprovider」の反復が非常に多く含まれていたため、何を参照しているのか、何を参照しているのかを確認するのが困難でした。それは間違っていました。

問題はマニフェストファイルにあるのではないかと思いましたが、「android:authority」にあると確信していました。それは少し直感的ではありませんでした。マニフェストのこの要素の文字列は、プロバイダークラスで公開するパブリックメンバーに対応します。そのメンバーの名前は「CONTENT_URI」です。しかし、この2つは完全には一致していません。例えば:

private static final String AUTHORITY = "com.vegnab.provider";
private static final String BASE_PATH = "todos";
public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/" + BASE_PATH);

これは最終的に次のようになります。

CONTENT_URI = "content://com.vegnab.provider/todos"

(AUTHORITY自体はプライベートメンバーであり、外部からは利用できないことに注意してください。)

対応するマニフェスト行は次のようになります。

android:authorities="com.vegnab.provider"

これは、スキーム「content://」とベースパスの中間部分です。

問題は実際にはマニフェストラインにありました:

android:name=".contentprovider.MyTodoContentProvider"

「contentprovider」という名前のパッケージに「MyTodoContentProvider」という名前のエラーのないクラスがありましたが、何が問題でしたか?問題は、パッケージが間違った場所にあったことでした。それはメインパッケージに関連しているはずでした。それが、名前の最初のドットの意味です。マニフェストのセクションでは、アクティビティの「android:name」行と同じ構文に従う必要があります。

これが便利だと思ったら、ワンアップしてください。この問題を解決すると、それがいかに不可解であったかを忘れがちです。

于 2014-11-27T15:29:15.067 に答える
0

Android 5.0(APIレベル21)がDEXランタイムをARTに置き換える前に、古いOSバージョンでクラス制限を超えた可能性があります。限界に達している場合は、コンパイルに合格できますが、起動時にこのエラーが発生します。

Androidの「64Kを超えるメソッドを使用するアプリのマルチデックスを有効にする」のドキュメントの説明に従って、マルチデックスを有効にしてみてください。

于 2018-05-28T20:36:06.187 に答える