2016-04-13 8 views
1

Ich versuche auf eine USB-Webcam von Android ndk zuzugreifen.Vorschau USB Webkamera auf Android über ndk und V4L

Das Android-System hat die V4L-Kernel-Module, so dachte ich, es wäre am besten, die V4L-Bibliotheken zu verwenden. Sie sind in der ndk gebündelt, also war es keine große Sache, sie in mein Projekt aufzunehmen.

Mein Problem ist folgendes:

Ich brauche zu öffnen/dev/video4 und die ioctl zu diesem Dateideskriptors senden, aber ich habe nicht das Recht auf Zugang/dev/video4. Ich dachte über drei Dinge nach:

1) Warum fehlen mir Berechtigungen für/dev/video4? Meine App verwendet die Berechtigung "android.permission.CAMERA", also sollte der Benutzer, der die App ausführt, in der Kameragruppe sein, und die Kameragruppe hat "+" - Berechtigungen für "/ dev/video4". Warum kann ich sie nicht öffnen?

2) Ich habe versucht, den Dateideskriptor von Java-Seite zu bekommen, das ist mit der UsbManager-Klasse möglich, aber diese Dateideskriptorpunkte tun/dev/bus/usb/001/004. Gibt es eine Möglichkeit, die Erlaubnis für/dev/video4 von Java-Seite zu verlangen? Oder kann ich eine Userspace-V4L-Bibliothek hinzufügen und den Zeiger an das generische USB-Gerät in/dev/bus/usb/001/004 übergeben?

3) Wird die Android-Version von OpenCV mit V4L-Unterstützung geliefert? Kann ich damit eine Vorschau der Kamera anzeigen, ohne auf/dev/video4 zugreifen zu müssen?

Hat jemand schon mal so etwas probiert?

Auch ich weiß, dass es Bibliotheken gibt, die libusb und libuvc verwenden, um die Kamera zu verbinden (wie https://github.com/saki4510t/UVCCamera), aber diese Bibliothek ist sehr ungesättigt und liefert keine befriedigenden Ergebnisse.

Antwort

0

Ich bin hier angekommen, weil ich zu den gleichen Schlussfolgerungen kam wie Sie. Ich habe keinen weiteren Vorschlag zu bieten. Hast du nach all den Jahren noch etwas gefunden?

Alles, was ich hinzufügen kann, ist die folgende:

  • Zugriff auf/dev/videoX Filedeskriptoren weiter durch SELinux begrenzt ist.
  • android.permission.CAMERA tut nicht, was Sie denken, dass es tut. Alle diese Berechtigungs-/Funktionseinstellungen in Manifest ermöglichen den Zugriff auf Anwendungs-Framework-Services, nichts mit Linux-Gruppenberechtigungen oder SELinux zu tun.
  • Camera2 Framework zählt nur die vorderen und hinteren Kameras auf, also nicht für USB-Kameras, zumindest nicht aus der Box.
  • Obwohl V4L2-Treiber in Android vorhanden sind, ist der "uvcvideo" -Treiber nicht standardmäßig vorhanden. Sie müssen einen benutzerdefinierten Kernel erstellen.
  • Das UVCCamera-Projekt, auf das Sie hingewiesen haben, verwendet den UsbManager (mit einem User-Space-Uvc-Parser). So wird das Problem der Berechtigungen behoben. Dies scheint der einzige Weg zu sein, aber diese Implementierung ist fragil und scheint ein Problem mit dem Massenmodus zu haben.

es ist eine Schande, dass wir nicht einfach V4L2 + uvcvideo Treiber verwenden können.

+0

Hallo. afaik die android-berechtigungen fügen den benutzer der app einer bestimmten linux-gruppe hinzu, und die app erbt diese gruppenberechtigungen, aber du hast recht, ich habe gelesen, dass sogar ein benutzerdefinierter kernel, der die richtige gruppe hinzufügt, keine berechtigung zum öffnen/dev gibt/videoX. Der uvcvideo-Treiber scheint auf dem Samsung Galaxy S5 vorhanden zu sein und funktioniert ziemlich gut, wenn der Zugriff auf/dev/videoX mit root-Berechtigungen erreicht wird (mit Ausnahme von https://code.google.com/p/android/issues/detail) ? id = 159529). Das mache ich jetzt. – BT9

1

Die Berechtigung CAMERA bedeutet nicht, dass Sie sich in einer bestimmten Linux-Benutzergruppe befinden. Es bedeutet nur, dass Sie die Berechtigung für die Überprüfung von Android-Betriebssystemen haben.

Im Allgemeinen erhalten Anwendungen keinen direkten Zugriff auf Kernel-Treiberschnittstellen.Es ist ein großes Sicherheitsproblem, da die Treiber oft nicht gegen bösartige Anwendungen verhärtet sind.

Die einzige aktuelle Lösung, die mit nicht gerooteten Geräten funktionieren kann, ist das UVCCamera-Projekt oder andere, die eine ganze UVC-Schnittstelle zusätzlich zu den öffentlichen USB-APIs von Android erstellen.

Darüber hinaus unterstützen einige Android-Geräte tatsächlich Webcams über die Standard-Kamera-APIs, aber dies ist noch keine Funktion in Baseline Android.

+0

hallo ich bekomme das gleiche Problem Ich benutze UVC-Bibliothek, aber es funktioniert gut in meinen Geräten, wenn ich apk an den Client senden, dann zeigt seine Kamera nichts, bitte helfen .. –