当用户下载新图像或使用相机拍摄图像时,图库应用程序将更新以显示新图像。
我需要在每个新图片创建后立即得到通知,无论它是如何创建的(相机,浏览器......),就像图库应用显示一样。
事实证明,有一个mediaScanner Android组件负责扫描所有类型的媒体文件,当它完成时,它应该发送一个意图“MEDIA_SCANNER_FINISHED”(如{{3}所示) })。
所以我添加了下一个代码,希望每次用户从相机应用拍摄照片时都会显示一个祝酒词:
清单:
...
<receiver android:name="com.example.newgalleryimagereceivertest.MediaScannerBroadcastReceiver" >
<intent-filter>
<action android:name="android.intent.action.MEDIA_SCANNER_FINISHED" />
<data android:scheme="file" />
</intent-filter>
</receiver>
...
java文件:
package com.example.newgalleryimagereceivertest;
...
public class MediaScannerBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(final Context context, final Intent intent) {
android.util.Log.d("AppLog", "gallery has new images");
}
出于某种原因,此代码不起作用......
代码出了什么问题?
拍摄照片后是否会调用broadcastReceiver?
这样做的正确方法是什么?
我是否真的需要使用contentObserver并监控其更改(使用this example之类的内容),并保持应用程序正常运行?我真的希望不是......
答案 0 :(得分:4)
ACTION_MEDIA_SCANNER_FINISHED用于向图库中添加新的目录:
广播操作:媒体扫描程序已完成扫描目录。 扫描目录的路径包含在Intent.mData中 字段。
常量值:“android.intent.action.MEDIA_SCANNER_FINISHED”
您应该使用ACTION_MEDIA_SCANNER_SCAN_FILE,它用于添加新的文件 - 而不仅仅是目录:
广播操作:请求媒体扫描程序扫描文件并添加 到媒体数据库。文件的路径包含在 Intent.mData字段。
常量值:“android.intent.action.MEDIA_SCANNER_SCAN_FILE”
您可以使用所讨论的代码here来测试此Intent
。
此外,据报道,some需要包含 mime类型和文件扩展名,例如:
<data android:mimeType="*/*"/>
<data android:pathPattern=".*\\.png" />
答案 1 :(得分:3)
您可能还想考虑将这些内容添加到过滤器中:
com.android.camera.NEW_PICTURE
com.android.camera.NEW_VIDEO
android.hardware.action.NEW_PICTURE
android.hardware.action.NEW_VIDEO
android.hardware.x操作是&#34;官方&#34;目前的广播,但com.android.x由三星设备和旧版本的Android发送。
答案 2 :(得分:1)
我认为你可以使用FileObserver来实现这一点。
如文档中所述:
监视文件,以便在设备上的任何进程访问或更改文件后触发事件。 每个FileObserver实例都监视单个文件或目录。如果监视目录,将触发受监视目录中所有文件和子目录的事件。
但你必须记住:
如果FileObserver被垃圾收集,它将停止发送事件。为确保您继续接收事件,您必须保留对其他实时对象的FileObserver实例的引用。
请给我一些反馈。 希望有所帮助。