关于usb访问数码相机的纪实

        公司项目需要,需要针对数码相机做照片读取(主要是读取数码相机的jpg图片),之前用的是android提供的mtpservice这个库,但是实际的效果不太满意,主要是在尼康机器上问题很多,busy问题,不能回看的问题,部分佳能相机busy的问题等,遭到了摄影师的集体吐槽。

        前段时间终于闲下来了,就想着去改进一下,从github上面找到了一个库remoteyourcam-usb,下载下来开始研究,编译通过以后拿着手机和数码相机测试,发现busy的问题解决了,但是在尼康相机上还是有问题,再去看尼康的机型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())));
                }
            }
        }

当然,还有很多的小问题,这里就不一一说明了,需要根据自己的项目需求去做调整。希望这个问题的解决方案能帮助到大家

微信打赏
微信打赏

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值