IT_Programming/Android_Java

android.os.TransactionTooLargeException 오류 대응 및 시스템 앱 구별방법

JJun ™ 2015. 8. 1. 12:12





 public static List<PackageInfo> getInstalledPackages(Context context, int flags) {

final PackageManager pm = context.getPackageManager();

try {

return pm.getInstalledPackages(flags);

} catch (Exception ignored) {

//we don't care why it didn't succeed. We'll do it using an alternative way instead

}

// use fallback:

Process process;

List<PackageInfo> result = new ArrayList<>();

BufferedReader bufferedReader = null;

try {

process = Runtime.getRuntime().exec("pm list packages");

bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));

String line;

while ((line = bufferedReader.readLine()) != null) {

final String packageName = line.substring(line.indexOf(':') + 1);

final PackageInfo packageInfo = pm.getPackageInfo(packageName, flags);

result.add(packageInfo);

}

process.waitFor();

} catch (Exception e) {

e.printStackTrace();

} finally {

if (bufferedReader != null)

try {

bufferedReader.close();

} catch (IOException e) {

e.printStackTrace();

}

}

return result;

 }










 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) {

}

 }




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 {

    // 서드파티 어플

}