2014-02-09 3 views
8

Я восстанавливаю все приложения, установленные на устройстве, и я наткнулся на эту ошибку.android.os.TransactionTooLargeException Получение установленных приложений

java.lang.RuntimeException: An error occured while executing doInBackground() 
at android.os.AsyncTask$3.done(AsyncTask.java:300) 
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355) 
at java.util.concurrent.FutureTask.setException(FutureTask.java:222) 
at java.util.concurrent.FutureTask.run(FutureTask.java:242) 
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
at java.lang.Thread.run(Thread.java:811) 
Caused by: java.lang.RuntimeException: Package manager has died 
at android.app.ApplicationPackageManager.queryIntentActivitiesAsUser(ApplicationPackageManager.java:499) 
at android.app.ApplicationPackageManager.queryIntentActivities(ApplicationPackageManager.java:485) 
at com.name.package.MyClass$RetrieveApps.doInBackground(MyClass.java:363) 
at com.name.package.MyClass$RetrieveApps.doInBackground(MyClass.java:1) 
at android.os.AsyncTask$2.call(AsyncTask.java:288) 
at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
... 4 more 
Caused by: android.os.TransactionTooLargeException 
at android.os.BinderProxy.transact(Native Method) 
at android.content.pm.IPackageManager$Stub$Proxy.queryIntentActivities(IPackageManager.java:2165) 
at android.app.ApplicationPackageManager.queryIntentActivitiesAsUser(ApplicationPackageManager.java:493) 
... 9 more 

В методе doInBackground() я использую этот код для извлечения установленных приложений.

PackageManager packageManager = getPackageManager(); 
    List<ResolveInfo> mResolveInfo; 
    Intent queryIntent = new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_LAUNCHER); 
    mResolveInfo = packageManager.queryIntentActivities(queryIntent, 0); 
    for (ResolveInfo ri : resolveInfos) { 
     Class class = new Class(); 
     class.icon = ri.loadIcon(packageManager); 
     class.label = ri.loadLabel(packageManager); 
     class.packagename = ri.activityInfo.packageName; 
     class.packageclass = ri.activityInfo.name; 
     class.componentName = new ComponentName(class.packagename, class.packageclass); 
     Intent i = new Intent(Intent.ACTION_MAIN); 
     i.addCategory(Intent.CATEGORY_LAUNCHER); 
     i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); 
     i.setComponent(ai.componentName); 
     class.intent = i; 
     myArrayList.add(class); 

линия, где происходит сбой заключается в следующем:

mResolveInfo = packageManager.queryIntentActivities(queryIntent, 0); 

Чтение на переполнение стека, я понимаю, что это может быть вызвано тем, что у вас установлено много приложений. Вопрос в том, как вы можете решить? Есть ли решение? Если да, то какой? Благодарю.

+0

я получил точно такую ​​же ошибку при вызове 'PackageManager.getInstalledPackages (PackageManager.GET_ACTIVITIES)' на Nexus 5 в предпусковой тест облако отчет лаборатории Google. – Sam

ответ

3

Я ищу то же решение. Есть ли способ сделать частичный список установленных приложений?

У меня такая же проблема в моем приложении.

List<PackageInfo> packs = pm.getInstalledPackages(0); 

Если пользователь имеет большое количество приложений, я получаю это в LogCat:

Вызванный: java.lang.RuntimeException: менеджер пакетов умер в android.app.ApplicationPackageManager.getInstalledPackages (ApplicationPackageManager .java: 424)

Вызванный: android.os.TransactionTooLargeException на android.os.BinderProxy.transact (нативный метод) на android.content.pm.IPackageManager $ $ Proxy.getInstalledPackages Stub (IPackageManager.java: 2363)

Обновление!

Я был в состоянии выяснить путь. Смотрите этот ответ, который я дал в другом посте:

Package manager has died

+1

Не могли бы вы рассказать мне, какое количество приложений может вызвать эту проблему? –

Смежные вопросы