天天看點

終于搞定android驅動USB攝像頭了!

源自 : http://www.eoeandroid.com/forum.php?mod=viewthread&tid=252676&fromuid=123224

多虧了stackoverflow看到的一篇文章,其中有幾句關鍵的話,然後順藤摸瓜解決了問題。

文章大意:

讨論的前提是你的USB攝像頭是UVC相容的(如今大部分攝像頭相容)

預設Android不提供通路外部攝像頭的API,是以你要考慮寫一個核心到Android應用層通信的中間件。

當你給裝置接入了USB攝像頭,首先要檢查一下幾點:

1)你的裝置是否支援USB-OTG?

2)是否在/dev目錄建立了裝置?如果建立了就那麼一切就很簡單了。shell 執行 ls -l /dev/v*,你将會看到video0或者video1。

3)如果/dev沒有建立裝置,你需要寫一個固件(UVC)跟硬體通信!

(文章位址:http://stackoverflow.com/questio ... android-application)

讀到這裡,再次給我的MK802接上USB攝像頭,然後打開adb shell,執行ls -l /dev/v*,看到了 /dev/video0裝置!

拔掉攝像頭,再執行,video0消失,再連接配接,video0出現,這說明mk802支援我的攝像頭!

到此,已經明确,下一步我需要寫一個android應用層到核心通信的中間件,我對這個也不了解,于是在google狂搜“android usb camera”

終于功夫不負有心,找到了一個android usb攝像頭的應用例子

http://brain.cc.kogakuin.ac.jp/research/usb-e.html

從中找了一個SimpleWebCamra.apk,下載下傳了趕緊裝上,發現不能運作,logcat報一個錯,提示沒有權限通路video0裝置。

這是為什麼?我的系統已經root了呀!難道我的apk也要獲得root權限?又在網上查資料,試了半天,還是不行。

後來忽然靈機一動,android也是linux呀,我能不能把video0裝置設定成沒權限?問了問朋友,執行了一個指令:

chmod 777 /dev/video0

再次運作apk終于跑起來了!(後來經測試,設定成 chmod 0666 /dev/vidoe0 也可以,但是我也不懂0666的含義。。)

但是問題又來了,程式進去以後,報錯

VIDIOC_DQBUF error 22, Invalid argument

于是想,必須要活的SimpleWebCamea的源碼了!經過苦苦搜尋,很幸運的找到一個simplewebcam的源碼:

https://bitbucket.org/neuralassembly/simplewebcam/src

下載下傳一看,裡邊包含ndk的c源碼和android源碼,于是按照ndk教程,安裝了cygwin

苦于c代碼看不太懂,錯誤提示VIDIOC_DQBUF 調用參數錯誤,卻無從下手。

于是看了n篇教程,偶然發現說打開攝像頭裝置的open方法的一些參數,然後試着把c代碼中的一些參數去掉:

fd = open (dev_name, O_RDWR | O_NONBLOCK, 0);

改為

fd = open (dev_name, O_RDWR);

再次build,運作,天啊終于出來了,高興死了!

終于搞定android驅動USB攝像頭了!

WP_000165.jpg (513.61 KB, 下載下傳次數: 4)

下載下傳附件  儲存到相冊

2013-1-24 18:31 上傳

下邊附上項目的源碼:

終于搞定android驅動USB攝像頭了!

SimpleWebCam.zip (273.74 KB, 下載下傳次數: 758)

2013-1-24 18:32 上傳 點選檔案名下載下傳附件

下載下傳積分: e币 -2 元