13

背景

当用户下载新图像或使用相机拍摄时,图库应用程序将更新以显示新图像。

我需要在创建每个新图像时立即收到通知,无论它是如何创建的(相机、浏览器……),就像画廊应用程序显示的那样。

问题

事实证明,有一个 mediaScanner Android 组件负责扫描所有类型的媒体文件,当它完成时,它应该发送一个意图“ MEDIA_SCANNER_FINISHED ”(如本示例所示)。

所以我添加了下一个代码,希望每次用户从相机应用程序拍照时它都会显示一个祝酒词:

显现:

    ...
    <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");
    }

由于某种原因,此代码不起作用...

问题

代码有什么问题?

拍照后会调用广播接收器吗?

正确的方法是什么?

我真的需要使用 contentObserver 并监控它的变化(使用类似这样的东西),并为此保持应用程序运行吗?真希望不要...

4

3 回答 3

5

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”

您可以使用此处Intent讨论的代码对此进行测试。

此外,据报道,有些需要包括mime 类型和文件扩展名,例如:

<data android:mimeType="*/*"/>
<data android:pathPattern=".*\\.png" />
于 2014-01-29T18:52:28.767 回答
3

您可能还想考虑将这些添加到您的过滤器中:

com.android.camera.NEW_PICTURE
com.android.camera.NEW_VIDEO
android.hardware.action.NEW_PICTURE
android.hardware.action.NEW_VIDEO

android.hardware.x 动作是“官方”当前广播,但 com.android.x 是由三星设备和旧版本的 Android 发送的。

于 2015-03-13T21:59:57.453 回答
1

我认为您可以使用FileObserver来实现这一点 。

如文档中所述:

监视文件以在设备上的任何进程访问或更改文件后触发事件。每个 FileObserver 实例监视单个文件或目录。如果一个目录被监控,那么被监控目录内的所有文件和子目录都会触发事件。

但你必须记住:

如果 FileObserver 被垃圾回收,它将停止发送事件。为确保您继续接收事件,您必须保留对其他活动对象的 FileObserver 实例的引用。

请给我一些反馈。希望这会有所帮助。

于 2014-01-30T06:41:43.820 回答