Desinstalar la aplicación silenciosamente con priveleges del sistema
Mi aplicación tiene privilegios de sistema. Estará dentro del firmware, ahora se encuentra en / system / app
He podido instalar aplicaciones silenciosamente con esta publicación
- Fragmento onCreateView y onActivityCreated llamado dos veces
- Iniciar una intención de mensaje SMS ya no funciona para el nuevo sistema operativo RAZR ICS de Droid
- Android ActionBar setActionView problema de diseño
- Widget de conmutador personalizado en Android 4
- Solución alternativa / polyfill para Android 4.0.3
Instalar / desinstalar APKs de forma programática (PackageManager vs Intents)
Ejemplo de aplicación que funciona
How to install an application in background on Android
Pero todavía no puedo desinstalar aplicaciones de la misma manera. Intenté usar reflecion como en el ejemplo de instalación.
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}); }
He agregado el método uninstallPackage y el método de ApplicationManager editado. Todavía no puedo conseguir este trabajo.
Cuando lo ejecuto consigo el método no encontrado (en la línea "deletePackage" de la invocación).
Aquí no funciona el proyecto con mis cambios: https://dl.dropbox.com/u/1928109/InstallInBackgroundSample.zip
Aquí está una descripción de la función: http://www.androidjavadoc.com/1.0_r1_src/android/content/pm/PackageManager.html#deletePackage(java.lang.String , android.content.pm.IPackageDeleteObserver, int)
Los parámetros son correctos. Parece que debería especificar la clase DeletePackageObserver en lugar de InstallPackageObserver. Pero no sé cómo hacerlo (no tengo tal clase).
Gracias
- HTTP POST solicitud ANDROID 4 (trabajando en 2.3)?
- Ocultar los botones del conmutador de tareas de inicio de ICS
- Android Audiotrack haciendo clic en el ruido desde Android 4 ICS
- WebView "intermitente" con fondo blanco si la aceleración de hardware está habilitada (Android 3.0+)
- Intent.ACTION_VIEW una URL de vídeo que no funciona en Ice Cream Sandwhich
- Horizontalmente las vistas de centro dentro de Android GridLayout
- Cálculo del tamaño de Appwidget
- Android 4.0 asynctask al mismo tiempo no es posible
Aquí es cómo lo hice:
ApplicationManager.java (parte cambiada):
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 (en 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; }
También no se olvide de agregar permiso para manifestar :
<uses-permission android:name="android.permission.DELETE_PACKAGES"/>
Proyecto de ejemplo de trabajo (apk debe colocarse en la ruta "/ system / app" en el dispositivo) : http://www.mediafire.com/file/no4buw54ed6vuzo/DeleteInBackgroundSample.zip
Así se define el método:
public abstract void deletePackage( String packageName, IPackageDeleteObserver observer, int flags);
Para llamarla usando la reflexión, necesitarías algo como:
Class<?>[] uninstalltypes = new Class[] {String.class, IPackageDeleteObserver.class, int.class}; uninstallmethod = pm.getClass().getMethod("deletePackage", uninstalltypes);
Observe el tipo de observador.
Si tiene su aplicación integrada en la imagen del sistema y está utilizando APIs internas, también podría dejar de fingir que es una aplicación de terceros y vincularla con el SDK. Construir contra la plataforma completa .jar y utilizar esas API directamente. Usted quiere hacer eso de todos modos, porque estas son APIs privadas, y por lo tanto pueden y cambian. Usted desea construir contra lo que realmente está declarándolos, así que si cambian, lo captará durante sus compilaciones.
En android 2.3.x, la interfaz IPackageDeleteObserver es diferente en el método packageDeleted.
- Android Lollipop Set Barras de estado Color del texto
- WebViewFragment webView es nulo después de realizar una FragmentTransaction