【问题标题】:android.os.TransactionTooLargeException retrieving installed applicationsandroid.os.TransactionTooLargeException 检索已安装的应用程序
【发布时间】:2014-10-16 02:39:26
【问题描述】:

我正在恢复设备上安装的所有应用程序,但我偶然发现了这个错误。

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

阅读堆栈溢出我知道这可能是由于您安装了许多应用程序造成的。现在的问题是,你怎么解决?有什么解决办法吗?如果是,是哪一个?谢谢。

【问题讨论】:

  • 我在 Google 的发布前报告云测试实验室的 Nexus 5 上调用 PackageManager.getInstalledPackages(PackageManager.GET_ACTIVITIES) 时遇到了完全相同的错误。

标签: java android xml


【解决方案1】:

我正在寻找相同的解决方案。有什么方法可以列出已安装应用程序的部分列表吗?

我的应用也有同样的问题。

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$Stub$Proxy.getInstalledPackages(IPackageManager.java:2363)

更新!

我想出了一个办法。请参阅我在另一篇文章中给出的答案:

Package manager has died

【讨论】:

  • 您能告诉我有多少应用程序会触发此问题?
猜你喜欢
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
  • 2021-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多