इंस्टॉल किए गए एंड्रॉइड एप्लिकेशन की सूची कैसे प्राप्त करें और चलाने के लिए एक चुनें


326

मैंने इस सप्ताह के शुरू में इसी तरह का सवाल पूछा था, लेकिन मैं अभी भी नहीं समझ पा रहा हूं कि सभी इंस्टॉल किए गए एप्लिकेशनों की सूची कैसे प्राप्त करें और फिर चलाने के लिए एक चुनें।

मैंने कोशिश की:

Intent intent = new Intent(ACTION_MAIN);
intent.addCategory(CATEGORY_LAUNCHER);

और यह केवल वही एप्लिकेशन दिखाता है जो पूर्वस्थापित हैं या चला सकते हैं ACTION_MAIN इरादे प्रकार ।

मुझे यह भी पता है कि मैं PackageManagerसभी स्थापित अनुप्रयोगों को प्राप्त करने के लिए उपयोग कर सकता हूं , लेकिन मैं एक विशिष्ट एप्लिकेशन को चलाने के लिए इसका उपयोग कैसे करूं?


आप सूची में केवल चुने गए ऐप के बारे में जानकारी कैसे प्राप्त कर सकते हैं?
1

जवाबों:


277

एंड्रॉइड पर इंस्टॉल की गई गतिविधियों / अनुप्रयोगों की सूची प्राप्त करने के लिए निम्नलिखित कोड है:

Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
List<ResolveInfo> pkgAppsList = context.getPackageManager().queryIntentActivities( mainIntent, 0);

ResolveInfoएप्लिकेशन शुरू करने के लिए आपको सभी आवश्यक डेटा मिलेंगे । आप यहाँResolveInfo javadoc की जाँच कर सकते हैं


3
मैं इनमें से एक को कैसे शुरू कर सकता हूं? मुझे ResolveInfo के अंदर गतिविधिइन्फो मिली, लेकिन मैं इसे शुरू करने का प्रबंधन नहीं कर सकता।
स्पाइडी

1
कोई बात नहीं, पाया। मुझे पूर्ण श्रेणी नाम (पैकेज + वर्ग) का उपयोग करके एक नई आशय बनाना चाहिए।
स्पाइडी सिप

आप सूची में केवल चुने गए ऐप के बारे में जानकारी कैसे प्राप्त कर सकते हैं?
1

1
मैं अपने ऐप को पढ़ने और सभी ऐप्स की सूची संग्रहीत करने, और संभावित रूप से सर्वर से संचार करने के बारे में एंड्रॉइड / प्ले स्टोर नीति को समझना चाहता था। क्या कोई दिशा-निर्देश है?
dowjones123 20

1
@ dowjones123 क्या इस बारे में दिशा-निर्देश खोजने के लिए यू हुआ?
RmK

415

यहाँ एक क्लीनर तरीका है PackageManager

final PackageManager pm = getPackageManager();
//get a list of installed apps.
List<ApplicationInfo> packages = pm.getInstalledApplications(PackageManager.GET_META_DATA);

for (ApplicationInfo packageInfo : packages) {
    Log.d(TAG, "Installed package :" + packageInfo.packageName);
    Log.d(TAG, "Source dir : " + packageInfo.sourceDir);
    Log.d(TAG, "Launch Activity :" + pm.getLaunchIntentForPackage(packageInfo.packageName)); 
}
// the getLaunchIntentForPackage returns an intent that you can use with startActivity() 

अधिक जानकारी यहाँ http://qtcstation.com/2011/02/how-to-launch-another-app-from-your-p/


जीआर 8 काम करता है। लेकिन जब एंड्रॉइड 4.0.3 पर यह कोशिश की गई, तो कुछ भी मुद्रित नहीं हुआ !! कोई सुराग ??
सौरभ वर्मा

सुनिश्चित करें कि आप डिबग लॉग स्टेटमेंट्स को फ़िल्टर नहीं कर रहे हैं।
QED

यह कोड हालांकि काम कर रहा है, क्या आपको इस बारे में कोई जानकारी है कि आवेदन की सूची को एक सूची दृश्य में कैसे रखा जाए?
AndroidBoomer

@androidBoomer im वही कर रहा है। इसे यहाँ पढ़ें - vogella.com/tutorials/AndroidListView/article.html
डेविड टी।

@DavidT। मैंने पहले ही समझ लिया। अब, मैं इस बात पर काम कर रहा हूं कि मैं अपने ऐप के अंदर शॉर्टकट बनाने के लिए उन इंस्टॉल किए गए ऐप तक कैसे पहुंच सकता हूं। क्या यह संभव है?
AndroidBoomer

61

सिस्टम ऐप्स पर फ़िल्टर करने का एक और तरीका (King9981 के उदाहरण के साथ काम करता है):

/**
 * Return whether the given PackageInfo represents a system package or not.
 * User-installed packages (Market or otherwise) should not be denoted as
 * system packages.
 * 
 * @param pkgInfo
 * @return
 */
private boolean isSystemPackage(PackageInfo pkgInfo) {
    return ((pkgInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0);
}

4
सिस्टम ऐप्स को फ़िल्टर करने के लिए यह सबसे अच्छा उत्तर है।
ब्योर्न

5
लेकिन मैं सेटिंग्स, नक्शे, या ... की तरह appliaction फिल्टर, कैसे उन्हें भी सूची के लिए
Ata

7
आपके रिटर्न स्टेटमेंट का "सच्चा: झूठा" हिस्सा बेमानी है
k2col

वापसी को सरल करें ((pkgInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM)! = 0);
भावेश रंगानी

भुगतान किए गए एप्लिकेशन को कैसे फ़िल्टर करें?
पेम्बा तमांग

55

यहाँ एक अच्छा उदाहरण है:

class PInfo {
    private String appname = "";
    private String pname = "";
    private String versionName = "";
    private int versionCode = 0;
    private Drawable icon;
    private void prettyPrint() {
        Log.v(appname + "\t" + pname + "\t" + versionName + "\t" + versionCode);
    }
}

private ArrayList<PInfo> getPackages() {
    ArrayList<PInfo> apps = getInstalledApps(false); /* false = no system packages */
    final int max = apps.size();
    for (int i=0; i<max; i++) {
        apps.get(i).prettyPrint();
    }
    return apps;
}

private ArrayList<PInfo> getInstalledApps(boolean getSysPackages) {
    ArrayList<PInfo> res = new ArrayList<PInfo>();        
    List<PackageInfo> packs = getPackageManager().getInstalledPackages(0);
    for(int i=0;i<packs.size();i++) {
        PackageInfo p = packs.get(i);
        if ((!getSysPackages) && (p.versionName == null)) {
            continue ;
        }
        PInfo newInfo = new PInfo();
        newInfo.appname = p.applicationInfo.loadLabel(getPackageManager()).toString();
        newInfo.pname = p.packageName;
        newInfo.versionName = p.versionName;
        newInfo.versionCode = p.versionCode;
        newInfo.icon = p.applicationInfo.loadIcon(getPackageManager());
        res.add(newInfo);
    }
    return res; 
}

1
यदि आप की जरूरत है तो आप उनमें से किसी को कैसे निष्पादित करते हैं? मेरा मतलब है, आप आशय प्राप्त कर सकते हैं?
टन

महान। आपके उत्तर के लिए धन्यवाद। मैंने अपने आवेदन में आपके उत्तर का उपयोग किया है और मुझे आइकन के आकार के साथ एक छोटी सी समस्या है। उनमें से अधिकांश सामान्य हैं और उनमें से कुछ बहुत बड़े या छोटे हैं। मैं कैसे इसे ठीक कर सकता हूं। क्या तुम्हारे पास कोई विचार है? धन्यवाद
Meysam Valueian

36

स्थापित गैर-सिस्टम ऐप्स की सूची प्राप्त करना

public static void installedApps()
{
    List<PackageInfo> packList = getPackageManager().getInstalledPackages(0);
    for (int i=0; i < packList.size(); i++)
    {
        PackageInfo packInfo = packList.get(i);
        if (  (packInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0)
        {
            String appName = packInfo.applicationInfo.loadLabel(getPackageManager()).toString();
            Log.e("App № " + Integer.toString(i), appName);
        }
    }
}

19

साइटम आधारित ऐप्स पर फ़िल्टर करने के लिए:

private boolean isSystemPackage(ResolveInfo ri) {
    return (ri.activityInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0;
}

18

अल स्थापित एप्लिकेशन प्राप्त करने के लिए आप पैकेज मैनेजर का उपयोग कर सकते हैं।

    List<PackageInfo> apps = getPackageManager().getInstalledPackages(0);

चलाने के लिए आप पैकेज नाम का उपयोग कर सकते हैं

Intent launchApp = getPackageManager().getLaunchIntentForPackage(“package name”)
startActivity(launchApp);

अधिक विवरण के लिए आप इस ब्लॉग http://codebucket.co.in/android-get-list-of-all-install-appy/ को पढ़ सकते हैं


यह बात और है। हम अपने आवश्यक एप्लिकेशन का पता लगाकर एक उचित जांच सेट कर सकते हैं।
नोमन

13

आप नीचे दिए गए कोड का उपयोग करके एंड्रॉइड डिवाइस में इंस्टॉल किए गए ऐप्स की सूची पा सकते हैं, डिवाइस में "पैकेजइन्फो" में इंस्टॉल्ड एप्लिकेशन इनफॉर्मेशन शामिल है। हम पैकेजइन्फो ऑब्जेक्ट से इंस्टॉल किए गए एप्लिकेशन के लिए इरादा को फिर से शुरू कर सकते हैं और स्टार्टएक्टिविटी (इरादा) का उपयोग करके, आवेदन शुरू कर सकते हैं। यह आप पर निर्भर करता है कि आप UI को Listview या Gridview में कैसे व्यवस्थित करते हैं। इसलिए स्थिति के आधार पर क्लिक ईवेंट पर, आप आशय वस्तु को पुनः प्राप्त कर सकते हैं और गतिविधि आशय शुरू कर सकते हैं।

final PackageManager pm = getPackageManager();

List<ApplicationInfo> packages = pm.getInstalledApplications(PackageManager.GET_META_DATA);


for (ApplicationInfo packageInfo : packages) 

{
 if(pm.getLaunchIntentForPackage(packageInfo.packageName)!= null &&   

                   !pm.getLaunchIntentForPackage(packageInfo.packageName).equals(""))


{

    System.out.println("Package Name :" + packageInfo.packageName);

    System.out.println("Launch Intent For Package :"   +  
                  pm.getLaunchIntentForPackage(packageInfo.packageName));

    System.out.println("Application Label :"   + pm.getApplicationLabel(packageInfo));

    System.out.println("Application Label :"   + 
                           pm.getApplicationIcon(packageInfo.packageName).toString());

    System.out.println("i : "+i);

    /*if(i==2)

    {
         startActivity(pm.getLaunchIntentForPackage(packageInfo.packageName));

     break;

    }*/

    i++;

}
}

13

मुझे उन सिस्टम ऐप्स को फ़िल्टर करने की आवश्यकता थी जो उपयोगकर्ता वास्तव में उपयोग नहीं करते हैं (उदाहरण के लिए। "com.qualcomm.service", "अपडेट सेवाओं", आदि)। अंततः मैंने ऐप सूची को फ़िल्टर करने के लिए एक और शर्त जोड़ी। मैंने अभी चेक किया है कि ऐप में 'लॉन्चर इंट्रेंस' है या नहीं।

इसलिए, परिणामी कोड जैसा दिखता है ...

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) != 0) {
                    // updated system apps

                } else if ((app.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
                    // system apps

                } else {
                    // user installed apps

                }
                appsList.add(app);
            }

        }

धन्यवाद। GetLaunchIntentForPackage, ऐप
ड्रावर

10

यदि कोड के ऊपर एक पैकेज में कई लॉन्चर हैं, तो समस्या है। उदाहरण: एलजी के लिए एलजी ऑप्टिमस फेसबुक पर, एलजी के लिए माइस्पेस, एलजी के लिए ट्विटर में एक पैकेज नाम एसएनएस शामिल है और यदि आप एसएनएस से ऊपर का उपयोग करते हैं तो दोहराएंगे। घंटों शोध के बाद मैं नीचे दिए गए कोड के साथ आया। अच्छा काम करने लगता है।

private List<String> getInstalledComponentList()
            throws NameNotFoundException {
        final Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
        mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
        List<ResolveInfo> ril = getPackageManager().queryIntentActivities(mainIntent, 0);
        List<String> componentList = new ArrayList<String>();
        String name = null;

        for (ResolveInfo ri : ril) {
            if (ri.activityInfo != null) {
                Resources res = getPackageManager().getResourcesForApplication(ri.activityInfo.applicationInfo);
                if (ri.activityInfo.labelRes != 0) {
                    name = res.getString(ri.activityInfo.labelRes);
                } else {
                    name = ri.activityInfo.applicationInfo.loadLabel(
                            getPackageManager()).toString();
                }
                componentList.add(name);
            }
        }
        return componentList;
    }

7

@ जस: मेरे पास अब वह कोड नहीं है, लेकिन मैंने कुछ करीब पाया है। मैंने अपने एप्लिकेशन के "घटकों" की खोज करने के लिए इसे बनाया है, वे किसी दिए गए श्रेणी के साथ गतिविधियां हैं।

private List<String> getInstalledComponentList() {
    Intent componentSearchIntent = new Intent();
    componentSearchIntent.addCategory(Constants.COMPONENTS_INTENT_CATEGORY);
    componentSearchIntent.setAction(Constants.COMPONENTS_INTENT_ACTION_DEFAULT);
    List<ResolveInfo> ril = getPackageManager().queryIntentActivities(componentSearchIntent, PackageManager.MATCH_DEFAULT_ONLY);
    List<String> componentList = new ArrayList<String>();
    Log.d(LOG_TAG, "Search for installed components found " + ril.size() + " matches.");
    for (ResolveInfo ri : ril) {
        if (ri.activityInfo != null) {
            componentList.add(ri.activityInfo.packageName);// + ri.activityInfo.name);
            Log.d(LOG_TAG, "Found installed: " + componentList.get(componentList.size()-1));
        }
    }
    return componentList;
}

मैंने उस हिस्से पर टिप्पणी की है जहां उसे गतिविधि का नाम मिलता है, लेकिन यह बहुत सीधा है।


6

क्लीन सॉल्यूशन जो सिस्टम के एप्स को सफल बनाता है

इस समाधान के पीछे विचार यह है कि प्रत्येक सिस्टम ऐप की मुख्य गतिविधि में कस्टम गतिविधि आइकन नहीं है । यह विधि मुझे एक उत्कृष्ट परिणाम देती है:

 public static Set<PackageInfo> getInstalledApps(Context ctx) {
    final PackageManager packageManager = ctx.getPackageManager();

    final List<PackageInfo> allInstalledPackages = packageManager.getInstalledPackages(PackageManager.GET_META_DATA);
    final Set<PackageInfo> filteredPackages = new HashSet();

    Drawable defaultActivityIcon = packageManager.getDefaultActivityIcon();

    for(PackageInfo each : allInstalledPackages) {
        if(ctx.getPackageName().equals(each.packageName)) {
            continue;  // skip own app
        }

        try {
            // add only apps with application icon
            Intent intentOfStartActivity = packageManager.getLaunchIntentForPackage(each.packageName);
            if(intentOfStartActivity == null)
                continue;

            Drawable applicationIcon = packageManager.getActivityIcon(intentOfStartActivity);
            if(applicationIcon != null && !defaultActivityIcon.equals(applicationIcon)) {
                filteredPackages.add(each);
            }
        } catch (PackageManager.NameNotFoundException e) {
            Log.i("MyTag", "Unknown package name " + each.packageName);
        }
    }

    return filteredPackages;
}

3
private static boolean isThisASystemPackage(Context context, PackageInfo  packageInfo ) {
        try {
            PackageInfo sys = context.getPackageManager().getPackageInfo("android", PackageManager.GET_SIGNATURES);
            return (packageInfo != null && packageInfo.signatures != null &&
                    sys.signatures[0].equals(packageInfo.signatures[0]));
        } catch (NameNotFoundException e) {
            return false;
        }
    }

2

मेरे पास एक और उपाय है:

ArrayList<AppInfo> myAppsToUpdate;

    // How to get the system and the user apps.
    public ArrayList<AppInfo> getAppsToUpdate() {

        PackageManager pm = App.getContext().getPackageManager();
        List<ApplicationInfo> installedApps = pm.getInstalledApplications(0);
        myAppsToUpdate = new ArrayList<AppInfo>();
        for (ApplicationInfo aInfo : installedApps) {

            if ((aInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
                // System apps 
            } else {
                // Users apps
                AppInfo appInfo = new AppInfo();
                appInfo.setAppName(aInfo.loadLabel(pm).toString());
                appInfo.setPackageName(aInfo.packageName);
                appInfo.setLaunchActivity(pm.getLaunchIntentForPackage(aInfo.packageName).toString());
                try {
                    PackageInfo info = pm.getPackageInfo(aInfo.packageName, 0);
                    appInfo.setVersionName(info.versionName.toString());
                    appInfo.setVersionCode("" + info.versionCode);
                    myAppsToUpdate.add(appInfo);
                } catch (NameNotFoundException e) {
                    Log.e("ERROR", "we could not get the user's apps");
                }

            }
        }
        return myAppsToUpdate;
    }

2

सभी एप्लिकेशन प्राप्त करें:

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

यदि इंस्टॉल किया गया एप्लिकेशन जांचें तो खोलें:

if((app.flags & (ApplicationInfo.FLAG_UPDATED_SYSTEM_APP | ApplicationInfo.FLAG_SYSTEM)) > 0) {
                String app_package = app.packageName;
Intent launchIntent = context.getPackageManager().getLaunchIntentForPackage(app_package);
context.startActivity(launchIntent);

0

आप इसका उपयोग कर सकते हैं:

PackageManager pm = getApplicationContext().getPackageManager();
                List<ResolveInfo> activityList = pm.queryIntentActivities(shareIntent, 0);
                for (final ResolveInfo app : activityList) 
                {
                   if ((app.activityInfo.name).contains("facebook")) 
                   {
                     // facebook  
                   }

                   if ((app.activityInfo.name).contains("android.gm")) 
                   {
                     // gmail  
                   }

                   if ((app.activityInfo.name).contains("mms")) 
                   {
                     // android messaging app
                   }

                   if ((app.activityInfo.name).contains("com.android.bluetooth")) 
                   {
                     // android bluetooth  
                   }
                }

0
public static List<ApplicationInfo> getApplications(Context context) {
    return context.getPackageManager().getInstalledApplications(PackageManager.GET_META_DATA);
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.