2011-12-30 9 views
5

बनाया BroadcastReceiver जो प्रदर्शित करता है किसी भी आवेदन की/स्थापना रद्द स्थापित पर आवेदन नाम और संस्करण संख्या। लेकिन मुझे intent.getData() के माध्यम से पैकेज का नाम मिल रहा है। लेकिन जब मैं पैकेजमैनेजर का उपयोग करके उस एप्लिकेशन का नाम ढूंढने की कोशिश कर रहा हूं तो यह सभी मामलों में अपवाद फेंक रहा है इंस्टॉल/अनइंस्टॉल/प्रतिस्थापित। संभावित समस्या क्या हो सकती है और यह कैसे तय किया जा सकता है?ब्रॉडकास्ट रिसीवर बनाया गया जो किसी भी एप्लिकेशन को इंस्टॉल/अनइंस्टॉल करने पर एप्लिकेशन का नाम और संस्करण संख्या प्रदर्शित करता है?

कोड:

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

एक बात आप सबसे अधिक संभावना को बदलने के लिए, बजाय Intent.ACTION_PACKAGE_INSTALL के लिए सुनने की, तो आप शायद Intent.ACTION_PACKAGE_ADDED लिए देख रहे हैं चाहता था नहीं है। दस्तावेज़ीकरण के आधार पर पहले किसी का कभी भी उपयोग नहीं किया जाना चाहिए था और यदि आपको ऐसी कार्रवाई मिली है तो यह आश्चर्यजनक है। – harism

+0

हाँ, लेकिन अभी भी pckManager.getApplicationInfo (PackageName, झंडा) फेंक है NameNotFoundException अपवाद। –

+0

क्या आप ऑनसेसिव विधि Log.d ("MyApp", "इरादा प्राप्त करें:" + मंशा) में जोड़ सकते हैं; और logcat संदेश जोड़ें? – Yury

उत्तर

11

मैं this उदाहरण है जहाँ BroadcastReceiver इस प्रकार शुरू की है पीछा किया;

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

अब एक बार PackageChangeReceiver.onReceive (..) कहा जाता है, Intent.getData() उरी कुछ चारों ओर होता है; package:my.test.package जो Uri.toString() द्वारा वापस किया जाता है। जो आप my.test.package केवल देना चाहिए इस ApplicationInfo का उपयोग कर PackageManager अपने पैकेज का नाम केवल Uri.getSchemeSpecificPart() के द्वारा प्राप्त किया जा सकता है जो निकालने चाहिए खोज के लिए।

इसके अलावा, त्वरित परीक्षण पर आधारित, तो बहुत संभव पैकेज हटाने के बाद अब वहां कोई ApplicationInfo उपलब्ध है कि लगता है।

+0

धन्यवाद ब्रो ... यह तब काम करता है जब एप्लिकेशन इंस्टॉल हो जाता है लेकिन जब एप्लिकेशन अनइंस्टॉल किया जाता है तब भी मुझे एक ही समस्या का सामना करना पड़ता है। –