Developer_hong

[안드로이드/Android] 미디어 스캐너(Media Scanner) 본문

프로그래밍/안드로이드

[안드로이드/Android] 미디어 스캐너(Media Scanner)

Developer_hong 2019. 11. 18. 18:15
반응형

안드로이드 시스템에서 사진첩(갤러리)를 새로고침하는 방법은 대표적으로 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

반응형