關於usb訪問數碼相機的紀實
阿新 • • 發佈:2018-12-18
公司專案需要,需要針對數碼相機做照片讀取(主要是讀取數碼相機的jpg圖片),之前用的是android提供的mtpservice這個庫,但是實際的效果不太滿意,主要是在尼康機器上問題很多,busy問題,不能回看的問題,部門佳能相機busy的問題等,遭到了攝影師的集體吐槽。
前段時間終於閒下來了,就想著去改進一下,從github上面找到了一個庫remoteyourcam-usb,下載下來開始研究,編譯通過以後拿著手機和數碼相機測試,發現busy的問題解決了,但是在尼康相機上還是有問題,這裡要感謝一個qq好友提醒了我,尼康的機器在連線上裝置以後需要傳送一個應用模式,就是這麼一個小小的提示,解決了一個大問題,後來再去看尼康的機型sdk,回過頭來想想,有些問題其實很簡單,但是自己無知的時候就回變得很複雜。非常感謝《我的小不點兒呀》。
解決回放的問題以後,就是優化程式碼了,本身remoteyourcam-usb這個程式碼庫是有一些問題的,這個庫是很多年前的一個庫了,都不再維護,所以大家要是用的話可以參考,但是用到生產過程中還是需要根據自己的實際需求做調整。我把我調整的比較大的兩個地方給大家說明一下:
1.獲取儲存卡,判斷儲存卡是否有效的地方,在尼康下面需要做判斷
@Override public void encodeCommand(ByteBuffer b) { if (camera.getVendorId() == PtpConstants.NikonVendorId) { if(((NikonCamera)this.camera).hasSupport(PtpConstants.Operation.NikonGetVendorStorageIDs)) { super.encodeCommand(b, PtpConstants.Operation.NikonGetVendorStorageIDs); return; } } super.encodeCommand(b, PtpConstants.Operation.GetStorageIDs); }
尼康是通過verndor的方式去取,但是不是所有的尼康都支援verndor,所以需要做特殊處理。否則你會發現usb無響應。應該如果在空卡上讀取會異常,但是尼康相機這個又不報錯(這個很坑爹)。
2.就是設定應用模式,解決不能回看的問題了
// 設定應用模式 if (camera.hasSupport(Operation.NikonApplicationMode)) { // D5先遮蔽,沒有拿到機器,所以不好測試 if (camera.getProductId() != PtpConstants.Product.NikonD5) { SetDevicePropValueCommand spv = new SetDevicePropValueCommand( camera, Operation.NikonApplicationMode, 1, Datatype.uint8); io.handleCommand(spv); if (spv.getResponseCode() != PtpConstants.Response.Ok) { Log.e("PtpUsbService", String.format( "設定應用模式失敗\"%s\"", PtpConstants.responseToString(spv.getResponseCode()))); } } }
當然,還有很多的小問題,這裡就不一一說明了,需要根據自己的專案需求去做調整。希望這個問題的解決方案能幫助到大家