Deinstallieren Sie die App schweigend mit System-Priveleges

Meine App hat Systemvoraussetzungen. Es wird in Firmware sein, jetzt ist es bei / system / app

Ich konnte die Apps mit diesem Beitrag schweigend installieren

  • Warum getHandler () gibt null zurück?
  • So legen Sie eine Bitmap aus der Ressource ein
  • RecyclerView scrolled UP / DOWN-Listener
  • WebView mit SSL Client Zertifikat auf Android 4 ICS
  • Kann ich meine Location-Schaltfläche in Android Maps ändern
  • Benutzerdefinierte Benachrichtigungslayouts und Textfarben
  • APKs programmgesteuert installieren / deinstallieren (PackageManager vs Intents)

    Beispiel App, das funktioniert

    How to install an application in background on Android

    Aber ich kann die Apps immer noch nicht deinstallieren. Ich habe versucht, Reflektion wie im Installationsbeispiel zu verwenden.

    public ApplicationManager(Context context) throws SecurityException, NoSuchMethodException { observer = new PackageInstallObserver(); pm = context.getPackageManager(); Class<?>[] types = new Class[] {Uri.class, IPackageInstallObserver.class, int.class, String.class}; Class<?>[] uninstalltypes = new Class[] {String.class, IPackageInstallObserver.class, int.class}; method = pm.getClass().getMethod("installPackage", types); uninstallmethod = pm.getClass().getMethod("deletePackage", uninstalltypes); } public void uninstallPackage(String packagename) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException { uninstallmethod.invoke(pm, new Object[] {packagename, observer, 0}); } public void installPackage(Uri apkFile) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException { method.invoke(pm, new Object[] {apkFile, observer, INSTALL_REPLACE_EXISTING, null}); } 

    Ich habe die Methode uninstallPackage hinzugefügt und die ApplicationManager-Methode bearbeitet. Immer noch nicht, dass das funktioniert.

    Wenn ich es laufe, bekomme ich Methode nicht gefunden (auf der aufgerufenen "deletePackage" Zeile).

    Hier funktioniert kein Projekt mit meinen Änderungen: https://dl.dropbox.com/u/1928109/InstallInBackgroundSample.zip

    Hier ist eine Beschreibung der Funktion: http://www.androidjavadoc.com/1.0_r1_src/android/content/pm/PackageManager.html#deletePackage(java.lang.String , android.content.pm.IPackageDeleteObserver, int)

    Die Parameter sind in Ordnung. Scheint, wie ich die DeletePackageObserver-Klasse anstelle von InstallPackageObserver angeben sollte. Aber ich weiß nicht, wie das geht (ich habe keine solche Klasse).

    Vielen Dank

  • So zeigen Sie ein vorhandenes ListFragment in einem DialogFragment an
  • Kopiere Text aus TextView auf Android
  • Wird Google Play Store in avd emulatoren unterstützt?
  • Synchronisieren eines REST-Dienstes mit einer Android-App
  • Ist es möglich, LLVM-Bibliotheken zu Android / ARM zu kompilieren
  • TextView android: ellipsize = "marquee" funktioniert nicht wie erwartet
  • 4 Solutions collect form web for “Deinstallieren Sie die App schweigend mit System-Priveleges”

    Hier ist, wie ich es gemacht habe:

    ApplicationManager.java (geänderter Teil):

     private PackageInstallObserver observer; private PackageDeleteObserver observerdelete; private PackageManager pm; private Method method; private Method uninstallmethod; class PackageDeleteObserver extends IPackageDeleteObserver.Stub { public void packageDeleted(String packageName, int returnCode) throws RemoteException { /*if (onInstalledPackaged != null) { onInstalledPackaged.packageInstalled(packageName, returnCode); }*/ } } public ApplicationManager(Context context) throws SecurityException, NoSuchMethodException { observer = new PackageInstallObserver(); observerdelete = new PackageDeleteObserver(); pm = context.getPackageManager(); Class<?>[] types = new Class[] {Uri.class, IPackageInstallObserver.class, int.class, String.class}; Class<?>[] uninstalltypes = new Class[] {String.class, IPackageDeleteObserver.class, int.class}; method = pm.getClass().getMethod("installPackage", types); uninstallmethod = pm.getClass().getMethod("deletePackage", uninstalltypes); } public void uninstallPackage(String packagename) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException { uninstallmethod.invoke(pm, new Object[] {packagename, observerdelete, 0}); } 

    PackageDeleteObserver.java (in android.content.pm):

     package android.content.pm; public interface IPackageDeleteObserver extends android.os.IInterface { public abstract static class Stub extends android.os.Binder implements android.content.pm.IPackageDeleteObserver { public Stub() { throw new RuntimeException("Stub!"); } public static android.content.pm.IPackageDeleteObserver asInterface(android.os.IBinder obj) { throw new RuntimeException("Stub!"); } public android.os.IBinder asBinder() { throw new RuntimeException("Stub!"); } public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException { throw new RuntimeException("Stub!"); } } public abstract void packageDeleted(java.lang.String packageName, int returnCode) throws android.os.RemoteException; } 

    Vergessen Sie auch nicht, die Erlaubnis zu manifestieren :

     <uses-permission android:name="android.permission.DELETE_PACKAGES"/> 

    Arbeitsprojektprojekt (apk muss im "/ system / app" Pfad auf dem Gerät platziert werden) : http://www.mediafire.com/file/no4buw54ed6vuzo/DeleteInBackgroundSample.zip

    So ist die Methode definiert:

      public abstract void deletePackage( String packageName, IPackageDeleteObserver observer, int flags); 

    Um es mit Reflexion zu nennen, brauchst du so etwas wie:

     Class<?>[] uninstalltypes = new Class[] {String.class, IPackageDeleteObserver.class, int.class}; uninstallmethod = pm.getClass().getMethod("deletePackage", uninstalltypes); 

    Beachten Sie den Typ des Beobachters.

    Wenn Sie Ihre App in das System-Image eingebaut haben, und Sie sind mit internen APIs, können Sie auch aufhören zu vortäuschen, wie Sie eine Drittanbieter-App sind und die Verknüpfung mit dem SDK. Bilden Sie gegen die volle Plattform .jar und verwenden Sie diese APIs direkt. Sie wollen das sowieso tun, denn das sind private APIs, und so können sie und ändern sich. Sie wollen gegen das, was tatsächlich erklärt wird, zu bauen, also wenn sie sich ändern, werden Sie dies während Ihrer Builds zu fangen.

    In android 2.3.x ist die Schnittstelle IPackageDeleteObserver in der Methode packageDeleted anders.

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.