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;
}
}
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
Sí, pero todavía pckManager.getApplicationInfo (packageName, flag) está arrojando la excepción NameNotFoundException. –
¿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