gpt4 book ai didi

android - 尝试获取已安装的应用程序列表时出现 TransactionTooLargeException

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:37:59 25 4
gpt4 key购买 nike

作为我的应用程序的一部分,我通过使用 ApplicationPackageManager.getInstalledApplications 获得了设备上安装的应用程序列表,但对于某些用户,我收到的崩溃报告是这样说的

android.osBinderProxy.tranasact( native 方法)出现 TransactionTooLargeException

谁能想到我为什么要得到这个?

最佳答案

我发现这在 Android 5.1 上已解决(证明 here,搜索“修复包管理器 TransactionTooLargeExceptions”),因为它在多个地方被报告:

但是,我想在 5.1 之前解决这个问题,所以我想出了一个解决方案(并建议 Google 将其放在支持库中,在这里)。这是我建议的简短代码版本:

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

它是做什么的,先用官方的方式尝试,如果失败了,就用ADB命令拉取包名,依次获取各个应用的信息。

它比官方的慢很多,但对我来说并没有崩溃。我已经在 Android 模拟器(2.3.x 到 5.0.x,包括)和真实设备上对其进行了测试。

在我的设备(带有自定义 Android 5.1 ROM 的 Galaxy S3)上花费的时间是 1375-2012 毫秒(总共 197 个应用程序),而使用官方方式是 37-65 毫秒。


编辑:人们在这里声称它未在 Android 5.1 上修复。我希望它在 Android 6 上得到修复。

关于android - 尝试获取已安装的应用程序列表时出现 TransactionTooLargeException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13235793/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com