2012-06-05 12 views
12

Moja aplikacja ma uprawnienia systemowe. To będzie wewnątrz oprogramowania, teraz to znajduje się w/system/appBez odinstalowania aplikacji z uprawnieniami systemowymi

udało mi się zainstalować aplikacje cicho z tego postu

install/uninstall APKs programmatically (PackageManager vs Intents)

przykład aplikacja, która działa

http://paulononaka.wordpress.com/2011/07/02/how-to-install-a-application-in-background-on-android/

Ale nadal nie mogę odinstalować aplikacji w ten sam sposób. Próbowałem użyć odbicia jak w przykładzie instalacji.

Dodałem metodę uninstallPackage i edytowałem metodę ApplicationManager. Nadal nie mogę tego zadziałać.

Po uruchomieniu otrzymuję metodę nie znaleziono (w linii invoke "deletePackage").

Tutaj nie jest projekt pracy z moimi zmianami:https://dl.dropbox.com/u/1928109/InstallInBackgroundSample.zip

Oto opis funkcji: http://www.androidjavadoc.com/1.0_r1_src/android/content/pm/PackageManager.html#deletePackage(java.lang.String, android.content.pm.IPackageDeleteObserver, int)

Parametry są w porządku. Wygląda na to, że powinienem podać klasę DeletePackageObserver zamiast InstallPackageObserver. Ale nie wiem jak to zrobić (nie mam takiej klasy).

Dzięki

+0

Możesz chcieć opublikować śledzenie stosów i/lub komunikaty o błędach/ostrzeżeniach, które otrzymasz w kodzie logowania. –

+0

Mówi, że nie znaleziono metody deletePackage – POMATu

+0

@POMATu jest konieczne, aby mieć dostęp do roota lub zrootowanego telefonu, aby wykonać cichą instalację lub usunięcie przy użyciu kodu, który wymieniono w pytaniu. – pyus13

Odpowiedz

16

Oto jak to zrobiłem:

ApplicationManager.java (zmiana części):

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 (w 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; 
} 

Nie zapominaj także, aby dodać pozwolenie manifestować:

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

Praca przykładowy projekt (apk muszą być umieszczone w "/ system/app" ścieżki na urządzeniu) : http://www.mediafire.com/file/no4buw54ed6vuzo/DeleteInBackgroundSample.zip

+0

będzie działać również dla urządzeń nierootowanych? – pyus13

+0

@ pyus13: Myślę, że będzie działać tylko z zrootowanymi urządzeniami, w przeciwnym razie spójrz na ten przykład: działa zarówno na urządzeniach zrootowanych, jak i nierootowanych: http://impressive-artworx.de/2011/uninstall- an-app-programowo/ – Houcine

+0

@Houcine dziękuje, ale poprosi o potwierdzenie użytkownika, aby usunąć aplikację, ale szukam czegoś, co będzie bezpośrednio odinstalować aplikację, wszystkie aplikacje są rozwijane przez moje tylko generowane z tego samego certyfikatu, więc mogę odinstalować moja własna opracowana aplikacja z mojej innej opracowanej aplikacji bez promt użytkownika? – pyus13

7

ten sposób metoda jest zdefiniowana:

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

nazwać użyciu odbicia, to trzeba coś takiego:

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

Uwaga typ obserwatora.

+0

Ale nie mam klasy packageDeleteObserver w przykładowym programie. Koder z blogu wordpress dostarczył tylko packageInstallObserver i różni się od packageInstallObserver z systemu Android. – POMATu

+0

Wykorzystaj swoją wyobraźnię :) Dodaj do swojego projektu pewną klasę 'IPackageDeleteObserver', tak jak opisuje to blog dla' IPackageInstallObserver'. –

+0

wygląd. Podczas gdy ta linia jest w porządku 'obserwator = new PackageInstallObserver();', Mam problemy z używaniem tej linii 'obserwatordelete = new PackageDeleteObserver();'. Mówi ona, że ​​PackageDeleteObserver nie może zostać rozwiązany na typ, ale istnieje w moim projekcie. Oto projekt z twoimi zmianami, które nie kompilują się https://dl.dropbox.com/u/1928109/InstallInBackgroundSample2.zip – POMATu

4

Jeśli twoja aplikacja jest wbudowana w obraz systemu i korzystasz z wewnętrznych interfejsów API, możesz równie dobrze przestać udawać, że jesteś aplikacją zewnętrzną i łączysz się z SDK. Twórz kompilacje na pełnej platformie .jar i korzystaj bezpośrednio z tych interfejsów API. W każdym razie chcesz to zrobić, ponieważ są to prywatne interfejsy API, dzięki czemu mogą się zmieniać. Chcesz budować na podstawie tego, co faktycznie je deklaruje, więc jeśli się zmienią, złapiesz to podczas kompilacji.

1

w android 2.3.x interfejs IPackageDeleteObse rver jest inny w pakiecie methodDeleted.

Powiązane problemy