2013-02-18 14 views
31

Ich habe eine Kamera-App im Google Play Store mit Google Analytics installiert. Ich erhalte den folgenden Fehlerbericht:Korrekte Behandlung der Ausnahme: "GetParameters fehlgeschlagen (leere Parameter)"

getParameters fehlgeschlagen (leere Parameter)

Meine Frage ist: Was ist der richtige Weg, dies zu umgehen ist?

Blick in die Android-Quelle, wo es passiert, gab mir keine zusätzlichen Details. Der Fehler wird in android_hardware_Camera.cpp geworfen:

String8 params8 = camera->getParameters(); 
if (params8.isEmpty()) { 
    jniThrowRuntimeException(env, "getParameters failed (empty parameters)"); 
    return 0; 
} 

Blick in Open-Source-Android-Kamera zu sehen, wie es die Situation behandelt war auch nicht sehr hilfreich. Dieser Code scheint die RuntimeException beim Aufrufen von getParameters nicht zu erfassen. (Außer in einem Fall, wo sie es fangen, schließen Sie die Kamera, und ziehen Sie sie dann erneut).

Gibt es einen richtigen Weg, damit umzugehen?

Wenn nicht, gibt es einen Grund, warum das so oft passiert?

Hinweis: An einem beliebigen Tag habe ich zwischen 5k - 8k aktive Benutzer. Mit irgendwo zwischen 40-70 dieser Ausnahmen. Das scheint wirklich hoch zu mir. Ich weiß, dass es legitime Fälle gibt, in denen eine Kamera möglicherweise nicht initialisiert wird. Aber 1% der Nutzer scheint unangemessen. Da die Android-Kamera-App die Ausnahme nicht behandelt, frage ich mich, ob es eine andere Ursache gibt.

+0

Ich frage mich gesperrt wieder finden Sie eine Lösung –

+1

+ Onur Taskin - Siehe meine Antwort unten. Es erklärt, wie ich es behoben habe und wie andere damit in Schwierigkeiten geraten könnten. – Grimmace

+0

In meinem Fall bekam ich dies auf der Stock Camera App auf einem Android API 22 Emulator. Ich reparierte es, indem ich das 32bit x86 OS-Bild auf dem Emulator anstelle des 64bit x86 eins verwendete. –

Antwort

25

Als + Eddy Talvala erwähnt, passiert dies, wenn die Kamera in einem schlechten Zustand ist.

Wie kommt die Kamera in einen schlechten Zustand?

1) Der wahrscheinlichste Grund wäre, die Kamera zu schließen/loszulassen, während sie danach noch verwendet wird. Dies kann besonders problematisch sein, wenn Sie das Objekt Camera für mehrere Threads verwenden, ohne den Zugriff auf die Camera zu synchronisieren. Stellen Sie sicher, dass Sie immer nur einen einzigen Thread haben, der gleichzeitig auf Camera zugreift.

2) In meinem Fall war es ein bisschen schwieriger. Ich benutze eine SurfaceTexture, damit ich die Kamera-Ausgabe als OpenGL-Textur verwenden kann. In Android 4.0 (ICS) gibt es eine neue Methode SurfaceTexture.release(). Diese Methode ist wichtig, wenn Sie SurfaceTexture s verwenden, da der Speicher schneller als zuvor gelöscht wird.

Das Problem ist, dass ich SurfaceTexture.release() anrief, während die Kameravorschau noch aktiv war. Dies stürzte den Camera Dienst, der das Problem in der Frage verursacht wurde.

In meinem Fall habe ich es behoben, indem ich den Anruf auf SurfaceTexture.release() verzögert habe, bis ich ihn durch einen neuen SurfaceTexture ersetzt hatte. Auf diese Weise war ich sicher, dass die SurfaceTexture ohne irgendwelche negativen Nebenwirkungen aufgeräumt werden konnte.

+1

Denken Sie daran, dass die Ausnahme auch nach der Behebung des Problems weiterhin ausgelöst werden kann, da der Kamera-Dienst in einem schlechten Zustand enden kann. Wenn die Kamera-App des Geräts ebenfalls kein Bild anzeigt, wird das Problem nur durch einen Neustart behoben. –

3

Gibt es ein bestimmtes Android-Gerät, bei dem dieser Fehler auftritt? Oder sehen Sie es auf vielen Geräten.

Im Allgemeinen sollten Sie diese Art von Fehler nicht sehen. Es ist möglich, dass Ihre Anwendung eine Art von Race-Bedingung hat, die dazu führt, aber es müsste beinhalten, getParameters auf einer nicht initialisierten oder bereits freigegebenen Kamera aufzurufen.

Es könnte sich auch um einen Fehler im gerätespezifischen Kameracode oder um einen seltenen Race-Zustand irgendwo im Kamera-Codestapel handeln. Ohne weitere Details (Logcat oder Android Bugreport von einem solchen Absturz), ist es unmöglich zu sagen - der Fehler selbst sagt nur, dass der gerätespezifische Kamera-Code einen leeren Satz von Parametern zurückgegeben hat.

Aber sobald Sie diesen Fehler bekommen, können Sie nicht viel tun - das Kamera-Subsystem ist in einem seltsamen Zustand. Wenn Sie versuchen, damit umzugehen, kann ich nur vorschlagen, das Kameragerät zu schließen und wieder zu öffnen.

29

In meinem Fall war ich immer diese Fehlermeldung:

getParameters (leere Parameter)

schlug fehl, wenn ich getParameters() nach dem Entriegeln der Kamera bezeichnet. Rufen Sie also bitte getParameters() an, bevor Sie camera.unlock() anrufen.

1

Kamera Objekte werden standardmäßig immer so gesperrt, wenn Sie Methode entsperren können dann können Sie andere procceses auf Ihre Parameter verwenden so sicher, dass Sie die Kamera vor dem Einsteigen Parameter, wenn Sie

Verwandte Themen