web-dev-qa-db-ja.com

特定のパス(フォルダー)でmediascannerをトリガーします。方法

私はこのクラスを手に入れました:

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
    }
}

他のクラスでそれを使用するには?クラスを適切に使用する方法がわかりません。試しましたが、何も機能しません。私は何か悪いことをしますが、私は何かを知りません、誰かがこれを手伝ってくれるでしょうか。

15
Bigflow

非常に単純なコードでそれを行う方法を見つけました。

次のコード行を呼び出すだけです。

sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://" + Environment.getExternalStorageDirectory())));

これにより、mediascannerがトリガーされます。

10
Bigflow

ストーリー

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);

                    }
                });
49
Aritra Roy
   File file = new File(absolutePath);
   Uri uri = Uri.fromFile(file);
   Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, uri);
   sendBroadcast(intent);
6
abhi5306

Androidには、デバイス上に存在するすべてのメディアコンテンツを追跡するためにメディアスキャナーによって使用されるコンテンツデータベースがあります。

Androidが起動すると、mediascannerサービスが起動し、外部ストレージ全体を実行して、新しいメディアコンテンツを見つけると、新しいメディアコンテンツがあるかどうかを確認します。

  • そのメディアコンテンツのエントリをコンテンツデータベースに追加します
  • コンテンツデータベースの各エントリには、名前、日付、ファイルサイズ、ファイルの種類などのメディアコンテンツのメタデータが含まれています。
  • したがって、メディアコンテンツに変更を加える場合は、コンテンツデータベースも更新する必要があります。
  • コンテンツデータベースが更新されていない場合、他のアプリケーションもその特定のメディアコンテンツにアクセスできなくなります。
  • メディアスキャナーを実行すると、コンテンツデータベースが更新されるだけです。

メディアスキャナーを実行する代わりに、コンテンツデータベースを自分で更新すると、問題を解決できます。

コンテンツリゾルバーを使用して挿入、削除、更新する方法については 説明 をご覧ください。 (「データの挿入、更新、削除」セクションを検索してください)

編集:この answer にサンプルコードがあります。 Januszの回答を確認してください。

6
bluefalcon
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 セクション

1
Loyea

@Aritra Royの答えとして、この問題について実験することにします。私がここで得たものは:

  • Intent.ACTION_MEDIA_MOUNTEDおよびIntent.ACTION_MEDIA_SCANNER_SCAN_FILEは個々のファイルパスを受け入れることができるため、sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE、Uri.parse(filePath))));またはsendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED、Uri.parse(filePath))));有効になります。
  • KitKat以降でIntent.ACTION_MEDIA_MOUNTEDを使用して個別のファイルパスを使用しても、アプリケーションはクラッシュします
  • KitKatよりも低いデバイスでIntent.ACTION_MEDIA_SCANNER_SCAN_FILEまたはMediaScannerConnectionを使用すると、アプリケーションは強制的に閉じませんが、メソッドは単に期待どおりに機能しません。

その実験から、私は処理する最良の方法は

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)));
}

何かを見逃した場合はお知らせください

0
HendraWD