1. 程式人生 > >終於搞定android驅動USB攝像頭了!

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

帖子大意:
討論的前提是你的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,執行,天啊終於出來了,高興死了!