Yüklü android uygulamalarının bir listesini almak ve çalıştırmak için nasıl seçilir


326

Bu hafta başlarında buna benzer bir soru sordum, ancak hala yüklü tüm uygulamaların bir listesini nasıl alacağımı ve sonra çalıştırılacak birini seçemiyorum.

Denedim:

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

ve bu yalnızca önceden yüklenmiş veya ACTION_MAINNiyet türünü çalıştırabilen uygulamayı gösterir .

Ayrıca PackageManager, yüklü tüm uygulamaları almak için kullanabileceğimi biliyorum , ancak bunu belirli bir uygulamayı çalıştırmak için nasıl kullanabilirim?


Listeden yalnızca seçilen uygulama hakkında nasıl bilgi edinebilirsiniz?
Pedrum

Yanıtlar:


277

Android'de yüklü etkinliklerin / uygulamaların listesini almak için kod aşağıdadır:

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

ResolveInfoBir uygulamayı başlatmak için gerekli tüm verileri alacaksınız . ResolveInfoJavadoc'u buradan kontrol edebilirsiniz .


3
Bunlardan birine nasıl başlayabilirim? ResistveInfo içinde activityInfo aldım, ancak başlatamıyorum.
Spidey

1
Boşver, buldum. Tam sınıf adını (package + class) kullanarak yeni bir niyet oluşturmalıyım.
Spidey

Listeden yalnızca seçilen uygulama hakkında nasıl bilgi edinebilirsiniz?
Pedrum

1
Uygulamamın tüm uygulamaların bir listesini okuma ve saklama ve potansiyel olarak bir sunucuyla iletişim kurma hakkındaki android / play store politikasını anlamak istedim. Herhangi bir yönerge var mı?
dowjones123

1
@ dowjones123 Bununla ilgili yönergeleri buldunuz mu?
RmK

415

İşte kullanarak daha temiz bir yol 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() 

Burada daha fazla bilgi http://qtcstation.com/2011/02/how-to-launch-another-app-from-your-app/


İşler gr8. Ancak bunu Android 4.0.3'te denediğinde, hiçbir şey yazdırılmıyor !! Bir ipucu ??
Saurabh Verma

Hata ayıklama günlüğü deyimlerini filtrelemediğinizden emin olun.
QED

Ancak bu kod çalışıyor, bir uygulama listesi nasıl ListView koymak hakkında bir fikrin var mı?
androidBoomer

@androidBoomer aynı şeyi yapıyorum. bunu buradan okuyun - vogella.com/tutorials/AndroidListView/article.html
David T.

@DavidT. Zaten anladım. Şimdi, Uygulamamın içinde bir kısayol oluşturmak için yüklü uygulamalara nasıl erişebileceğim üzerinde çalışıyorum. Mümkün mü?
androidBoomer

61

Sistem uygulamalarını filtrelemenin başka bir yolu (king9981 örneğiyle çalışır):

/**
 * 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
Sistem uygulamalarını filtrelemek için en iyi yanıt budur.
Bjorn

5
Ama ayarları, haritaları veya ... gibi aplikleri filtrelemem, onları nasıl listeleyeceğim
Ata

7
İade
ifadenizin

dönüşü basitleştir ((pkgInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM)! = 0);
Bhavesh Rangani

ücretli uygulamalar nasıl filtrelenir?
Pemba Tamang

55

İşte iyi bir örnek:

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
Gerekirse bunlardan birini nasıl uygularsınız? Yani, Niyeti alabilir misin?
Ton

Harika. Cevabınız için teşekkürler. Cevabımı başvurumda kullandım ve simge boyutuyla ilgili küçük bir sorunum var. çoğu normal ve bazıları çok büyük veya küçük. Bunu nasıl düzeltebilirim. Herhangi bir fikrin var mı? teşekkürler
Meysam Valueian

36

Yüklü sistem dışı uygulamaların listesini alma

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

Sistem tabanlı uygulamalara filtre uygulamak için:

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

18

Tüm yüklü uygulamaları almak için Paket Yöneticisi'ni kullanabilirsiniz.

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

Çalıştırmak için paket adını kullanabilirsiniz

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

Daha fazla ayrıntı için bu blogu okuyabilirsiniz http://codebucket.co.in/android-get-list-of-all-installed-apps/


Bu daha da önemli. Biz gerekli app bularak uygun bir kontrol ayarlayabilirsiniz.
Noman

13

Yüklü uygulamaların listesini "packageInfo" Cihazında Yüklü Uygulama Bilgilerini İçerir kodunu kullanarak Android Cihazda bulabilirsiniz. packageinfo nesnesinden yüklenen uygulama için Niyeti kaldırabiliriz ve startactivity (intent) kullanarak uygulamayı başlatabiliriz. UI'yi Listview veya Gridview şeklinde nasıl düzenleyeceğiniz size bağlıdır. konuma dayalı tıklama etkinliğinde, amaç nesnesini geri çekebilir ve etkinlik amacını başlatabilirsiniz.

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

Kullanıcının gerçekten kullanmadığı sistem uygulamalarını filtreleme gereksinimim vardı (örn. "Com.qualcomm.service", "güncelleme hizmetleri", vb.). Sonuçta uygulama listesini filtrelemek için başka bir koşul ekledim. Ben sadece uygulamanın 'başlatıcı niyeti' olup olmadığını kontrol ettim.

Sonuçta ortaya çıkan kod ...

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

        }

Teşekkürler. GetLaunchIntentForPackage, Uygulama Çekmecesinde mevcut olan uygulamaları almak için çok kullanışlıdır :-)
Gabriel Hautclocq

10

Yukarıdaki bir pakette birden fazla başlatıcı varsa kodun bir sorunu vardır. Örn: LG için LG Optimus Facebook, LG için MySpace, LG için Twitter SNS tek bir paket adı içerir ve yukarıdaki SNS kullanırsanız tekrar eder. Saatlerce araştırma yaptıktan sonra aşağıdaki kodla geldim. İyi çalışıyor gibi görünüyor.

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: Artık bu kodum yok, ama yakın bir şey buldum. Uygulamamın "bileşenlerini" aramak için bunu yaptım, sadece belirli bir kategoriye sahip etkinlikler.

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

Etkinlik adını aldığı kısmı yorumladım, ancak oldukça basit.


6

Sistem uygulamalarını başarıyla filtreleyen temiz çözüm

Bu çözümün arkasındaki fikir, her sistem uygulamasının ana etkinliğinin özel bir etkinlik simgesine sahip olmamasıdır . Bu yöntem bana mükemmel bir sonuç veriyor:

 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

Başka bir çözümüm var:

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

Tüm uygulamaları edinin:

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

Yüklü uygulamanın olup olmadığını kontrol edin ve açın:

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

bunu kullanabilirsiniz:

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);
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.