我有一台DSLR相机和运行Android Honeycomb的三星Galaxy Tab平板电脑。使用USB线将DSLR相机连接到平板电脑(通过启用平板电脑主机功能的USB套件)。我想在用户使用这个外部相机拍照时得到通知,以便将其图像下载到平板电脑上或者做其他事情,比如显示包含从图像中提取的元信息的提示通知。
就我所知,所有现有的工具(例如使用底层inotify机制的FileObserver,MediaContentProvider等)都允许监视更改,需要监视特定文件或文件系统路径。在2.x和早期的Android版本中支持块层协议时,这足够好 - 当您连接设备时,它会挂载在设备的文件系统中的某个位置,并且您可以将此挂载点用作那些工具的观察点。
自Honeycomb以来,Google已更改了访问外部USB设备的方式,采用PTP作为Media Transfer Protocol的子集。现在当我将外部USB设备连接到Android设备时,我看不到任何挂载点(我正在使用adb shell和随后的mount命令获取它们)。此外,MTP实现使用存储ID,显然作为抽象级别较高的纯整数值。我希望有一种方法可以将这些存储ID转换为实际路径/挂载点/任何其他东西,但显然似乎没有。
考虑到我的设备上已经运行了 Android 的MediaScanner
,我猜测它可以通过特殊的Intent
来处理从设备访问的媒体文件发生更改的问题,因此我开始寻找现有且适合被通知的Intents
,但没有找到任何符合要求的 - 我只找到了ACTION_MEDIA_MOUNTED
和ACTION_MEDIA_REMOVED
,分别在设备连接和断开连接时广播。这意味着MediaScanner
直到重新挂载之前都无法注意到设备上的任何更改(我使用原始的相册应用程序进行了双重检查-它不会看到相机上新创建的图像,直到您将其从 Android 设备上拔下并再次插入)。尝试获取外部SD卡的挂载路径,我使用了
Environment.getExternalStorageDirectory()
API调用,但它得到了模拟 Galaxy 的SD卡路径,即/mnt/sdcard
,而不是相机的路径。因此,对我也没用。我只能通过启动定期的
Timer
事件并使用AsyncTask
作为TimerTask
来解决此问题。该任务初始化USB连接,打开设备,扫描整个设备内存,仅获取最新拍摄的照片,然后关闭设备描述符和USB连接。考虑到要频繁进行所有这些操作,例如每5或10秒钟,这显然不是最佳和高效的方法。它会快速耗尽电池,并为仅获取最新拍摄的照片并将其与上一个最新拍摄的照片进行比较(在99%的情况下,是相同的照片)而产生不必要的系统I/O负载。但我没有找到更好的解决方案。因此,我的问题是,是否有更有效的通知外部USB存储中更改的方法适用于 Honeycomb 或更高版本的 Android?