Cách nhận danh sách các ứng dụng Android đã cài đặt và chọn một ứng dụng để chạy


326

Tôi đã hỏi một câu hỏi tương tự như vậy vào đầu tuần này nhưng tôi vẫn không hiểu làm thế nào để có được danh sách tất cả các ứng dụng đã cài đặt và sau đó chọn một ứng dụng để chạy.

Tôi đã thử:

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

và điều này chỉ hiển thị ứng dụng được cài đặt sẵn hoặc có thể chạy ACTION_MAINloại Ý định.

Tôi cũng biết tôi có thể sử dụng PackageManagerđể tải tất cả các ứng dụng đã cài đặt, nhưng làm cách nào để sử dụng ứng dụng này để chạy một ứng dụng cụ thể?


Làm thế nào bạn chỉ có thể nhận được thông tin về ứng dụng đã chọn trong danh sách?
Pedrum

Câu trả lời:


277

Sau đây là mã để nhận danh sách các hoạt động / ứng dụng được cài đặt trên Android:

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

Bạn sẽ nhận được tất cả các dữ liệu cần thiết ResolveInfođể bắt đầu một ứng dụng. Bạn có thể kiểm tra ResolveInfojavadoc tại đây .


3
Làm thế nào tôi có thể bắt đầu một trong những điều này? Tôi đã nhận được ActivityInfo bên trong ResolveInfo, nhưng tôi không thể quản lý để bắt đầu nó.
Spidey

1
Nevermind, tìm thấy nó. Tôi nên tạo một Ý định mới bằng cách sử dụng tên lớp đầy đủ (gói + lớp).
Spidey

Làm thế nào bạn chỉ có thể nhận được thông tin về ứng dụng đã chọn trong danh sách?
Pedrum

1
Tôi muốn hiểu chính sách cửa hàng android / play về ứng dụng của tôi đọc và lưu trữ danh sách tất cả các ứng dụng và có khả năng giao tiếp với máy chủ. Có hướng dẫn nào không?
dowjones123

1
@ dowjones123 Bạn có tình cờ tìm thấy các hướng dẫn liên quan đến việc này không?
RmK

415

Đây là một cách sạch hơn bằng cách sử dụng 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() 

Thêm thông tin tại đây http://qtcstation.com/2011/02/how-to-launch-another-app-from-your-app/


Công trình gr8. Nhưng khi thử điều này trên Android 4.0.3, không có gì được in !! Có manh mối nào không ??
Saurabh Verma

Hãy chắc chắn rằng bạn không lọc ra các báo cáo nhật ký gỡ lỗi.
QED

Mã này đang hoạt động, tuy nhiên, bạn có ý tưởng nào về cách đưa các danh sách ứng dụng đó vào ListView không?
androidBoomer

@androidBoomer tôi cũng làm như vậy. đọc cái này ở đây - vogella.com/tutorials/AndroidListView/article.html
David T.

@DavidT. Tôi đã tìm ra nó. Bây giờ, tôi đang nghiên cứu làm thế nào tôi có thể truy cập các ứng dụng đã cài đặt đó để tạo lối tắt bên trong Ứng dụng của mình. Điều đó có thể không?
androidBoomer

61

Một cách khác để lọc trên các ứng dụng hệ thống (hoạt động với ví dụ về 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
Đây là câu trả lời tốt nhất để lọc các ứng dụng hệ thống.
Bjorn

5
Nhưng tôi không lọc các ứng dụng như cài đặt, bản đồ hoặc ..., làm thế nào để liệt kê chúng
Ata

7
Phần "? True: false" trong bảng sao kê hoàn trả của bạn là dự phòng
k2col

đơn giản hóa lợi nhuận ((pkgInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM)! = 0);
Bhavesh Rangani

Làm thế nào để lọc các ứng dụng phải trả tiền?
Pemba Tamang

55

Đây là một ví dụ tốt:

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
Làm thế nào để bạn thực hiện một trong những nếu bạn cần? Ý tôi là, bạn có thể có được ý định?
Tôn

Tuyệt quá. Cảm ơn câu trả lời của bạn. Tôi đã sử dụng câu trả lời của bạn trong ứng dụng của tôi và tôi có một vấn đề nhỏ với kích thước của biểu tượng. hầu hết trong số họ là bình thường và một số trong số họ là rất lớn hoặc nhỏ. Lam sao tôi co thể sửa no. Bạn còn ý kiến ​​nào không? cảm ơn
Meysam Valueian

36

Lấy danh sách các ứng dụng phi hệ thống đã cài đặt

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

Để lọc các ứng dụng dựa trên sytem:

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

18

Để có được các ứng dụng đã cài đặt, bạn có thể sử dụng Trình quản lý gói ..

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

Để chạy, bạn có thể sử dụng tên gói

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

Để biết thêm chi tiết, bạn có thể đọc blog này http://codebucket.co.in/android-get-list-of-all-installed-apps/


Điều này là nhiều hơn đến điểm. Chúng tôi có thể thiết lập một kiểm tra thích hợp bằng cách tìm ra ứng dụng cần thiết của chúng tôi.
Noman

13

Bạn có thể Tìm Danh sách các ứng dụng đã cài đặt trong Thiết bị Android bằng cách sử dụng mã bên dưới, "packInfo" Chứa thông tin ứng dụng đã cài đặt trong thiết bị. chúng ta có thể truy cập lại Ý định cho ứng dụng được cài đặt từ đối tượng packinfo và bằng cách sử dụng tính khởi động (ý định), có thể khởi động ứng dụng. tùy thuộc vào cách bạn tổ chức UI hoặc Listview hoặc Gridview. vì vậy, khi nhấp vào sự kiện dựa trên vị trí, bạn có thể truy xuất lại đối tượng mục đích và bắt đầu ý định hoạt động.

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

Tôi có một yêu cầu để lọc ra các ứng dụng hệ thống mà người dùng không thực sự sử dụng (ví dụ: "com.qualcomm.service", "dịch vụ cập nhật", v.v.). Cuối cùng, tôi đã thêm một điều kiện để lọc xuống danh sách ứng dụng. Tôi chỉ kiểm tra xem ứng dụng có 'ý định khởi chạy' hay không.

Vì vậy, mã kết quả trông giống như ...

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);
            }

        }

Cảm ơn. GetLaunchIntentForPackage rất hữu ích để có được các ứng dụng có trong Ngăn kéo ứng dụng :-)
Gabriel Hautclocq

10

Nếu có nhiều launcher trong một gói ở trên, mã có vấn đề. Ví dụ: trên LG Optimus Facebook cho LG, MySpace cho LG, Twitter cho LG chứa trong một gói tên SNS và nếu bạn sử dụng SNS ở trên sẽ lặp lại. Sau nhiều giờ nghiên cứu tôi đã đi kèm với mã dưới đây. Có vẻ để làm việc tốt.

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

@Jas: Tôi không có mã đó nữa, nhưng tôi đã tìm thấy một cái gì đó gần gũi. Tôi đã thực hiện điều này để tìm kiếm "các thành phần" trong ứng dụng của mình, chúng chỉ là các hoạt động với một danh mục nhất định.

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

Tôi đã nhận xét phần có tên hoạt động, nhưng nó khá đơn giản.


6

Làm sạch giải pháp lọc thành công các ứng dụng hệ thống

Ý tưởng đằng sau giải pháp này là hoạt động chính của mọi ứng dụng hệ thống không có biểu tượng hoạt động tùy chỉnh . Phương pháp này mang lại cho tôi một kết quả tuyệt vời:

 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

Tôi có một giải pháp khác:

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

Nhận tất cả các ứng dụng:

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

Kiểm tra nếu cài đặt ứng dụng rồi mở:

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

bạn có thể sử dụng cái này:

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);
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.