2011-12-30 6 views
5

Created BroadcastReceiver che visualizza il nome dell'applicazione e il numero di versione su installazione/disinstallazione di qualsiasi applicazione. Ma sto ricevendo il nome del pacchetto tramite intent.getData(). Ma quando sto provando a trovare il nome di quell'applicazione usando packagemanager, viene lanciata un'eccezione in tutti i casi Installa/Disinstalla/Sostituisci. Quale potrebbe essere il problema possibile e come può essere risolto?Created BroadcastReceiver che visualizza il nome dell'applicazione e il numero di versione su installazione/disinstallazione di qualsiasi applicazione?

CODICE:

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

C'è una cosa che probabilmente vorresti cambiare, invece di ascoltare Intent.ACTION_PACKAGE_INSTALL, forse stai cercando Intent.ACTION_PACKAGE_ADDED. Sulla base della documentazione, prima non si dovrebbe mai essere utilizzato ed è piuttosto sorprendente se hai ricevuto tale azione. – harism

+0

Sì, ma ancora pckManager.getApplicationInfo (packageName, flag) lancia l'eccezione NameNotFoundException. –

+0

È possibile aggiungere il metodo onReceive Log.d ("MyApp", "Receive intent:" + intent); e aggiungi il messaggio logcat? – Yury

risposta

11

Ho seguito this esempio dove BroadcastReceiver è introdotto come segue;

<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> 

Ora, una volta PackageChangeReceiver.onReceive (..) si chiama, Intent.getData() URI contiene qualcosa intorno; package:my.test.package restituito da Uri.toString(). Per cercare questo ApplicationInfo usando PackageManager dovresti estrarre solo il nome del pacchetto che può essere recuperato da Uri.getSchemeSpecificPart() che dovrebbe darti solo my.test.package.

Inoltre, in base ai test rapidi, sembra molto probabile che dopo la rimozione del pacchetto non sia più disponibile ApplicationInfo.

+0

Grazie bro ... Funziona quando l'applicazione è installata, ma quando l'applicazione viene disinstallata ho ancora lo stesso problema. –

Problemi correlati