Cara mendapatkan daftar aplikasi Android yang terinstal dan memilih satu untuk dijalankan

326

Saya mengajukan pertanyaan yang mirip dengan ini awal pekan ini, tetapi saya masih tidak mengerti bagaimana cara mendapatkan daftar semua aplikasi yang diinstal dan kemudian memilih satu untuk dijalankan.

Saya sudah mencoba:

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

dan ini hanya menunjukkan aplikasi yang sudah diinstal sebelumnya atau dapat menjalankan ACTION_MAINjenis Intent.

Saya juga tahu saya bisa menggunakan PackageManageruntuk mendapatkan semua aplikasi yang terinstal, tetapi bagaimana saya menggunakan ini untuk menjalankan aplikasi tertentu?

2Real
sumber
Bagaimana Anda hanya bisa mendapatkan informasi tentang aplikasi yang dipilih dalam daftar?
Pedrum

Jawaban:

277

Berikut ini adalah kode untuk mendapatkan daftar kegiatan / aplikasi yang diinstal di Android:

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

Anda akan mendapatkan semua data yang diperlukan ResolveInfountuk memulai aplikasi. Anda dapat memeriksa ResolveInfojavadoc di sini .

Karan
sumber
3
Bagaimana saya bisa memulai salah satunya? Saya mendapat activityInfo di dalam ResolveInfo, tapi saya tidak bisa memulainya.
Spidey
1
Nevermind, menemukannya. Saya harus membuat Intent baru menggunakan nama kelas lengkap (paket + kelas).
Spidey
Bagaimana Anda hanya bisa mendapatkan informasi tentang aplikasi yang dipilih dalam daftar?
Pedrum
1
Saya ingin memahami kebijakan android / play store tentang aplikasi saya membaca dan menyimpan daftar semua aplikasi, dan berpotensi berkomunikasi dengan server. Apakah ada pedoman?
dowjones123
1
@ dowjones123 Apakah Anda kebetulan menemukan pedoman tentang ini?
RmK
415

Berikut cara bersih menggunakan 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() 

Info lebih lanjut di sini http://qtcstation.com/2011/02/how-to-launch-another-app-from-your-app/

Nelson Ramirez
sumber
Bekerja gr8. Tetapi ketika mencoba ini di Android 4.0.3, tidak ada yang dicetak !! Ada petunjuk ??
Saurabh Verma
Pastikan Anda tidak memfilter pernyataan log debug.
QED
Namun kode ini berfungsi, apakah Anda punya ide tentang cara menempatkan daftar aplikasi tersebut di ListView?
androidBoomer
@androidBoomer saya melakukan hal yang sama. baca ini di sini - vogella.com/tutorials/AndroidListView/article.html
David T.
@ DavidT. Saya sudah menemukan jawabannya. Sekarang, saya sedang mengerjakan bagaimana cara mengakses aplikasi yang diinstal itu untuk membuat pintasan di dalam Aplikasi saya. Apakah itu mungkin?
androidBoomer
61

Cara lain untuk memfilter pada aplikasi sistem (berfungsi dengan contoh 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);
}
Kenneth Evans
sumber
4
Ini adalah jawaban terbaik untuk memfilter aplikasi sistem.
Bjorn
5
Tapi saya akan memfilter aplikasi seperti pengaturan, peta, atau ..., bagaimana cara mendaftarkannya juga
Ata
7
Bagian "? True: false" dari pernyataan pengembalian Anda adalah mubazir
k2col
sederhanakan pengembalian ((pkgInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM)! = 0);
Bhavesh Rangani
cara memfilter aplikasi berbayar?
Pemba Tamang
55

Berikut contoh yang bagus:

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; 
}
king9981
sumber
1
Bagaimana Anda mengeksekusi salah satu dari itu jika perlu? Maksud saya, bisakah Anda mendapatkan Intent?
Ton
Bagus. Terima kasih atas jawaban anda. Saya telah menggunakan jawaban Anda di aplikasi saya dan saya punya masalah kecil dengan ukuran ikon. kebanyakan dari mereka normal dan beberapa dari mereka sangat besar atau kecil. Bagaimana saya bisa memperbaikinya? Apakah kamu punya ide? terima kasih
Meysam Valueian
37

Mendapatkan daftar aplikasi non-sistem yang diinstal

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);
        }
    }
}
XXX
sumber
19

Untuk memfilter pada aplikasi berbasis sistem:

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

Untuk mendapatkan semua aplikasi yang terinstal, Anda dapat menggunakan Package Manager ..

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

Untuk menjalankannya Anda bisa menggunakan nama paket

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

Untuk detail lebih lanjut Anda dapat membaca blog ini http://codebucket.co.in/android-get-list-of-all-installed-apps/

Arvind
sumber
Ini lebih tepatnya. Kita dapat menetapkan pemeriksaan yang tepat dengan mencari tahu aplikasi yang diperlukan.
Noman
13

Anda dapat Menemukan Daftar aplikasi yang diinstal di Perangkat Android dengan menggunakan kode di bawah ini, "packageInfo" Berisi Informasi Aplikasi yang Terpasang di Perangkat. kita dapat mengambil Intent untuk aplikasi yang diinstal dari objek packageinfo dan dengan menggunakan startactivity (maksud), dapat memulai aplikasi. terserah Anda bagaimana Anda mengatur UI baik Listview atau Gridview. jadi pada acara klik berdasarkan posisi, Anda dapat menarik kembali objek maksud dan memulai niat aktivitas.

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

}
}
Prashant Agrawal
sumber
13

Saya memiliki persyaratan untuk memfilter aplikasi sistem yang pengguna tidak benar-benar gunakan (mis. "Com.qualcomm.service", "layanan pembaruan", dll). Akhirnya saya menambahkan kondisi lain untuk menyaring daftar aplikasi. Saya baru saja memeriksa apakah aplikasi tersebut memiliki 'maksud peluncur'.

Jadi, kode yang dihasilkan seperti ...

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

        }
joecizac
sumber
Terima kasih. GetLaunchIntentForPackage sangat berguna untuk mendapatkan aplikasi yang ada di App Drawer :-)
Gabriel Hautclocq
10

Jika ada beberapa peluncur dalam satu paket kode di atas memiliki masalah. Misalnya: di LG Optimus Facebook untuk LG, MySpace untuk LG, Twitter untuk LG berisi dalam satu paket nama SNS dan jika Anda menggunakan SNS di atas akan diulang. Setelah berjam-jam penelitian saya datang dengan kode di bawah ini. Tampaknya bekerja dengan baik.

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

@ James: Saya tidak punya kode itu lagi, tapi saya sudah menemukan sesuatu yang dekat. Saya membuat ini untuk mencari "komponen" dari aplikasi saya, mereka hanya kegiatan dengan kategori tertentu.

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

Saya sudah mengomentari bagian di mana ia mendapatkan nama aktivitas, tapi itu cukup mudah.

Spidey
sumber
6

Solusi bersih yang menyaring aplikasi sistem yang berhasil

Gagasan di balik solusi ini adalah bahwa aktivitas utama setiap aplikasi sistem tidak memiliki ikon aktivitas khusus . Metode ini memberi saya hasil yang sangat baik:

 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;
}
funcoder
sumber
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;
        }
    }
pengguna1546570
sumber
2

Saya punya solusi lain:

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;
    }
Victor Ruiz.
sumber
2

Dapatkan Semua aplikasi:

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

Periksa apakah aplikasi yang diinstal kemudian buka:

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);
Chandra Agarwala
sumber
0

Anda bisa menggunakan ini:

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  
                   }
                }
Akshay Paliwal
sumber
0
public static List<ApplicationInfo> getApplications(Context context) {
    return context.getPackageManager().getInstalledApplications(PackageManager.GET_META_DATA);
}
Reza
sumber