作为我的应用程序的一部分,我通过使用 ApplicationPackageManager.getInstalledApplications 获取设备上安装的应用程序列表,但对于某些用户,我收到崩溃报告说
android.osBinderProxy.tranasact(本机方法)处的 TransactionTooLargeException
谁能想到为什么我会得到这个?
我发现这个问题在Android 5.1上已经解决了(证明here https://paste.teknik.io/1010,搜索“修复包管理器 TransactionTooLargeExceptions”),因为它在多个地方报告:
- https://code.google.com/p/android/issues/detail?id=95749 https://code.google.com/p/android/issues/detail?id=95749
- https://code.google.com/p/android/issues/detail?id=93717 https://code.google.com/p/android/issues/detail?id=93717
- https://code.google.com/p/android/issues/detail?id=69276 https://code.google.com/p/android/issues/detail?id=69276
然而,我想在 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 上得到修复。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)