설치된 Android 애플리케이션 목록을 가져 와서 실행할 애플리케이션을 선택하는 방법


326

이번 주 초에 이와 비슷한 질문을했지만 설치된 모든 응용 프로그램 목록을 가져 와서 실행할 응용 프로그램을 선택하는 방법을 여전히 이해하고 있지 않습니다.

난 노력 했어:

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

이것은 사전 설치되었거나 인 ACTION_MAIN텐트 유형을 실행할 수있는 응용 프로그램 만 표시 합니다.

또한 PackageManager설치된 모든 응용 프로그램을 얻는 데 사용할 수 있지만 특정 응용 프로그램을 실행하는 데 어떻게 사용합니까?


목록에서 선택한 앱에 대한 정보 만 얻는 방법은 무엇입니까?
Pedrum

답변:


277

다음은 Android에 설치된 활동 / 응용 프로그램 목록을 가져 오는 코드입니다.

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 안에 activityInfo가 있지만 시작할 수 없습니다.
Spidey

1
신경 쓰지 마라. 전체 클래스 이름 (패키지 + 클래스)을 사용하여 새 인 텐트를 만들어야합니다.
Spidey

목록에서 선택한 앱에 대한 정보 만 얻는 방법은 무엇입니까?
Pedrum

1
내 앱이 모든 앱 목록을 읽고 저장하며 잠재적으로 서버와 통신하는 것에 대한 android / play store 정책을 이해하고 싶었습니다. 지침이 있습니까?
dowjones123 2016 년

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/


gr8 작동합니다. 그러나 안드로이드 4.0.3에서 이것을 시도했을 때 아무것도 인쇄되지 않습니다! 어떤 단서 ??
Saurabh Verma

디버그 로그 문을 필터링하지 않아야합니다.
QED

이 코드는 작동하지만 해당 응용 프로그램 목록을 ListView에 넣는 방법에 대한 아이디어가 있습니까?
androidBoomer

@androidBoomer 메신저도 마찬가지입니다. 여기를 읽으십시오 -vogella.com/tutorials/AndroidListView/article.html
David T.

@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
이것은 시스템 앱을 필터링하는 데 가장 적합한 답변입니다.
Bjorn

5
그러나 설정,지도 또는 ...와 같은 응용 프로그램을 필터링하지 않습니다. 목록을 표시하는 방법
Ata

7
답장

리턴 단순화 ((pkgInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM)! = 0);
Bhavesh Rangani

유료 앱을 필터링하는 방법?
Pemba Tamang

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
필요한 경우 그 중 하나를 어떻게 실행합니까? 당신은 의도를 얻을 수 있습니까?
Ton

큰. 답변 주셔서 감사합니다. 응용 프로그램에서 귀하의 답변을 사용했으며 아이콘 크기에 작은 문제가 있습니다. 대부분은 정상이며 일부는 매우 크거나 작습니다. 어떻게 고칠 수 있습니까? 당신은 어떤 아이디어가 있습니까? 감사합니다
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-installed-apps/를 참조하십시오.


이것은 요점에 가깝습니다. 필요한 앱을 찾아서 적절한 확인을 할 수 있습니다.
Noman

13

아래 코드를 사용하여 Android 장치에 설치된 앱 목록을 찾을 수 있습니다. "packageInfo"는 설치된 응용 프로그램 정보가 장치에 포함되어 있습니다. packageinfo 객체에서 설치된 응용 프로그램의 Intent를 검색하고 startactivity (intent)를 사용하여 응용 프로그램을 시작할 수 있습니다. 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", "update services"등)을 필터링해야합니다. 궁극적으로 앱 목록을 필터링하기 위해 다른 조건을 추가했습니다. 방금 앱에 '런처 의도'가 있는지 확인했습니다.

결과 코드는 다음과 같습니다.

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는 앱 서랍에 앱을 표시하는 데 매우 유용합니다 :-)
Gabriel Hautclocq

10

하나의 패키지에 여러 런처가있는 경우 위의 코드에 문제가 있습니다. 예 : LG 용 LG Optimus Facebook, LG 용 MySpace, LG 용 Twitter는 하나의 패키지 이름으로 SNS를 포함하며 위의 SNS를 사용하면 SNS가 반복됩니다. 몇 시간의 연구 끝에 아래 코드가 있습니다. 잘 작동하는 것 같습니다.

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 : 더 이상 해당 코드가 없지만 가까운 것을 발견했습니다. 내 응용 프로그램의 "구성 요소"를 검색하기 위해이 작업을 수행했으며 해당 범주의 활동 일뿐입니다.

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.