Android 如何在gallery应用程序看到每个新图像时获得通知? 背景

Android 如何在gallery应用程序看到每个新图像时获得通知? 背景,android,broadcastreceiver,android-camera,media,android-mediascanner,Android,Broadcastreceiver,Android Camera,Media,Android Mediascanner,当用户下载新图像或使用相机拍摄图像时,gallery应用程序将更新以显示新图像 正如gallery应用程序所显示的那样,无论新图像是如何创建的(照相机、浏览器等),我都需要在创建后立即收到通知 问题 事实证明,有一个mediaScanner Android组件负责扫描所有类型的媒体文件,当扫描完成时,它应该发送一个intent“”(如图所示) 因此,我添加了下一个代码,希望每次用户从照相机应用程序拍照时,它都能显示祝酒词: 舱单: ... <receiver android

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

正如gallery应用程序所显示的那样,无论新图像是如何创建的(照相机、浏览器等),我都需要在创建后立即收到通知

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

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

舱单:

    ...
    <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>
    ...
由于某些原因,此代码不起作用

问题 代码怎么了

拍完照片后,广播接收器会被呼叫吗

正确的方法是什么

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

用于向库中添加新目录:

广播操作:媒体扫描程序已完成对目录的扫描。 扫描目录的路径包含在Intent.mData中 场

常量值:“android.intent.action.MEDIA\u SCANNER\u FINISHED”

您应该使用,它用于添加新文件,而不仅仅是目录:

广播操作:请求媒体扫描程序扫描并添加文件 到媒体数据库。文件的路径包含在 Intent.mData字段

常量值:“android.intent.action.MEDIA\u SCANNER\u SCAN\u文件”

您可以使用讨论的代码测试此
Intent

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

<data android:mimeType="*/*"/>
<data android:pathPattern=".*\\.png" />

我想您可以使用

如文件中所述:

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

但你必须记住:

如果FileObserver被垃圾收集,它将停止发送事件。为了确保您一直接收事件,您必须从其他一些活动对象中保留对FileObserver实例的引用。

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

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

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发送的。

我知道Toast对其工作有一些限制。UI线程和活动上下文。所以,在说代码不起作用之前。你能不能改为写一个日志,再仔细检查一下log.d(“toast”,“gallery有新图像”)是,使用日志也显示它不起作用。现在也将更新这里的代码。我在清单上还发现了一个奇怪的东西,我已经修正了。这只是一个猜测,或者叫
“com.android.camera.NEW_PICTURE”
instead@a.ch. 这将仅由本机摄像头应用程序调用,并且仅从特定API调用。我希望收到画廊可以展示的任何图像的通知,并且不受特定应用程序的限制。第三方相机在拍摄新照片时不会使用此功能。您好,您有解决方案吗?。我被困在同一点上。遗憾的是,我仍然一无所获。对你有用吗?你是否运行了你的应用程序,当你使用相机拍照时,你是否有意向?@androiddeveloper我在答案中添加了更多关于mime类型和文件扩展名的内容。这有用吗?还是没用。我还尝试了android:pathPattern=“.\\.jpg”和android:pathPattern=“.\\.jpg”。我想知道这是一个正则表达式还是通配符。我不认为这两个选项像答案中所说的那样相似。如文档中所述,_SCAN_FILE是请求扫描,而_SCANNER_FINISHED是通知介质扫描仪已完成。“扫描器”完成广播后会通知您有新数据,但您需要查询媒体存储以查找新数据,好的。我如何知道要收听哪些文件?只应监视为mediaStore存储的文件。。。你试过了吗?如何监控特定的流程,以及mediaStore应该使用哪个流程?如何让fileObserver观察所有目录中的所有文件,而不是单个文件(它似乎不是递归的)?您必须为设备上的每个文件夹以及每个新文件夹创建一个实例…例如:您可以按如下方式侦听图片目录:Environment.getExternalStoragePublicDirectory(Environment.directory\u pictures);等等,为您的目录。不,我还没试过。您不想监视哪个进程创建了文件,您将监视设备中任何进程创建的任何文件。但我不想监视创建的每个文件,因为有些文件不会进入mediaStore(可能还有大多数文件)。我也不想只监视您编写的这个文件夹,因为用户可以安装将图像文件(如第三方相机)放在其他文件夹中的应用程序,这仍然会让gallery应用程序知道这些文件……例如,您不能监视SD卡吗?我不知道我所说的是否正确,我现在已经读过了。它似乎不能够递归地工作-您必须自己创建许多FileObserver-每个目录一个,甚至新目录一个。。。对于每个文件,您必须检查它是否进入mediaStore。。。我认为这可能是一个过火的问题…这个问题太老了,所以我不再需要它了。然而,这很有趣。d怎么了
com.android.camera.NEW_PICTURE
com.android.camera.NEW_VIDEO
android.hardware.action.NEW_PICTURE
android.hardware.action.NEW_VIDEO