- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我有一台数码单反相机和一台运行 Android Honeycomb 的三星 Galaxy Tab。 DSLR 使用 USB 电缆连接到平板电脑(通过 USB 套件在平板电脑上启用主机功能)。我希望在用户使用此外部相机拍照时收到通知,以便将此图像下载到平板电脑或使用它执行其他操作,例如显示包含从图像中获取的元信息的 Toast 通知。
据我所知,所有现有工具(如 FileObserver
使用底层 inotify
机制,MediaContentProvider
等)允许监视更改,要求监视特定文件或文件系统路径。这已经足够好了,直到我们在 2.x 和更早的 Android 版本中获得了 block 层协议(protocol)支持 - 当您连接设备时,它已安装在设备文件系统的某个位置,您可以将此安装点用作这些工具的观察点.
由于 Honeycomb,Google 已将访问外部 USB 设备的方式更改为 Media Transfer Protocol
,其中 PTP
作为其子集。现在,当我将外部 USB 设备连接到 Android 设备时,我不会看到它的任何挂载点(我正在使用 adb shell
和随后的 mount
命令来获取它们)。此外,MTP
实现使用的存储 id 显然充当更高级别的抽象,并且只是普通整数值。我希望有一种方法可以以某种方式将这些存储 id 转换为真实路径/挂载点/任何东西,但显然似乎没有。
考虑到已经在我的设备上运行的 Android MediaScanner
我猜想它可以通过一个特殊的 Intent
来解决这个问题设备,所以我开始寻找已经存在且合适的 Intents
以得到通知,但没有运气 - 我发现只有 ACTION_MEDIA_MOUNTED
和 ACTION_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 卡开始 session ,您已经知道照片将具有的文件名。让我们说img0001.jpg。所以你只需要编写一个函数来抓取该文件,直到它成功。如果您想要下一个 img0002.jpg,您可以编写一个任务/服务/函数来抓取该文件,直到成功,依此类推。
如果您想节省电池电量,您可以在中间安装一个额外的电池/电源来为 USB 端口供电。
您可以尝试使用 ScheduledExecutorService 来代替 Async 任务或 timerTask,看看它是否消耗更少的电量。
希望能给你一些新的想法
关于android - 注意 Honeycomb 或更高版本 Android 的外部 USB 存储的变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10346321/
我正在寻找一种解决方案,当项目具有以下内容时,更改 HoneyComb 操作栏的选项菜单项的文本颜色: android:showAsAction="ifRoom|withText" 我尝试了很多不同的
我想为 Honeycomb 创建一些小部件,我已经成功创建了一个 StackView widget对于我的应用程序,但我想在 Honeycomb 中添加一些其他的新小部件。 我特别想查找上图中右侧小部
我正在为 Honeycomb 开发,几天来我一直在努力解决这个问题。我有一个没有 Intent 的通知服务(不需要一个),问题是每次调用 displaymessage 函数后,每次都会弹出通知,所以我
我读了很多关于这个问题的问题,但我找不到正确的方向来解决我的问题,也许是因为我是菜鸟,迫切希望找到正确的方法...... 据我所知,“requering already closed cursor”问
我已经安装了 android sdk for windows。我当时使用的是 API 级别 8 和 API 级别 15。 现在我想使用 Honeycomb for Tablets。但我不知道如何在我的
我知道这个问题对某些人来说可能听起来很愚蠢,但 Honeycomb 仅适用于平板电脑吗?我正在做一个论文项目,为移动设备开发一个 Android 应用程序:你建议我应该使用哪个版本?我猜是最受欢迎的那
我一直在研究如何将我的应用程序 (android:maxSdkVersion = “10”) 升级到 Honeycomb,并希望得到一些建议。 首先,我的应用程序中的一个 Activity 是列表 A
我有一个 Android 应用程序,它偶尔会显示 Assets 文件夹中包含的静态网页。我一直在以编程方式显示这些: webView = new WebView(PKBDocument.Knowled
代码: path = "httplive:///moviets/index.m3u8"; // Create a new media player and set th
我想在 default media player 中为 honeycomb 添加一些功能,而不是使用 Android 中的 mediaPlayer 包创建任何其他类,例如通过滑动屏幕显示特定视频的信息
我有一个应用程序,允许用户转到照片库并选择一张照片用作头像。该代码在任何地方都可以正常工作,但 Xoom 除外,它会启动图库,允许用户选择照片,然后失败并显示“java.lang.RuntimeExc
如何在没有操作栏的情况下在 Honeycomb 或 ICS 平板电脑上显示选项菜单? 经过一番尝试后,如果没有操作栏并且 targetsdkversion >=11,似乎无法在 Honeycomb 设
在 Android 的 pre-Honeycomb 版本中,我跟踪了内存的外部分配 VMRuntime.getRuntime().getExternalBytesAllocated() 或使用 Deb
几周来我一直在编写我的第一个应用程序,今天我意识到如果我们想为 Honeycomb 和普通手机开发,我们应该将它们打包为一个应用程序而不是两个具有不同目标的应用程序。 因此,我在 Eclipse 中启
我正在尝试检查我的蜂窝应用程序上是否有一个简单的连接可用。我尝试了 2 个不同版本的函数: public boolean networkAvailable() { Connectiv
我有一个包含大量 Activity 的应用程序。我在 list 中设置了这个: 我还设置了 v11 样式,以便所有 Activity 都使用 v11+ 上的 Holo 主题。 问题是我的所有 Act
我正在开展一个个人项目,该项目将包括一个主屏幕小部件,该小部件使用来自服务的信息进行更新 - 我正在使用 Android 3.1 平板电脑(实体)和 Android 2.3 模拟手机进行开发。 对于
我正在尝试将视频文件从我的内部存储加载到 VideoView。我从服务器下载这些视频文件,然后使用以下代码将它们存储在本地: FileOutputStream out = openFileOutput
我有一个应用程序可以从设备上的联系信息中检索邮寄地址。我使用类似于下面的代码使用联系人 API 检索街道地址、邮政编码、城市等信息。然后我在不同的行上显示地址,用户可以接受它或根据需要更改它。 Str
我只是一个在业余时间编写 iOS 和 Andorid 应用程序的人。我有一些 Android 应用程序,我认为它们很适合进行更新,使它们能够在 Honeycomb 上本地运行。 但是,由于我没有 Ho
我是一名优秀的程序员,十分优秀!