ich gefunden habe, dass dies auf Android 5.1 (Nachweis here, wenn nach „Fix Paket-Manager TransactionTooLargeExceptions“) gelöst wurde, wie es auf mehreren Stellen gemeldet wurde:
Allerdings wollte ich das vor 5.1 lösen, also habe ich mir eine Lösung ausgedacht (und vorgeschlagen, Google in die Support-Bibliothek zu legen, hier). Hier ist eine kurze Code-Version von dem, was ich vorgeschlagen habe:
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;
}
Was sie tut, es zu versuchen, zuerst den offiziellen Weg verwendet wird, und dann, wenn versäumt, holt sie die Paketnamen ADB-Befehl, und erhalten die Informationen von jeder der Apps, einer nach dem anderen.
Es ist viel langsamer als das offizielle, aber es ist nicht für mich abgestürzt. Ich habe es auf Android-Emulatoren (2.3.x bis einschließlich 5.0.x) und auch auf echten Geräten getestet.
Die Zeit, die es dauerte auf meinem Gerät (Galaxy S3 mit benutzerdefinierten ROM von Android 5.1) ist 1375-2012 ms (auf 197 Apps insgesamt) im Vergleich zu 37-65 ms mit dem offiziellen Weg.
EDIT: Leute behaupten hier, dass es nicht auf Android 5.1 behoben ist. Ich hoffe, dass es auf Android 6 behoben wurde.
Danke dafür. Weißt du, ob es eine Möglichkeit gibt, die Anwendungsinformationen auf andere Weise zu erhalten? Ich brauche nicht unbedingt jede App mit allen Infos auf einmal. Es wäre wahrscheinlich besser, wenn ich nur eine Liste der Apps abrufen und dann nach einzelnen Abfragen fragen könnte, um das erforderliche ApplicationInfo-Objekt zurück zu bekommen, so dass die Transaktion nicht so groß war. – Andrew
Ich kann PackageManager getApplicationInfo (String packageName, int-Flags) sehen, die so aussieht. Ich denke, ich kann dies kombinieren mit: getInstalledPackages, um die Daten möglicherweise ohne dieses Problem zu erhalten. – Andrew
Statt: Liste packages = pm.getInstalledApplications (PackageManager.GET_META_DATA); Ich verwende jetzt: Liste packs = pm.getInstalledPackages (0); \t Liste packages = new ArrayList (); \t für (int i = 0; i
Andrew