私はこのクラスを手に入れました:
import Android.content.Context;
import Android.media.MediaScannerConnection;
import Android.net.Uri;
import Android.util.Log;
public class MediaScannerWrapper implements
MediaScannerConnection.MediaScannerConnectionClient {
private MediaScannerConnection mConnection;
private String mPath;
private String mMimeType;
// filePath - where to scan;
// mime type of media to scan i.e. "image/jpeg".
// use "*/*" for any media
public MediaScannerWrapper(Context ctx, String filePath, String mime){
mPath = "/sdcard/DCIM/Camera";
mMimeType = "jpg";
mConnection = new MediaScannerConnection(ctx, this);
}
// do the scanning
public void scan() {
mConnection.connect();
}
// start the scan when scanner is ready
public void onMediaScannerConnected() {
mConnection.scanFile(mPath, mMimeType);
Log.w("MediaScannerWrapper", "media file scanned: " + mPath);
}
public void onScanCompleted(String path, Uri uri) {
// when scan is completes, update media file tags
}
}
他のクラスでそれを使用するには?クラスを適切に使用する方法がわかりません。試しましたが、何も機能しません。私は何か悪いことをしますが、私は何かを知りません、誰かがこれを手伝ってくれるでしょうか。
非常に単純なコードでそれを行う方法を見つけました。
次のコード行を呼び出すだけです。
sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://" + Environment.getExternalStorageDirectory())));
これにより、mediascannerがトリガーされます。
ストーリー
Android 4.4以前は、ブロードキャストを送信して、特定のファイル、フォルダー、またはストレージのルートでメディアスキャナーをトリガーすることができました。しかし、4.4 KitKat以降、これはAndroid開発者。
固定と言うのはなぜですか?理由は簡単です。ルートディレクトリでMEDIA_MOUNTEDを使用してブロードキャストを送信すると、非常に負荷がかかります。メディアスキャナーの実行はコストのかかる操作であり、ユーザーがストレージと深いフォルダー構造に多くのファイルを持っている場合、状況はさらに悪化します。
変更前Android 4.4
わかりやすくシンプルにしてください。 Android 4.4。の前にアプリをターゲットにしている場合。ただし、絶対に必要でない限り、ルートディレクトリで使用しないように注意してください。
sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://" + Environment.getExternalStorageDirectory())));
Android 4.4から
あなたのための2つの方法があります。
i)最初のものは前の例と非常に似ていますが、効率的に機能しない可能性があり、あまりお勧めできません。
sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + Environment.getExternalStorageDirectory())));
ii)次に、この問題の最も推奨された効率的な解決策に移りましょう。
このように、更新されたファイルのファイルパスをString型のArrayListに追加します。
ArrayList<String> toBeScanned = new ArrayList<String>();
toBeScanned.add(item.getFilePath());
次に、MediaScannerConnectionクラスの静的メソッドscanFile()を実行し、更新されてメディアスキャンする必要があるすべてのファイルのリストを含むString配列を渡す必要があります。
個々のファイルのスキャンが終了したときに応答するリスナーを置くこともできます。
String[] toBeScannedStr = new String[toBeScanned.size()];
toBeScannedStr = toBeScanned.toArray(toBeScannedStr);
MediaScannerConnection.scanFile(getActivity(), toBeScannedStr, null, new OnScanCompletedListener() {
@Override
public void onScanCompleted(String path, Uri uri) {
System.out.println("SCAN COMPLETED: " + path);
}
});
File file = new File(absolutePath);
Uri uri = Uri.fromFile(file);
Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, uri);
sendBroadcast(intent);
Androidには、デバイス上に存在するすべてのメディアコンテンツを追跡するためにメディアスキャナーによって使用されるコンテンツデータベースがあります。
Androidが起動すると、mediascannerサービスが起動し、外部ストレージ全体を実行して、新しいメディアコンテンツを見つけると、新しいメディアコンテンツがあるかどうかを確認します。
メディアスキャナーを実行する代わりに、コンテンツデータベースを自分で更新すると、問題を解決できます。
コンテンツリゾルバーを使用して挿入、削除、更新する方法については 説明 をご覧ください。 (「データの挿入、更新、削除」セクションを検索してください)
編集:この answer にサンプルコードがあります。 Januszの回答を確認してください。
private void galleryAddPic() {
Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
File f = new File(mCurrentPhotoPath);
Uri contentUri = Uri.fromFile(f);
mediaScanIntent.setData(contentUri);
this.sendBroadcast(mediaScanIntent);
}
リファレンス: http://developer.Android.com/training/camera/photobasics.html#TaskGallery
Add the Photo to a Gallery
セクション
@Aritra Royの答えとして、この問題について実験することにします。私がここで得たものは:
その実験から、私は処理する最良の方法は
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KitKat) {
MediaScannerConnection.scanFile(context, new String[]{imagePath}, null, new MediaScannerConnection.OnScanCompletedListener() {
public void onScanCompleted(String path, Uri uri) {
//something that you want to do
}
});
} else {
context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED,
Uri.parse("file://" + imagePath)));
}
何かを見逃した場合はお知らせください