外部ストレージで次の機能を実行するギャラリーのようなアプリを構築しようとしています:
- その中に画像があるすべてのフォルダを一覧表示します
- 公開されているすべての画像を一覧表示します ( 内のファイルは調べません
Android/data
)
これまでのところ、すべての画像と、画像を含むフォルダーを一覧表示できます。ただし、後でこれらの画像とフォルダーが最新のものではないことがわかりました。いくつかの写真を配置した後、それらは更新されません (たとえば、単にスクリーンショットを作成したり、写真をダウンロードしたりします)。
また、 を呼び出しても新しい写真が表示されませんMediaScannerConnection.scanFile
。
を除いて、指定されたフォルダーでMediaScannerConnection
高価な方法も試しましたが、うまくいきませんでした。Intent.ACTION_MEDIA_SCANNER_SCAN_FILE
私は StackOverflow だけでなく、この問題について議論しているさまざまなソースを閲覧しましたが、どれも有効な方法を提供できません。
私がチェック/試したソース:
- http://droidyue.com/blog/2014/01/19/scan-media-files-in-android/
- 特定のパス (フォルダー) で mediascanner をトリガーする方法は?
コード:
すべての画像を一覧表示する方法:
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 でテストを行いましたが、どちらも同じ結果でした。
- 私は何か間違ったことをしていますか?
- MediaScanner が機能しないのはなぜですか?
ノート:
面白いことに、Instagramを開いてそこから「ギャラリーを選択」を開くと。ギャラリーのコンテンツが更新されています。つまり、Instagram は「ギャラリーの更新」を非常にうまく行っているため、私のアプリも最新のギャラリー コンテンツを受け取ることができます。