3

外部ストレージで次の機能を実行するギャラリーのようなアプリを構築しようとしています:

  • その中に画像があるすべてのフォルダを一覧表示します
  • 公開されているすべての画像を一覧表示します ( 内のファイルは調べませんAndroid/data)

これまでのところ、すべての画像と、画像を含むフォルダーを一覧表示できます。ただし、後でこれらの画像とフォルダーが最新のものではないことがわかりました。いくつかの写真を配置した後、それらは更新されません (たとえば、単にスクリーンショットを作成したり、写真をダウンロードしたりします)。

また、 を呼び出しても新しい写真が表示されませんMediaScannerConnection.scanFile

を除いて、指定されたフォルダーでMediaScannerConnection高価な方法も試しましたが、うまくいきませんでした。Intent.ACTION_MEDIA_SCANNER_SCAN_FILE

私は StackOverflow だけでなく、この問題について議論しているさまざまなソースを閲覧しましたが、どれも有効な方法を提供できません。

私がチェック/試したソース:

コード:

すべての画像を一覧表示する方法:

    private String[] projectionThumbnail = new String[]{MediaStore.Images.Thumbnails._ID, MediaStore.Images.Thumbnails.IMAGE_ID, MediaStore.Images.Thumbnails.DATA};
    private Uri uriThumbnail = MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI;

    private String[] projectionFull = new String[]{MediaStore.Images.Media._ID, MediaStore.Images.Media.BUCKET_DISPLAY_NAME, MediaStore.Images.Media.DATA};
    private Uri uriFull = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;


@Override
    public Loader<Cursor> onCreateLoader(int id, Bundle args) {
        switch (id) {
            case LOADER_ALL_IMAGES:
                return new CursorLoader(getActivity(), uriThumbnail, projectionThumbnail, null, null, MediaStore.Images.Thumbnails._ID + " DESC");
            default:
                return null;
        }
    }

    @Override
    public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
        switch (loader.getId()) {
            case LOADER_ALL_IMAGES:
                adapter.changeCursor(cursor);
                break;
}
    }
    @Override
    public void onLoaderReset(Loader<Cursor> loader) {
        adapter.changeCursor(null);
    }

// And here's how I init the CursorLoader
LoaderManager lm = getActivity().getLoaderManager();
lm.initLoader(LOADER_ALL_IMAGES, null, this);

画像のスキャンを開始する方法は次のとおりです。外部ストレージ全体をスキャンするつもりですが、今のところ、実験のために DCIM、PICTURES、および DOWNLOADS のみをスキャンします。

    File dcim = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);
    File pictures = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
    File downloads = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);

    MediaScannerConnection.scanFile(this,
            new String[]{dcim.getAbsolutePath(), pictures.getAbsolutePath(), downloads.getAbsolutePath()}, new String[]{"image/*", "image/*", "image/*"},
            new MediaScannerConnection.OnScanCompletedListener() {
                public void onScanCompleted(String path, Uri uri) {
                    Log.i("ExternalStorage", "Scanned " + path + ":");
                    Log.i("ExternalStorage", "-> uri=" + uri);
                }
            });

質問:

Stock 5.0.2 と 4.4 でテストを行いましたが、どちらも同じ結果でした。

  1. 私は何か間違ったことをしていますか?
  2. MediaScanner が機能しないのはなぜですか?

ノート:

面白いことに、Instagramを開いてそこから「ギャラリーを選択」を開くと。ギャラリーのコンテンツが更新されています。つまり、Instagram は「ギャラリーの更新」を非常にうまく行っているため、私のアプリも最新のギャラリー コンテンツを受け取ることができます。

4

0 に答える 0