Как получать уведомления о каждом новом изображении, видимом для приложения галереи?

Фон

Когда пользователь загружает новое изображение или захватывает его с помощью камеры, приложение галереи обновляется, чтобы отображать новые изображения.

Мне нужно получить уведомление о каждом новом изображении сразу после его создания независимо от того, как он был создан (камера, браузер,...), как показано в приложении галереи.

Проблема

Как оказалось, есть компонент 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 и отслеживать его изменения (используя что-то вроде this) и сохраняйте приложение работает только для этого? Я действительно надеюсь, что не...

Ответ 1

ACTION_MEDIA_SCANNER_FINISHED используется для добавления новых каталогов в галерею:

Трансляция: сканер мультимедиа завершил сканирование каталога. Путь к отсканированному каталогу содержится в Intent.mData поле.

Постоянное значение: "android.intent.action.MEDIA_SCANNER_FINISHED"

Вы должны использовать ACTION_MEDIA_SCANNER_SCAN_FILE, который используется для добавления новых файлов, а не только каталогов:

Broadcast Action: запросите сканер для сканирования файла и добавьте его к базе данных СМИ. Путь к файлу содержится в Intent.mData.

Постоянное значение: "android.intent.action.MEDIA_SCANNER_SCAN_FILE"

Вы можете протестировать этот Intent с помощью обсуждаемого кода здесь.

Кроме того, some, как сообщается, необходимо было включить тип mime и расширения файлов, такие как:

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

Ответ 2

Возможно, вы захотите также добавить их в свой фильтр:

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 отправляются устройствами Samsung и более старыми версиями Android.

Ответ 3

Я думаю, вы можете добиться этого, используя FileObserver.

как указано в документации:

Мониторинг файлов для запуска события после того, как файлы будут доступны или изменены любым процессом на устройстве. Каждый экземпляр FileObserver контролирует один файл или каталог. Если отслеживается каталог, события будут запускаться для всех файлов и подкаталогов внутри контролируемого каталога.

но вы должны иметь в виду:

Если FileObserver собирает мусор, он прекратит отправку событий. Чтобы вы продолжали получать события, вы должны сохранить ссылку на экземпляр FileObserver из другого живого объекта.

Пожалуйста, дайте мне несколько отзывов. Надеюсь, это поможет.