2

他のapkをサイレントにアンインストールすることをサポートするアプリケーションを開発しています。私のデバイスはルート化されており、アプリは/ system / appの下に配置されています。リフレクションを使用すると、deletePackageメソッドを使用してこれを実装できます。ただし、deletePackageメソッドの実装では、例外が発生します。例外情報は次のとおりです。

09-20 10:16:02.242: E/JavaBinder(1943): *** Uncaught remote exception!  (Exceptions are not yet supported across processes.)
09-20 10:16:02.242: E/JavaBinder(1943): java.lang.AbstractMethodError: abstract method not implemented
09-20 10:16:02.242: E/JavaBinder(1943):     at android.content.pm.IPackageDeleteObserver$Stub.packageDeleted(IPackageDeleteObserver.java)
09-20 10:16:02.242: E/JavaBinder(1943):     at android.content.pm.IPackageDeleteObserver$Stub.onTransact(IPackageDeleteObserver.java:57)
09-20 10:16:02.242: E/JavaBinder(1943):     at android.os.Binder.execTransact(Binder.java:338)
09-20 10:16:02.242: E/JavaBinder(1943):     at dalvik.system.NativeStart.run(Native Method)
09-20 10:16:02.242: W/dalvikvm(1943): threadid=9: thread exiting with uncaught exception (group=0x40a461f8)
09-20 10:16:02.242: E/AndroidRuntime(1943): FATAL EXCEPTION: Binder Thread #1
09-20 10:16:02.242: E/AndroidRuntime(1943): java.lang.AbstractMethodError: abstract method not implemented
09-20 10:16:02.242: E/AndroidRuntime(1943):     at android.content.pm.IPackageDeleteObserver$Stub.packageDeleted(IPackageDeleteObserver.java)
09-20 10:16:02.242: E/AndroidRuntime(1943):     at android.content.pm.IPackageDeleteObserver$Stub.onTransact(IPackageDeleteObserver.java:57)
09-20 10:16:02.242: E/AndroidRuntime(1943):     at android.os.Binder.execTransact(Binder.java:338)
09-20 10:16:02.242: E/AndroidRuntime(1943):     at dalvik.system.NativeStart.run(Native Method)

相対コード:

public void onBackgroundUninstallClick(View v) {
    PackageDeleteObserver observer = new PackageDeleteObserver();
    if (mPackageManager != null/* && mUninstallPackage != null*/) {
        try {
            mPackageManager.deletePackage("com.example.android.imagedownloader", observer, 0);
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    } 
}

class PackageDeleteObserver extends IPackageDeleteObserver.Stub {
    public void packageDeleted(boolean succeeded) throws RemoteException {
        Log.i(TAG, "packageDeleted");
        Message msg = mHandler.obtainMessage(UNINSTALL_COMPLETE);
        msg.arg1 = succeeded ? SUCCEEDED : FAILED;
        mHandler.sendMessage(msg);
    }
}

IPackageDeleteObserver.aidl code : 

package android.content.pm;

interface IPackageDeleteObserver {
    void packageDeleted(boolean flag);
}
4

3 に答える 3

2
java.lang.AbstractMethodError: abstract method not implemented

メソッドの実装がどこかにありません。

void packageDeleted(boolean flag);

の署名と一致しません

public void packageDeleted(boolean succeeded) throws RemoteException

のためthrows RemoteException

への変更

interface IPackageDeleteObserver {
    void packageDeleted(boolean flag) throws RemoteException;
}
于 2012-09-20T02:54:23.950 に答える
2

このアプリはSDK2.3.5ではうまく機能しますが4.0では動作します。たぶん、メソッドpackageDeletedはsdk4.0の後に変更されています。誰でもsdk4.0でIPackageDeleteObserver.aidlのソースコードを提供できますか。

于 2012-09-20T08:16:56.157 に答える
0

私はこれをandroid2.3.3とandroid4.0.3の両方のエミュレーターで試しましたが、機能しました。@Overrideアノテーションを削除したことに注意してください。

SDKのバージョンに応じて、どちらを使用するかを決定するためのインターフェイスまたは抽象クラスを示す回答がいくつか見られましたが、これも機能するようです。

class PackageDeleteObserver extends IPackageDeleteObserver.Stub {

    PackageDeleteObserver( ) {
        // nothing to do here
    }

    // android > 4
    public void packageDeleted( String name, int status ) throws RemoteException {
        synchronized (this) {
            this.notifyAll();
            // do your thing
        }
    }

    // android < 4
    public void packageDeleted( boolean status ) throws RemoteException {
        synchronized (this) {
            this.notifyAll();
            // do your thing
        }
    }

}
于 2013-08-27T19:57:14.460 に答える