2012-03-28 9 views
23

मैं एक ऐप लिख रहा हूं जो उपयोगकर्ता को इंस्टॉल किए गए ऐप्स की सूची देखने की अनुमति देता है, उनमें से एक का चयन करें और फिर इसे शेड्यूल पर शुरू करें। स्टैक ओवरफ्लो से ट्यूटोरियल्स का उपयोग करके मैं यह पता लगाने में कामयाब रहा कि स्थापित गतिविधियों की सूची कैसे प्राप्त करें, उनके पैकेज नाम और आइकन (यानी here - इसे करने के कई तरीके)। शायद ज़रुरत पड़े, यह मैं कैसे गतिविधियों शुरू करते हैं, यह दोषरहित काम करता है, यहाँ कोई समस्या नहीं:एंड्रॉइड: लॉन्चर में दिखाई देने वाली स्थापित गतिविधियों की सूची कैसे प्राप्त करें, बिना डुप्लिकेट

Intent launchIntent = packageManager.getLaunchIntentForPackage(packageName); 
launchIntent.setAction(Intent.ACTION_MAIN); 
launchIntent.addCategory(Intent.CATEGORY_LAUNCHER); 
launchIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
startActivity(launchIntent); 

समस्या इंस्टॉल किए गए एप्लिकेशन की एक सूची को पुन: प्राप्त के साथ है।

1) का उपयोग

PackageManager pm = getPackageManager(); 
List<ApplicationInfo> apps = pm.getInstalledApplication(PackageManager.GET_META_DATA) 

और apps से प्रत्येक तत्व से आप इसे पैकेज नाम और पैकेज लेबल (एप्लिकेशन के नाम) है प्राप्त कर सकते हैं: मैं दो तरह से स्थापित अनुप्रयोगों की एक सूची प्राप्त करने के लिए मिल गया है।

2)

PackageManager pm = getPackageManager();  
Intent mainIntent = new Intent(Intent.ACTION_MAIN, null); 
mainIntent.addCategory(Intent.CATEGORY_LAUNCHER); 
List<ResolveInfo> resolveInfos = packageManager.queryIntentActivities(mainIntent, 0); 
for(ResolveInfo info : resolveInfos) { 
    ApplicationInfo applicationInfo = info.activityInfo.applicationInfo; 
    //... 
    //get package name, icon and label from applicationInfo object  
} 

का उपयोग पहले विधि के साथ कोई समस्या है: यह सब इंस्टॉल किए गए पैकेज, प्रणाली सेवाओं सहित, जो किसी भी गतिविधि शामिल नहीं हो सकता है और इसलिए चलाने योग्य प्रोग्राम नहीं हैं देता है। यहां एक उदाहरण के साथ एक स्क्रीनशॉट है: app list with packages

ऊपर दिए गए सभी आइटमों में कोई आइकन लॉन्च करने योग्य नहीं है।

रूप में अच्छी तरह दूसरा दृष्टिकोण के साथ कोई समस्या है: सूची के कई आइटमों का डुप्लिकेट हैं: app list with duplicates

जब मैं डिबगर मैं देख में एक ब्रेकपाइंट की स्थापना की, कि इन "मैप्स" आइटम अलग है गतिविधि नाम ("com.google.android.maps.MapsActivity", "com.google.android.maps.LatitudeActivity", "com.google.android.maps.PlacesActivity" आदि)।

मैंने दूसरे दृष्टिकोण का उपयोग करने का निर्णय लिया, क्योंकि यह एक सूची देता है जो मेरी ज़रूरतों के लिए अधिक उपयुक्त है, लेकिन मुझे डुप्लीकेट को फ़िल्टर करने और केवल ऐप के लिए डिफ़ॉल्ट गतिविधि दिखाने का कोई तरीका नहीं मिल रहा है, क्योंकि वे लॉन्चर में दिखाई दें (आप केवल अपने फोन की ऐप्स में एक 'मानचित्र' देखते हैं, चार नहीं)। मैंने ApplicationInfo.FLAG_SYSTEM के माध्यम से सिस्टम ऐप्स को फ़िल्टर करने का प्रयास किया है, लेकिन यह मैप्स और अन्य प्रीइंस्टॉल किए गए ऐप्स सहित कई ऐप्स को हटा देता है। क्वेरी INTentActivities निष्पादित करते समय मैंने PackageManager.MATCH_DEFAULT_ONLY ध्वज का उपयोग करने का प्रयास किया है, लेकिन यह कुछ ऐप्स छोड़कर कई ऐप्स को भी फ़िल्टर करता है।

मैं थोड़ी देर से खो गया हूं, और मुझे नहीं पता कि क्या करना है। मैंने इंस्टॉल किए गए ऐप्स की एक सूची पुनर्प्राप्त करने के बारे में stackoverflow पर सभी प्रश्न पढ़े हैं, लेकिन यह समस्या कभी नहीं लाई गई है। कृपया, किसी की मदद करें? मैं इंस्टॉल किए गए लॉन्च करने योग्य ऐप्स की एक सूची कैसे प्राप्त करूं जिसमें कोई डुप्लीकेट नहीं है?

+0

आप कहते हैं कि "इस मुद्दे को लाया गया कभी नहीं किया है।" कृपया इसे जांचें, शायद यह मदद करता है: http://stackoverflow.com/questions/4598769/list-of-user-installed-apps/4599124#4599124 – Zelimir

+1

मेरा मतलब सूची में डुप्लिकेट था, मैंने किसी को इसका उल्लेख नहीं देखा है। हां, मैंने यह टिप्पणी देखी है, मैंने 'ApplicationInfo.FLAG_SYSTEM' के साथ ऐप्स छोड़ने का प्रयास किया है, लेकिन किसी कारण से यह गेम और इस तरह के कई मान्य ऐप्स को हटा देता है। –

उत्तर

13
Intent localIntent2 = new Intent("android.intent.action.PICK_ACTIVITY"); 
Intent localIntent3 = new Intent("android.intent.action.MAIN",null); 
localIntent3.addCategory("android.intent.category.LAUNCHER"); 
localIntent2.putExtra("android.intent.extra.INTENT",localIntent3); 
startActivityForResult(localIntent2, 1); 

इस कोड का प्रयास करें। यह केवल उन अनुप्रयोगों को सूचीबद्ध करेगा जो आपके डिवाइस में इंस्टॉल किए गए हैं।

+0

हाँ, यह काम किया! धन्यवाद! –

+0

यह काम करता है लेकिन यदि आप चयनित ऐप चलाने के लिए प्रबंधित कर सकते हैं तो यह अधिक प्रभावी होगा। क्योंकि अब जब आप ऐप चुनते हैं, तो कुछ भी नहीं हुआ। –

+1

अच्छा उत्तर लेकिन हार्डकोडेड स्ट्रिंग्स का उपयोग करने से बचें, इसके बजाय "android.intent.extra.INTENT" के लिए Intent.EXTRA_INTENT जैसे स्थिरांक का उपयोग करें। –

6

कोड नीचे आज़माएं और मुझे बताएं कि क्या हुआ।

PackageManager manager = getPackageManager(); 
Intent mainIntent = new Intent(Intent.ACTION_MAIN, null); 
mainIntent.addCategory(Intent.CATEGORY_LAUNCHER); 

List<ResolveInfo> resolveInfos= manager.queryIntentActivities(mainIntent, 0); 
// Below line is new code i added to your code 
Collections.sort(resolveInfos, new ResolveInfo.DisplayNameComparator(manager)); 

for(ResolveInfo info : resolveInfos) { 
    ApplicationInfo applicationInfo = info.activityInfo.applicationInfo; 
    //... 
    //get package name, icon and label from applicationInfo object  
} 
+0

हाय, यहां क्या हुआ है इसका एक स्क्रीनशॉट है: http://i.stack.imgur.com/xCXqY.png सूची में अभी भी 4 'मैप्स' हैं, लेकिन अब वे यादृच्छिक क्रम में हैं। –

13

मुझे देर हो सकती है, लेकिन मुझे लॉन्चर & कोई डुप्लिकेट ऐप्स (संपर्क, मानचित्र आदि जैसे सिस्टम ऐप्स सहित) के सभी ऐप्स प्राप्त करने का एक सही तरीका मिला है। हालांकि, सतेश का जवाब काम कर रहा है (मैंने स्वयं की जांच नहीं की है), लेकिन मैं कई गतिविधियां चुनना चाहता था इसलिए मैंने स्थापित ऐप्स प्राप्त करने के लिए कोड के नीचे उपयोग किया।

मैंने आपके दूसरे दृष्टिकोण का उपयोग किया और हैशसेट का उपयोग करके डुप्लिकेट पैकेज को त्याग दिया। यहां अंतिम कोड है:

final PackageManager packageManager = getPackageManager(); 
    Intent intent = new Intent(Intent.ACTION_MAIN, null); 
    intent.addCategory(Intent.CATEGORY_LAUNCHER); 
    List<ResolveInfo> resInfos = packageManager.queryIntentActivities(intent, 0); 
    //using hashset so that there will be no duplicate packages, 
    //if no duplicate packages then there will be no duplicate apps 
    HashSet<String> packageNames = new HashSet<String>(0); 
    List<ApplicationInfo> appInfos = new ArrayList<ApplicationInfo>(0); 

    //getting package names and adding them to the hashset 
    for(ResolveInfo resolveInfo : resInfos) { 
     packageNames.add(resolveInfo.activityInfo.packageName); 
    } 

    //now we have unique packages in the hashset, so get their application infos 
    //and add them to the arraylist 
    for(String packageName : packageNames) { 
     try { 
      appInfos.add(packageManager.getApplicationInfo(packageName, PackageManager.GET_META_DATA)); 
     } catch (NameNotFoundException e) { 
      //Do Nothing 
     } 
    } 

    //to sort the list of apps by their names 
    Collections.sort(appInfos, new ApplicationInfo.DisplayNameComparator(packageManager)); 
3

मुझे वही आवश्यकता थी। आखिरकार मैंने ऐप सूची को फ़िल्टर करने के लिए एक और शर्त जोड़ा। मैंने अभी जांच की है कि ऐप में 'लॉन्चर इरादा' है या नहीं।

तो, उसके एवज में कोड की तरह दिखता है ...

PackageManager pm = getPackageManager(); 
List<ApplicationInfo> apps = pm.getInstalledApplications(PackageManager.GET_GIDS); 

for (ApplicationInfo app : apps) { 
    if(pm.getLaunchIntentForPackage(app.packageName) != null) { 
     // apps with launcher intent 
     if((app.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) == 1) { 
      // updated system apps 
     } else if ((app.flags & ApplicationInfo.FLAG_SYSTEM) == 1) { 
      // system apps 
     } else { 
      // user installed apps 
     } 
     appsList.add(app); 
    } 

} 
1

दोनों @Ashish तन्ना और jozze ठीक कह रहे हैं, लेकिन प्रदर्शन हो सकता है एक छोटे से समस्या।

यह सबसे अच्छा प्रदर्शन है।

Set<String> packageNameSet = new HashSet<>(); 
PackageManager pm = context.getPackageManager(); 
Intent mainIntent = new Intent(Intent.ACTION_MAIN, null); 
mainIntent.addCategory(Intent.CATEGORY_LAUNCHER); 
List<ResolveInfo> resolveInfos = packageManager.queryIntentActivities(mainIntent, 0); 
for(ResolveInfo info : resolveInfos) { 
    // be added 
    ApplicationInfo applicationInfo; 
    if (info == null || (applicationInfo = info.activityInfo.applicationInfo) == null 
      || !applicationInfo.enabled || packageNameSet.contains(applicationInfo.packageName)) { 
     continue; 
    } 
    packageNameSet.add(applicationInfo.packageName); 

    //... 
    //get package name, icon and label from applicationInfo object 
} 

(1) एक HashSet जोड़े (2) न्यायाधीश उस आवेदन सक्षम है या नहीं (3) न्यायाधीश कि क्या HashSet अंदर है

संबंधित मुद्दे