2016-04-13 86 views
1

我正在嘗試從Android ndk訪問USB攝像頭。在Android上通過ndk和V4L預覽USB Webcamera

Android系統有V4L內核模塊,所以我認爲最好使用V4L庫。他們都在NDK中,因此將它們納入我的項目並不是一件大事。

我的問題是這樣的:

我需要打開/ dev/VIDEO4併發送IOCTL到的文件描述符,但我沒有權限訪問的/ dev/VIDEO4。我想了三件事:

1)爲什麼我缺少/ dev/video4的權限?我的應用程序使用android.permission.CAMERA權限,因此運行該應用程序的用戶應該在相機組中,並且相機組在/ dev/video4上具有r + w權限,所以爲什麼我無法打開它? 2)我試圖從java端獲得文件描述符,這可以通過UsbManager類來實現,但該文件描述符指向/ dev/bus/usb/001/004。有沒有辦法從Java端請求/ dev/video4的權限?或者我可以包含一個用戶空間V4L庫,並將指針傳遞給/ dev/bus/usb/001/004中的通用USB設備?

3)OpenCV的Android版本是否支持V4L?我可以使用它預覽相機而無需訪問/ dev/video4嗎?

有沒有人嘗試過這樣的事情?

此外,我知道有使用libusb和libuvc來連接相機的庫(例如https://github.com/saki4510t/UVCCamera),但是這個庫非常不穩定,並且不能提供令人滿意的結果。

回答

0

我到達這裏是因爲我得出的結論和你一樣。我沒有進一步的建議提供。這些年來你有沒有找到其他的東西?

我可以補充的是以下內容:

  • 訪問到/ dev/VideoX時文件描述符SELinux所被進一步限制。
  • android.permission.CAMERA不會做你認爲它的用途。清單中的所有這些權限/功能設置都可以訪問應用程序框架服務,而與Linux組權限或SELinux無關。
  • Camera2框架僅列舉前後攝像頭,因此不適用於USB攝像頭,至少不能用於開箱。
  • 雖然V4L2驅動程序在Android中存在,但'uvcvideo'驅動程序不是默認的。你將不得不建立一個定製的內核。
  • 您指出的UVCCamera項目使用了UsbManager(使用用戶空間uvc解析器)。這就是它克服權限問題的方式。這似乎是唯一的方法,但是這種實現是脆弱的,並且在批量模式下似乎有問題。

很遺憾,我們不能只使用V4L2 + uvcvideo驅動程序。

+0

嗨。 afaik android權限將應用程序的用戶添加到某個linux組中,並且該應用程序繼承這個組的權限,但是您是對的,我已經閱讀過報告,即使是添加了正確組的權限的自定義內核也不會授予打開/ dev/VideoX時。 uvcvideo驅動程序似乎出現在Samsung Galaxy S5上,如果通過root權限訪問/ dev/videoX(https://code.google.com/p/android/issues/detail除外) ?ID = 159529)。這就是我現在正在做的。 – BT9

1

獲得許可CAMERA並不意味着您在任何特定的Linux用戶組中。這僅表示您有權進行Android操作系統權限檢查。

通常,應用程序不能直接訪問內核驅動程序接口。這是一個很大的安全問題,因爲驅動程序通常不會針對惡意應用程序進行強化。

目前唯一能夠與無根設備一起工作的解決方案是UVCCamera項目或其他類似項目,它們在Android公共USB API上構建了一個完整的UVC界面。

另外,一些Android設備確實通過標準的相機API支持網絡攝像頭,但這還不是基準Android的功能。

+0

你好,我得到同樣的問題,我正在使用UVC庫,但它在我的設備工作正常,當我發送apk到客戶端,然後他的相機沒有顯示任何東西,請幫助.. –