2011-12-30 10 views
5

Creado BroadcastReceiver que muestra el nombre de la aplicación y el número de versión en la instalación/desinstalación de cualquier aplicación. Pero recibo el nombre del paquete a través del intent.getData(). Pero cuando trato de encontrar el nombre de esa aplicación usando packagemanager está lanzando una excepción en todos los casos de Instalar/Desinstalar/Reemplazar. ¿Cuál podría ser el posible problema y cómo puede solucionarse?¿Creó BroadcastReceiver que muestra el nombre de la aplicación y el número de versión en la instalación/desinstalación de cualquier aplicación?

CÓDIGO:

import android.content.BroadcastReceiver; 
    import android.content.Context; 
    import android.content.Intent; 
    import android.content.pm.ApplicationInfo; 
    import android.content.pm.PackageManager; 
    import android.widget.Toast; 

public class ApplicationStatusNotification extends BroadcastReceiver { 

    /** 
    * This method receives message for any application status(Install/ Uninstall) and display details. 
    */ 
    @Override 
    public void onReceive(Context context, Intent intent) { 

     // Get application status(Install/ Uninstall) 
     boolean applicationStatus = intent.getBooleanExtra(Intent.EXTRA_REPLACING, false); 
     String toastMessage = null; 

     // Check if the application is install or uninstall and display the message accordingly 
     if(intent.getAction().equals("android.intent.action.PACKAGE_INSTALL")){ 
      // Application Install 
      toastMessage = "PACKAGE_INSTALL: "+ intent.getData().toString() + getApplicationName(context, intent.getData().toString(), PackageManager.GET_UNINSTALLED_PACKAGES); 
     }else if(intent.getAction().equals("android.intent.action.PACKAGE_REMOVED")){ 
      // Application Uninstall 
      toastMessage = "PACKAGE_REMOVED: "+ intent.getData().toString() + getApplicationName(context, intent.getData().toString(), PackageManager.GET_UNINSTALLED_PACKAGES); 
     }else if(intent.getAction().equals("android.intent.action.PACKAGE_REPLACED")){ 
      // Application Replaced 
      toastMessage = "PACKAGE_REPLACED: "+ intent.getData().toString() + getApplicationName(context, intent.getData().toString(), PackageManager.GET_UNINSTALLED_PACKAGES); 
     } 

     //Display Toast Message 
     if(toastMessage != null){ 
      Toast.makeText(context, toastMessage, Toast.LENGTH_LONG).show(); 
     } 
    } 

    /** 
    * This method get application name name from application package name 
    */ 
    private String getApplicationName(Context context, String data, int flag) { 

     final PackageManager pckManager = context.getPackageManager(); 
     ApplicationInfo applicationInformation; 
     try { 
      applicationInformation = pckManager.getApplicationInfo(data, flag); 
     } catch (PackageManager.NameNotFoundException e) { 
      applicationInformation = null; 
     } 
     final String applicationName = (String) (applicationInformation != null ? pckManager.getApplicationLabel(applicationInformation) : "(unknown)"); 

     return applicationName; 
    } 
} 
+0

Hay una cosa que probablemente haya deseado cambiar, en lugar de escuchar Intent.ACTION_PACKAGE_INSTALL, quizás esté buscando Intent.ACTION_PACKAGE_ADDED. De acuerdo con la documentación, primero nunca debiste haber usado y es bastante sorprendente si has recibido tal acción. – harism

+0

Sí, pero todavía pckManager.getApplicationInfo (packageName, flag) está arrojando la excepción NameNotFoundException. –

+0

¿Se puede agregar en el método de recepción Log.d ("MyApp", "intención de recepción:" + intención); y agregue el mensaje de logcat? – Yury

Respuesta

11

Seguí this ejemplo donde BroadcastReceiver se introduce de la siguiente manera;

<receiver android:name="PackageChangeReceiver"> 
    <intent-filter> 
     <action android:name="android.intent.action.PACKAGE_ADDED"/> 
     <action android:name="android.intent.action.PACKAGE_REPLACED"/> 
     <action android:name="android.intent.action.PACKAGE_REMOVED"/> 
     <data android:scheme="package"/> 
    </intent-filter> 
</receiver> 

Ahora, una vez PackageChangeReceiver.onReceive (..) se llama, Intent.getData() Uri contiene algo alrededor; package:my.test.package que es devuelto por Uri.toString(). Para buscar esta información de aplicación utilizando PackageManager, debe extraer solo el nombre del paquete que se puede recuperar en Uri.getSchemeSpecificPart(), que solo debería proporcionarle my.test.package.

Además, según las pruebas rápidas, parece muy probable que después de la eliminación del paquete ya no haya ApplicationInfo disponible.

+0

Gracias hermano ... Funciona cuando la aplicación está instalada, pero cuando la aplicación se desinstala todavía estoy enfrentando el mismo problema. –

Cuestiones relacionadas