2013-08-18 3 views
41

Ich arbeite an einer Bibliothek, um die Camera API für Entwickler einfacher zu machen.Ideen der Quelle von QualcommCameraHardware native_get_picture: MSM_CAM_IOCTL_GET_PICTURE Zeitüberschreitung der Verbindung fehlgeschlagen?

Der Droid Incredible 2, im Hochformat mit der nach hinten gerichteten Kamera, kann kein Bild aufnehmen. Insbesondere ich diese Sequenz in LogCat erhalten:

08-18 09:25:52.094: E/QualcommCameraHardware(1368): native_get_picture: MSM_CAM_IOCTL_GET_PICTURE fd 25 error Connection timed out 
08-18 09:25:52.094: E/QualcommCameraHardware(1368): getPicture failed! 
08-18 09:25:52.094: E/QualcommCameraHardware(1368): get picture failed, giving jpeg callback with NULL data 

Diese Nachrichten kommen ~ 5 Sekunden, nachdem ich takePicture() auf den Camera nennen, die mit einigen alten Quellcode passen ich für QualcommCameraHardware sehen, die eine 5000ms Timeout auf die ioctl() einrichtet Rufen Sie an, um mit der Kamerahardware zu sprechen.

Das Ergebnis ist, dass onPictureTaken() eine nullbyte[] von JPEG-Daten übergeben wird, was bedeutet, dass wir kein Foto haben.

Das Gerät funktioniert mit meinem Code in allen anderen getesteten Konfigurationen, einschließlich Arbeiten im Hochformat mit der Frontkamera.

Weiß jemand etwas Bestimmtes, das diesen besonderen Fehler verursachen könnte?

UPDATE

ich den Fehler reproduzieren kann nicht mehr. Ich würde die Frage löschen, aber das ist anscheinend nicht möglich, sobald es Antworten gibt.

+1

Haben Sie versucht, Bilder mit niedriger Auflösung aufzunehmen? –

+0

@AliImran: Ich werde es irgendwann versuchen, wenn ich und meine Incredible 2 gleichzeitig am selben Ort sind. :-) Vielen Dank! – CommonsWare

+0

@AliImran: Das Abdecken der Ausgabe mit einer niedrigeren Auflösung schien tatsächlich zu helfen, obwohl ich diesen speziellen Fehler nicht mehr bekam und stattdessen einfach eine korrupte Ausgabe erhielt. Vielen Dank! – CommonsWare

Antwort

0

Höchstwahrscheinlich ist die cameraService, die Teil des Medienprozesses ist, im Hintergrund abgestürzt. Wenn Sie nur versuchen, die Standard-Kamera-App in Android auszuführen und es nicht angezeigt wird, starten Sie das Gerät einfach neu, um diesen Fehler zu beheben.

Ich denke, Sie verwenden Bild Callback für beide Raw und Jpeg Callbacks. Wenn es als unformatierter Callback aufgerufen wurde, könnten die Daten also null sein. Weil das Dokument sagt:

Löst eine asynchrone Bilderfassung aus. Der Kamera-Service initiiert eine Reihe von Rückrufen zu der Anwendung, während die Bilderfassung fortschreitet. Der Auslöser-Rückruf erfolgt nach der Aufnahme des Bildes. Dies kann verwendet werden, um einen Ton auszulösen, um den Benutzer wissen zu lassen, dass das Bild aufgenommen wurde. Der Raw-Callback tritt auf, wenn die RAW-Bilddaten verfügbar sind (HINWEIS: Die Daten sind Null, wenn kein Raw-Image-Callback-Puffer verfügbar ist oder der Raw-Image-Callback-Puffer nicht groß genug ist, um das Raw-Image aufzunehmen). Der Postview-Callback tritt auf, wenn ein skaliertes, vollständig verarbeiteter Postview-Bild verfügbar ist (HINWEIS: nicht alle Hardware unterstützt dies). Der jpeg-Rückruf erfolgt, wenn das komprimierte Bild verfügbar ist. Wenn die Anwendung keinen bestimmten Rückruf benötigt, kann anstelle einer Rückrufmethode eine Null übergeben werden.

+0

"Ich denke, Sie verwenden den Bildrückruf sowohl für Raw- als auch für JPEG-Rückrufe" - Ich liefere überhaupt keinen Raw-Callback ("null") und ersuche ein JPEG-Bild. – CommonsWare

1

MSM_CAM_IOCTL_GET_PICTURE ist ein Kernel-Aufruf, den die Funktion läuft

static int msm_get_pic(struct msm_sync *sync, void __user *arg) 

ich die Kernel-Quelle für Ihr Gerät aus der HTCdev heruntergeladen und die Funktion gefunden in

definiert
drivers/media/video/msm/msm_camera-7x30.c 

überprüfen kann, was ist die Kernel-Nachrichten, wenn Sie ein Bild machen?

adb shell su -c "dmesg" 
+0

... und jetzt kann ich das Problem nicht reproduzieren. Ich muss etwas in meiner App für ein anderes Gerät geändert haben, was den Nebeneffekt hatte, dieses Problem zu beheben. Ich lösche die Frage in ein oder zwei Tagen. Ich entschuldige mich dafür, dass Sie Ihre Zeit verschwendet haben. – CommonsWare