web-dev-qa-db-ja.com

ClassNotFoundException:クラス "Android.os.PersistableBundle"が見つかりませんでしたOtto Android 5.0

奇妙な問題があります。 Android 4.4デバイスにデプロイし、Ottoライブラリを使用しているアプリを持っています。Android 5.0デバイスにアプリをデプロイしました。それでも動作します。私は4.4で再試行しましたが、アプリは起動しません。

どうやら、API 21クラスであるPersistableBundle.classを使おうとしています。ここに私のログ:

    Caused by: Java.lang.ClassNotFoundException: Didn't find class "Android.os.PersistableBundle" on path: DexPathList[[Zip file "/data/app/fr.myapp.apk"],nativeLibraryDirectories=[/data/app-lib/fr.myapp, /vendor/lib, /system/lib]]
            at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.Java:56)
            at Java.lang.ClassLoader.loadClass(ClassLoader.Java:497)
            at Java.lang.ClassLoader.loadClass(ClassLoader.Java:457)
            at Java.lang.Class.getDeclaredMethods(Native Method)
            at Java.lang.Class.getDeclaredMethods(Class.Java:656)
            at com.squareup.otto.AnnotatedHandlerFinder.loadAnnotatedMethods(AnnotatedHandlerFinder.Java:52)
            at com.squareup.otto.AnnotatedHandlerFinder.findAllProducers(AnnotatedHandlerFinder.Java:126)
            at com.squareup.otto.HandlerFinder$1.findAllProducers(HandlerFinder.Java:33)
            at com.squareup.otto.Bus.register(Bus.Java:191)
20
Cocorico

「解決策」を見つけます。あなたの活動からこの関数を削除してください:

@Override
public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
    super.onSaveInstanceState(outState, outPersistentState);
}
28
Cocorico

Samsung Galaxy 3miniとローカルオペレーターの電話でも同じ問題が発生しましたが、オーバーライドアクティビティメソッドで修正しました。

 @Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    try {
        BusApplication.getInstance().register(this);
    } catch (Exception e) {
        e.printStackTrace();
    }
}
0
Numan Turkeri

ベース [〜#〜] fag [〜#〜]

一部のAndroidバージョンには、getDeclaredMethodsまたはgetMethodsを呼び出すときのリフレクションにバグがあるようです

この場合、PersistableBundleはAPIレベル21で追加され、onCreateまたはonSaveInstanceStateなどのライフサイクルメソッドで使用すると、このエラーが発生します。

コードでany of次のメソッドを使用する場合

@Override
public void onCreate(Bundle savedInstanceState,PersistableBundle persistentState) {
    super.onCreate(savedInstanceState, persistentState);
}

@Override
public void onPostCreate(Bundle savedInstanceState,PersistableBundle persistentState) {
    super.onPostCreate(savedInstanceState, persistentState);
}

@Override
public void onRestoreInstanceState(Bundle savedInstanceState, PersistableBundle persistentState) {
    super.onRestoreInstanceState(savedInstanceState, persistentState);
}

@Override
public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
    super.onSaveInstanceState(outState, outPersistentState);
}

代わりに次のメソッドを使用してください(または、役に立たない場合は上記のメソッドを削除してください)

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
}

@Override
public void onPostCreate(Bundle savedInstanceState) {
    super.onPostCreate(savedInstanceState);
}

@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
}

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
} 

私の場合、私はこのメソッドをbaseActivityで使用してクラッシュしました

override fun onCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?) {
        super.onCreate(savedInstanceState, persistentState) 
}

単に私はこれを

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
}

そして問題は解決しました。

0
Radesh

targetVersionを、実行しているデバイスのAPIバージョンに変更します。

私はtargetVersion = 21を持っていましたが、デバイスに4.4(API 19)があったときに、値を19に変更すると問題が解決しました。

0
htafoya