公司项目需要,需要针对数码相机做照片读取(主要是读取数码相机的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())));
}
}
}
当然,还有很多的小问题,这里就不一一说明了,需要根据自己的项目需求去做调整。希望这个问题的解决方案能帮助到大家