2011-12-30 8 views
5

Utworzono BroadcastReceiver, który wyświetla nazwę aplikacji i numer wersji podczas instalacji/dezinstalacji dowolnej aplikacji. Ale otrzymuję nazwę pakietu przez intent.getData(). Ale gdy próbuję znaleźć nazwę tej aplikacji przy użyciu menedżera ładunków, generuje ona wyjątek we wszystkich przypadkach: Zainstaluj/Odinstaluj/Zamieniony. Jaki może być możliwy problem i jak to naprawić?Utworzono BroadcastReceiver, który wyświetla nazwę aplikacji i numer wersji podczas instalacji/dezinstalacji dowolnej aplikacji?

KOD:

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

Jest jedna rzecz, którą najprawdopodobniej chcesz zmienić, zamiast słuchać Intent.ACTION_PACKAGE_INSTALL, być może szukasz Intent.ACTION_PACKAGE_ADDED. Opierając się na dokumentacji, nigdy nie powinno się jej używać i zaskakujące jest, że otrzymałeś taką akcję. – harism

+0

Tak, ale nadal pckManager.getApplicationInfo (nazwa_pakietu, flaga) rzuca wyjątek NameNotFoundException. –

+0

Czy można dodać metodę onReceive Log.d ("MyApp", "Odbiór intencji:" + intent); i dodać wiadomość logcat? – Yury

Odpowiedz

11

I po this BroadcastReceiver przykład, w którym wprowadzana jest w sposób następujący;

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

Teraz raz PackageChangeReceiver.onReceive (..) jest wywoływana, Intent.getData() Uri zawiera około coś; package:my.test.package, która jest zwracana przez Uri.toString(). W celu przeszukania tej informacji ApplicationInfo za pomocą programu PackageManager należy wyodrębnić tylko nazwę pakietu, która może być odtworzona przez Uri.getSchemeSpecificPart(), co powinno dać tylko my.test.package.

Ponadto, w oparciu o szybkie testy, wydaje się bardzo prawdopodobne, że po usunięciu pakietu nie ma już dostępnych informacji ApplicationInfo.

+0

Dzięki bro ... Działa, gdy aplikacja jest zainstalowana, ale po odinstalowaniu aplikacji wciąż mam ten sam problem. –

Powiązane problemy