마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

설치된 패키지 목록 뽑는 방법

0 추천

private void getPackageList() {

PackageManager pm = this.getPackageManager();

 

List<PackageInfo> packs =                   getPackageManager().getInstalledPackages(PackageManager.PERMISSION_GRANTED);

for (PackageInfo pack : packs) {

Log.d("TAG", "| name    : " + pack.packageName);

      Log.d("TAG", "| package : " + pack.packageName);

      Log.d("TAG", "| version : " + pack.versionName);

}

}

 

기존에 이렇게 뽑고 있는데요,

 

이렇게 뽑으니 사용자가 설치한 어플 제외하고도

 

제휴 어플리케이션과 시스템 어플리케이션의 package까지 모두 출력해서

 

한 300개정도가 뽑히더라구요

 

혹시 사용자가 설치하 어플리케이션 목록만 뽑아오는 방법이 있을까요 ??

음무 (17,820 포인트) 님이 2014년 4월 11일 질문

3개의 답변

+2 추천
 
채택된 답변
List<ApplicationInfo> mPackageApps = new ArrayList<ApplicationInfo>();
 
 
 
//설치된 모든앱 리스트를 가져온다.
final PackageManager pm = context.getPackageManager();
List<ApplicationInfo> packages = pm.getInstalledApplications(PackageManager.GET_META_DATA);
 
for (ApplicationInfo packageInfo : packages) {
                //실행되는 앱들만 null이아니다.
                Intent intent = getPackageManager().getLaunchIntentForPackage(packageInfo.packageName);
                if (intent!=null) {
                    mPackageApps.add(packageInfo);
                }
            }
whdrb19 (23,520 포인트) 님이 2014년 4월 11일 답변
음무님이 2014년 4월 11일 채택됨
감사합니다. 300몇십개 되던 패키지가 100개정도로 줄어들었네요

그런데 버전은 안나오는것같은데 버전은 어떻게뽑을 수 있나요 ?
이 방법은 시스템 어플을 판정하는게 아니라 실행 가능한 (런처가 존재하는) 어플을 판정하는거라 시스템 어플이라도 런처가 있다면 목록에 추가되는 문제가 있을 듯 합니다 (연락처라던가 메일이라던가..) 그리고 반대로 런처가 없는 어플인 경우 유저가 설치한 어플이라도 제외되어버리는 문제도 있을듯 합니다
반드시 설치한어플만 뽑으려는건 아닙니다. 가능한 갯수를줄이려고하는건데, 설치한어플임에도 나타나지 않는다면 문제가 생깁니다.
그런 예외가 발생한다면 어쩔수없이 통째로 뽑아야하겠네요..
답변 감사합니다
가능한 갯수를 줄인다는 말씀만으로는 리스트 필터링의 의도를 알기 힘듭니다; 뽑을 리스트의 범위, 뽑는 목적, 이유등을 알지 못하는 상태로는 원하시는 답변은 힘드네요; 여튼 whdrb19님 답변이랑 제 답변이랑 조합하면 대충 범위 조절 가능할 듯 합니다. 그럼 즐거운 하루 되세요 :)
PackageManager pm = getPackageManager();
        //설치되어있는 모든목록의 앱리스트를 가져온다.
        List<PackageInfo> packages = pm.getInstalledPackages(PackageManager.GET_META_DATA);
        for (PackageInfo packageInfo : packages) {
            ApplicationInfo applicationInfo = packageInfo.applicationInfo;
            int versionCode = packageInfo.versionCode;//버전코드
            String versionName = packageInfo.versionName;//버전이름
            int flags = packageInfo.applicationInfo.flags;//=> 해당앱에 어떤flags값이 있는지 판단하여 쓰면됨.
            
            //만약에 Application목록에 액티비티에 어떤filter값이 있는지 판단할려면?
            //쿼리를 날려 모든앱들의 액티비티에 intent-filter설정에따라 Activity목록들을 가져온다.
            final Intent intent = new Intent(Intent.ACTION_MAIN, null);
            intent.addCategory(Intent.CATEGORY_LAUNCHER);
            final List<ResolveInfo> pkgAppsList = getPackageManager().queryIntentActivities(intent, 0);//해당 액티비티에 어떤 값이있는지 query를 날려준다.
            for (ResolveInfo resolveInfo : pkgAppsList) {
                
            }
        }
+1 추천
아마 PackageManager.getInstalldPackages(int Flag)에서 플래그 값을 바꿔주면 원하는 목록을 가져 올수 있을거라 생각합니다.
q1212 (26,020 포인트) 님이 2014년 4월 11일 답변
+1 추천

ApplicationInfo 로 아래와 같이 판정 가능합니다. ApplicationInfo 는 패키지명으로 구할수 있습니다.

https://developer.android.com/reference/android/content/pm/PackageManager.html#getApplicationInfo(java.lang.String, int)

if((ai.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
	if((ai.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0) {
		// 마켓에서 업데이트 된 시스템 어플
	} else {
		// 시스템 어플
	}
} else {
	// 서드파티 어플
}

 

레미_21 (2,920 포인트) 님이 2014년 4월 11일 답변
답변감사합니다. 패키지를 뽑는 범위는 제가 직접 설치한 어플 리스트만 표시하는게 목적입니다. 써주신 답변을 토대로 적용해보겠습니다
...