ইনস্টলড অ্যান্ড্রয়েড অ্যাপ্লিকেশনগুলির একটি তালিকা কীভাবে পাবেন এবং চালানোর জন্য একটি বাছাই করুন


325

আমি এই সপ্তাহের শুরুতে এটির কাছে একই ধরণের প্রশ্ন জিজ্ঞাসা করেছি তবে কীভাবে সমস্ত ইনস্টল থাকা অ্যাপ্লিকেশনগুলির একটি তালিকা পাবেন এবং তারপরে চালানোর জন্য একটি বাছাই করবেন তা আমি এখনও বুঝতে পারি না।

আমি চেষ্টা করেছিলাম:

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

এবং এটি কেবলমাত্র এমন অ্যাপ্লিকেশন দেখায় যা পূর্বেই ইনস্টল করা থাকে বা ACTION_MAINইন্টেন্ট প্রকারটি চালাতে পারে ।

আমি আরও জানি যে আমি PackageManagerইনস্টল করা সমস্ত অ্যাপ্লিকেশন পেতে ব্যবহার করতে পারি তবে একটি নির্দিষ্ট অ্যাপ্লিকেশন চালাতে আমি কীভাবে এটি ব্যবহার করব?


আপনি কীভাবে কেবল তালিকায় থাকা বাছাই করা অ্যাপ্লিকেশন সম্পর্কিত তথ্য পেতে পারেন?
পেড্রাম

উত্তর:


277

অ্যান্ড্রয়েডে ইনস্টল করা ক্রিয়াকলাপ / অ্যাপ্লিকেশনগুলির তালিকা পেতে কোডটি নিম্নরূপ:

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

আপনি ResolveInfoএকটি অ্যাপ্লিকেশন শুরু করতে প্রয়োজনীয় সমস্ত ডেটা পাবেন । আপনি ResolveInfoজাভাডোক এখানে পরীক্ষা করতে পারেন ।


3
আমি এইগুলির একটি কীভাবে শুরু করতে পারি? রেজলভ ইন্ফোর ভিতরে আমি ক্রিয়াকলাপ তথ্যটি পেয়েছি, তবে আমি এটি শুরু করতে পারি না।
স্পাইডি

1
কিছু নয়, খুঁজে পেয়েছি। আমার পুরো ক্লাসের নাম (প্যাকেজ + ক্লাস) ব্যবহার করে একটি নতুন ইন্টেন্ট তৈরি করা উচিত।
স্পাইডি

আপনি কীভাবে কেবল তালিকায় থাকা বাছাই করা অ্যাপ্লিকেশন সম্পর্কিত তথ্য পেতে পারেন?
পেড্রাম

1
আমি আমার অ্যাপ্লিকেশনটি পড়ার এবং সমস্ত অ্যাপ্লিকেশনগুলির একটি তালিকা সংরক্ষণ এবং অভাবনীয়ভাবে একটি সার্ভারের সাথে যোগাযোগ করার বিষয়ে অ্যান্ড্রয়েড / প্লে স্টোর নীতিটি বুঝতে চেয়েছিলাম। কোন নির্দেশিকা আছে?
dowjones123

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


ওয়ার 8 তবে অ্যান্ড্রয়েড 4.0.০.৩ এ চেষ্টা করার পরে কিছুই মুদ্রিত হয় না !! কোন সুত্র ??
সৌরভ ভার্মা

আপনি ডিবাগ লগ স্টেটমেন্টগুলি ফিল্টার করছেন না তা নিশ্চিত করুন।
কিড

এই কোডটি তবে কাজ করছে, অ্যাপ্লিকেশনগুলির সেই তালিকাটি একটি তালিকাভিউতে কীভাবে রাখবেন সে সম্পর্কে আপনার কোনও ধারণা আছে?
অ্যান্ড্রয়েডবুমার

@ অ্যান্ড্রয়েডবুমার একই কাজ করছে। এটি এখানে পড়ুন - vogella.com
অ্যান্ড্রয়েডলিস্টভিউ

@DavidT। আমি ইতিমধ্যে এটি সন্ধান। এখন, আমি কীভাবে আমার অ্যাপ্লিকেশনটির মধ্যে একটি শর্টকাট তৈরি করতে এই ইনস্টল করা অ্যাপ্লিকেশনটিকে অ্যাক্সেস করতে পারি তা নিয়ে কাজ করছি। এটা কি সম্ভব?
অ্যান্ড্রয়েডবুমার

61

সিস্টেম অ্যাপ্লিকেশনগুলিতে ফিল্টার করার আরেকটি উপায় (কিং 9981 এর উদাহরণ সহ কাজ করে):

/**
 * 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
তবে আমি সেটিংস, মানচিত্র বা ... এর মতো প্রশংসনীয় ফিল্টার করি, কীভাবে সেগুলিও তালিকাভুক্ত করা যায়
আতা

7
আপনার প্রত্যাবর্তনের বিবৃতিটির "? সত্য: মিথ্যা" অংশটি
রিডান্ট্যান্ট

সরলকরূপে রিটার্ন ((pkgInfo.applicationInfo.flags এবং অ্যাপ্লিকেশনআইএনফো। 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
আপনার যদি প্রয়োজন হয় তবে আপনি তাদের একজনকে কীভাবে কার্যকর করবেন? মানে, আপনি কি ইন্টেন্ট পেতে পারেন?
টন

গ্রেট। আপনার উত্তরের জন্য ধন্যবাদ. আমি আপনার অ্যাপ্লিকেশনটিতে আপনার উত্তরটি ব্যবহার করেছি এবং আইকনের আকার নিয়ে আমার একটি ছোট সমস্যা রয়েছে। তাদের বেশিরভাগই স্বাভাবিক এবং তাদের কয়েকটি খুব বড় বা ছোট। আমি কীভাবে এটি ঠিক করতে পারি। যদি আপনার কোন ধারণা আছে? ধন্যবাদ
মাইসাম ভ্যালুয়ান

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-installed-apps/


এটি বিষয়টি আরও বেশি। আমরা আমাদের প্রয়োজনীয় অ্যাপটি খুঁজে বের করে একটি যথাযথ চেক সেট করতে পারি।
নোমান

13

আপনি নীচে কোড, "প্যাকেজইনফো" ডিভাইসে ইনস্টলড অ্যাপ্লিকেশন তথ্য ধারণ করে অ্যান্ড্রয়েড ডিভাইসে ইনস্টলড অ্যাপ্লিকেশনগুলির তালিকা সন্ধান করতে পারেন। আমরা প্যাকেজিনফো অবজেক্ট থেকে ইনস্টল করা অ্যাপ্লিকেশনটির জন্য ইন্টেন্ট পুনরুদ্ধার করতে পারি এবং স্টার্টাকটিভিটি (অভিপ্রায়) ব্যবহার করে অ্যাপ্লিকেশন শুরু করতে পারি। আপনি কীভাবে ইউআইটিকে তালিকাভুক্তি বা গ্রিডভিউ থেকে সংগঠিত করবেন এটি আপনার উপর নির্ভর করে। সুতরাং অবস্থানের উপর ভিত্তি করে ইভেন্ট ইভেন্ট ক্লিক করুন, আপনি অভিপ্রায় বস্তু পুনরুদ্ধার করতে পারেন এবং ক্রিয়াকলাপ অভিপ্রায় শুরু করতে পারেন।

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);
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.