检索已安装应用程序时发生android.os.TransactionTooLargeException异常

8
我正在恢复设备上安装的所有应用程序,但遇到了此错误。
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);

从Stack Overflow的阅读中,我了解到这可能是由于您安装了许多应用程序所导致的。现在的问题是,你该如何解决?有没有解决方案?如果有,那个是什么?谢谢。


我在谷歌的预发布报告云测试实验室中,在 Nexus 5 上调用 PackageManager.getInstalledPackages(PackageManager.GET_ACTIVITIES) 时遇到了完全相同的错误。 - Sam
1个回答

3

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

我的应用程序也遇到了同样的问题。

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

如果用户安装了大量应用程序,我在logcat中会看到以下内容:

Caused by: java.lang.RuntimeException: Package manager has died at android.app.ApplicationPackageManager.getInstalledPackages(ApplicationPackageManager.java:424)

Caused by: android.os.TransactionTooLargeException at android.os.BinderProxy.transact(Native Method) at android.content.pm.IPackageManager$Stub$Proxy.getInstalledPackages(IPackageManager.java:2363)

更新!

我找到了一种方法。请参见我在另一篇帖子中提供的答案:

Package manager has died


1
请问有多少个应用程序会触发这个问题? - android developer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接