[안드로이드/Android] 미디어 스캐너(Media Scanner)
안드로이드 시스템에서 사진첩(갤러리)를 새로고침하는 방법은 대표적으로 2가지가 있다.
1. BroadCast를 이용하는 방법
2. MediaScannerConnection를 이용하는 방법
저는 2번째 MediaScannerConnection 방법을 추천합니다.
3. MediaScanner를 이용하는 방법
sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(targetImageFile)));
4. MediaScanner를 이용하는 방법
ex) 레이아웃 이미지로 저장 + 미디어 스캔 : (https://hongdroid.tistory.com/6)
[ 1-1. BroadCast (ACTION_MEDIA_MOUNTED) ]
sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED,Uri.parse("file://"+Environment.getExternalStorageDirectory())));
-> KITKAT 버전 이후 사용불가
[ 1-2. BroadCast (ACTION_MEDIA_SCANNER_SCAN_FILE) ]
Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
intent.setData(Uri.fromFile(file);
sendBroadcast(intent);
-> 예전엔 잘돼서 이 방법을 사용했는데 안드로이드 7.0 (누가) 버전 이후 잘 안된다
[ 2. MediaScannerConnection ] // MediaScanner.Class 파일 생성하여 코드 추가
import android.content.Context;
import android.media.MediaScannerConnection;
import android.net.Uri;
import android.util.Log;
public class MediaScanner {
private Context ctxt;
private String file_Path;
private MediaScannerConnection mMediaScanner;
private MediaScannerConnection.MediaScannerConnectionClient mMediaScannerClient;
public static MediaScanner newInstance(Context context)
{
return new MediaScanner (context);
}
private MediaScanner (Context context) {
ctxt = context;
}
public void mediaScanning(final String path) {
if (mMediaScanner == null) {
mMediaScannerClient = new MediaScannerConnection.MediaScannerConnectionClient() {
@Override public void onMediaScannerConnected() {
mMediaScanner.scanFile(file_Path, null);
}
@Override public void onScanCompleted(String path, Uri uri) {
System.out.println("::::MediaScan Success::::");
mMediaScanner.disconnect();
}
};
mMediaScanner = new MediaScannerConnection(mContext, mMediaScannerClient);
}
mPath = path;
mMediaScanner.connect();
}
}
위와 같이 MediaScanner.Class 를 만들고 미디어 스캔이 필요한 부분에 아래의 코드를 추가
============================================================
//파일 미디어 스캔
MediaScanner media_scanner = MediaScanner .newInstance(getApplicationContext());
try {
media_scanner.mediaScanning(Str_Path + filename + ".jpg"); // 경로 + 제목 + .jpg
} catch (Exception e) {
e.printStackTrace();
System.out.println(":::: Media Scan ERROR:::: = " + e);
}
============================================================
* 메모
저장된 사진의 폴더 경로를 이용해 MediaScan을 하였더니 안됐다
ex) media_scanner.mediaScanning(Str_Path);
//Str_Path = Environment.getExternalStorageDirectory().getAbsolutePath()+"/DCIM/Camera/";
//저장 시 사용될 폴더 경로 String Type 변수 (/storage/emulated/0/DCIM/Camera/)
해결 -> 폴더 경로가 아니라 직접 파일명+확장자 까지 MediaScan해주니 동작함
ex) media_scanner.mediaScanning(Str_Path+filename+".jpg"); // 경로 + 제목 + .jpg