2012-01-18 10 views
10

Ho un'applicazione che tiene un registro delle applicazioni sviluppate internamente installate sul dispositivo. Al momento dell'installazione di un ricevitore broadcast per Intent.PACKAGE_ADDED viene richiamato e registra il nome del pacchetto utilizzando il seguente codice:Come trovare il nome del pacchetto che è stato disinstallato quando si utilizza Intent.ACTION_PACKAGE_REMOVED

public class NewInstallReceiver extends BroadcastReceiver 
{ 
    @Override 
    public void onReceive(Context context, Intent intent) 
    { 
     Bundle b = intent.getExtras(); 
     int uid = b.getInt(Intent.EXTRA_UID); 
     String[] packages = context.getPackageManager().getPackagesForUid(uid); 

     ApplicationService appService = new ApplicationService(context); 
     appService.ApplicationInstalled(packages); 
    } 
} 

Il problema che sto affrontando è quando si utilizza un ricevitore di trasmissione per Intent.PACKAGE_REMOVED, ogni riferimento al pacchetto tramite l'ID univoco (UID) ritorna con informazioni null (come ci si aspetterebbe, dato che è già stato disinstallato). Nel frattempo ho una soluzione temporanea, ma non è molto elegante, e per la prossima versione mi piacerebbe avere un codice più pulito. Un esempio di come il codice dovrebbe funzionare:

public class RemoveApplicationReceiver extends BroadcastReceiver 
{ 
    @Override 
    public void onReceive(Context context, Intent intent) 
    { 
     Bundle b = intent.getExtras(); 
     int uid = b.getInt(Intent.EXTRA_UID); 
     String[] packages = context.getPackageManager().getPackagesForUid(uid); 

     ApplicationService appService = new ApplicationService(context); 
     appService.ApplicationRemoved(packages); 
    } 

} 

Quindi, per ricapitolare, la domanda è:

Come, dopo un programma è stato rimosso, posso fare riferimento il nome del pacchetto in un ricevitore di trasmissione per Intent. PACKAGE_REMOVED.

Grazie

+0

Sto ottenendo anche null da getPackagesForUid (uid). Quello che voglio è ottenere l'elenco di tutti i pacchetti installati per l'utente corrente. Qualcuno può fornire qualche input? – Pratik

risposta

13

Il pacchetto nomi sono nel intenti che hai da BroadcasReceiver, utilizzare la funzione "getData()", v'è la ComponentMame del pacchetto installato/disinstallato.

+12

Ha funzionato alla grande ... semplicemente utilizzato getData(). GetSchemeSpecificPart(). Grazie – Kennifer

+4

Quando stampo intent.toString() posso vedere il nome del pacchetto, ma quando uso intent.getData(). GetSchemeSpecificPart() ottengo una stringa vuota. Che cosa sto facendo di sbagliato? – gonzobrains

+3

@gonzobrains Probabilmente non hai impostato lo schema? Nel manifest, dovrebbe apparire come segue: ''. –

Problemi correlati