繁体   English   中英

关注Honeycomb或更高版本Android版本的外部USB存储器的更改

[英]Watch for changes in external USB storage for Honeycomb or later Android versions

我有一台运行Android Honeycomb的数码单反相机和三星Galaxy Tab。 使用USB电缆将DSLR连接到平板电脑(通过USB套件在平板电脑上启用主机功能)。 我希望在用户使用此外置摄像头拍照时收到通知,以便将此图像下载到平板电脑或使用它做其他事情,例如显示包含从图像中获取的元信息的Toast通知。

至于我获得所有现有工具(如FileObserver使用底层inotify机制, MediaContentProvider等)允许观察更改,需要特定文件或文件系统路径进行监视。 这很好,直到我们在2.x和更早版本的Android版本中获得了块层协议支持 - 当你连接设备时,它已被安装在设备文件系统的某个地方,你可以使用这个挂载点作为这些工具的观察点。

自从Honeycomb Google Media Transfer Protocol PTP作为其中一个子集改为访问外部USB设备到Media Transfer Protocol的方式。 现在,当我将外部USB设备连接到Android设备时,我将看不到任何挂载点(我正在使用adb shell和后续的mount命令来获取它们)。 此外, MTP实现使用存储ID,它显然充当更高级别的抽象,并且只是普通的整数值。 我希望有一种方法能够以某种方式将这些存储ID转换为真正的路径/ mountpoint /但是显然似乎没有。

考虑到已经在我的设备上运行的Android MediaScanner ,我猜想当设备可以访问媒体文件的变化时,可以通过广播的特殊Intent来管理这个问题,所以我开始寻找已经存在且适合的Intents来获得通知,但没有运气 - 我发现只有ACTION_MEDIA_MOUNTEDACTION_MEDIA_REMOVED才会在设备分别连接和断开时进行广播。 这意味着MediaScanner无法注意到设备上的任何更改,直到您重新安装它(我已使用库存图库应用程序对其进行了双重检查 - 在您拔下插头并将其插入Android之前,它不会在相机上看到任何新创建的图像设备再次)。

试图获取外部sdcard的这个挂载路径,我使用了Environment.getExternalStorageDirectory() API调用,但它产生了模拟的Galaxy的sdcard路径,即/mnt/sdcard ,而不是摄像机的路径。 所以它对我也不起作用。

我设法解决了这个问题,只是在AsyncTask充当TimerTask启动了定期的Timer事件。 此任务会初始化USB连接,打开设备,扫描整个设备内存,仅获取最后拍摄的照片,然后关闭设备描述符和USB连接。

它看起来不是最好和最有效的方法,考虑到它必须每次都做这些动作,这可能是相当频繁的,比如说每5秒或10秒。 它肯定会很快耗尽电池并产生不必要的系统I / O,仅用于拍摄最后拍摄的照片并将其与之前拍摄的照片进行比较(99%是相同的图像),但我没有找到任何更好的工作解决方案这样做。 拥有基于事件的通知的观察者机制会好得多。

所以我的问题是有更有效的方式来通知Honeycomb或更高版本的Android版本的外部USB存储器的更改,而不是上面描述的那些?

如果你想要一个更有效的方式,相机必须通过usb发出某种信号,它已经拍了照片。 我想这不是那样做的。

因此,您必须按照您的描述方式手动检查:

mount storage - >检查更改 - >根据检测到的更改执行操作。

我不知道你曾经读过“MTP方式”,但这里是一个示例应用程序:

https://github.com/ynakanishi/Honeycomb-MTP-sample

每次您可以保存读出文件名的结果时不扫描整个存储器,例如每次检查并比较它以查找新文件名时。 通常,文件的命名也在相机上以相同的数字开头。 因此,如果您使用空SD卡开始会话,则您知道该照片将具有的文件名。 让我们说img0001.jpg。 所以你只需要编写一个函数来获取该文件,直到它成功为止。 如果你想要下一个img0002.jpg你可以编写一个任务/服务/函数来获取该文件,直到成功,等等。

如果您想省电,可以在中间使用额外的电池/电源来为USB端口供电。

您可以尝试使用ScheduledExecutorService来查看它是否使用更少的功率,而不是Async任务或timerTask。

希望能给你一些新的想法

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM