1. 程式人生 > >關於usb訪問數碼相機的紀實

關於usb訪問數碼相機的紀實

        公司專案需要,需要針對數碼相機做照片讀取(主要是讀取數碼相機的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())));
                }
            }
        }

當然,還有很多的小問題,這裡就不一一說明了,需要根據自己的專案需求去做調整。希望這個問題的解決方案能幫助到大家