Vielleicht reicht der Speicher Ihres Mobiltelefons nicht aus. Dieses Problem betrifft nicht nur Phonegap. Es ist auch ein häufiges Problem bei nativen Android-Apps. Es tritt auf, weil die Kamera ausgelöst wird, die Android-Aktivität in den Hintergrund wechselt (Zustand onStop) und auf die Aufnahme des Bildes wartet. Dann kommt der GC und beendet die Aktivität, um Speicher freizugeben, bevor die Kameraaktion abgeschlossen ist, und wenn die Kamera fertig ist, ist Ihre Aktivität bereits beendet. Deshalb wird die App neu gestartet.
Hier sind meine Vorschläge:
1. Ersetzen Sie das Kameraplugin, vermeiden Sie die Verwendung benutzerdefinierter Plugins, starten Sie Garbage Collection (http://code.google.com/p/foreground-camera-plugin/, http://code.google.com/p/foreground-gallery- Plugin) 2. Überprüfen Sie den Speicher, um andere Prozesse zu beenden, um Speicher freizugeben 3. Verbessern Sie deren Überlebensfähigkeit, versuchen Sie, die Freigabe von Speicher im ausgewählten System zu vermeiden.
private void clearMemory(boolean killAll)
{
mklog("" + getAvailMemory(getApplicationContext()));
ActivityManager activityManger = (ActivityManager) this
.getSystemService(ACTIVITY_SERVICE);
List list = activityManger
.getRunningAppProcesses();
if (list != null)
for (int i = 0; i < list.size(); i++)
{
ActivityManager.RunningAppProcessInfo apinfo = list.get(i);
System.out.println("pid " + apinfo.pid);
System.out.println("processName "
+ apinfo.processName);
System.out
.println("importance " + apinfo.importance);
String[] pkgList = apinfo.pkgList;
if (apinfo.importance >= ActivityManager.RunningAppProcessInfo.IMPORTANCE_BACKGROUND
|| (killAll && apinfo.importance >= ActivityManager.RunningAppProcessInfo.IMPORTANCE_SERVICE))
{
// Process.killProcess(apinfo.pid);
for (int j = 0; j < pkgList.length; j++)
{
activityManger.killBackgroundProcesses(pkgList[j]);
mklog("" + pkgList[j]);
}
}
}
mklog(" " + getAvailMemory(getApplicationContext()));
}
private long getAvailMemory(Context context)
{
ActivityManager am = (ActivityManager) context
.getSystemService(Context.ACTIVITY_SERVICE);
MemoryInfo mi = new MemoryInfo();
am.getMemoryInfo(mi);
return mi.availMem / (1024 * 1024);
}
public void mklog(String contentString)
{
Log.i("Web Console", contentString);
}