Android

안드로이드(android) Intent.ACTION_MEDIA_SCANNER_SCAN_FILE deprecated 대체방법

Android의 파일 시스템에 파일을 추가 할 때 특정 파일 미디어 파일 스캔 처리를 위해 이미지를 저장 후 갤러리에 보이도록 하기 위해서 지금까지는 Intent.ACTION_MEDIA_SCANNER_SCAN_FILE필터를 사용하여 sendBroadcast()로 보내서 갤러리에 업데이트 되도록 하였습니다. 휴대폰을 재부팅하거 sd카드를 다시 마운트 하는 경우에만 전체 미디어 스캔을 실행하게 되긴 하지만 별로 추천하는 방법은 아닙니다.

Intent intent = 
      new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
intent.setData(Uri.fromFile(file));
sendBroadcast(intent);

그러나 API 29 부터는 더 이상 사용할 수 없게 되었습니다.

갤러리에 이미지가 새로 추가 되었음을 알리기 위해서는 MediaScannerConnection를 사용해야 합니다.

 

안드로이드 미디어 라이브러리에 파일 추가하는 방법

MediaScannerConnection의 scanFile()메소드를 사용하여 처리합니다.  다음 예제 코드 스니펫에서는 별도의 mimetype은 주지 않고 null 처리하였습니다.

public class MainActivity extends Activity {
    MediaScannerConnection mediaScannerConnection = null;
    MediaScannerConnection.MediaScannerConnectionClient mMediaScannerClient = null;
  
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        //대상 파일
        final File file = mypath;
        
        //미디어스캐너 클라이언트 init
        mMediaScannerClient = new MediaScannerConnection.MediaScannerConnectionClient(){
            @Override
            public void onMediaScannerConnected() {
                mediaScannerConnection.scanFile( file.getPath(), null);
                 System.out.println("미디어 스캔 성공");
            }

            @Override
            public void onScanCompleted(String path, Uri uri) {
                System.out.println("미디어 스캔 연결 종료 처리 uri=" + uri);
                mediaScannerConnection.disconnect();
            }
        };

        mediaScannerConnection = new MediaScannerConnection(MainActivity.this, mMediaScannerClient);
        mediaScannerConnection.connect();        
        
    }

또는

public void scanFile(Context ctxt, File f, String mimeType) {
    MediaScannerConnection
        .scanFile(ctxt, new String[] {f.getAbsolutePath()},
                  new String[] {mimeType}, null);
}

또는

        MediaScannerConnection.scanFile(
                getApplicationContext(),
                new String[]{file.getAbsolutePath()},
                null,
                new MediaScannerConnection.OnScanCompletedListener() {
                    @Override
                    public void onScanCompleted(String path, Uri uri) {
                        System.out.println("미디어 스캔 성공 및 연결 종료 처리 uri=" + uri);
                    }
                });    

또는

public class MainActivity extends Activity {
    MediaScannerConnection mediaScannerConnection = null;
    MediaScannerConnection.MediaScannerConnectionClient mMediaScannerClient = null;
  
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        //대상 파일
        final File file = mypath;
        
        MediaScannerConnection.MediaScannerConnectionClient client =
                new CustomMediaScannerConnectionClient(
        getApplicationContext(), file, null);      
        
    }
    


	final class CustomMediaScannerConnectionClient
            implements MediaScannerConnection.MediaScannerConnectionClient {

        private String mFilename;
        private String mMimetype;
        private MediaScannerConnection mediaScanner;

        public CustomMediaScannerConnectionClient
                (Context context, File file, String mimetype) {
            this.mFilename = file.getAbsolutePath();
            mediaScanner = new MediaScannerConnection(context, this);
            mediaScanner.connect();
        }
        @Override
        public void onMediaScannerConnected() {
            mediaScanner.scanFile(mFilename, mMimetype);
            System.out.println("미디어 스캔 성공 ");
        }

        @Override
        public void onScanCompleted(String path, Uri uri) {
            System.out.println("미디어 스캔 연결 종료 처리 uri=" + uri);
            mediaScanner.disconnect();
        }
    }

스캔종료 후 리턴 되는 Uri가 null인경우 실패한 것입니다.

 

[REFERENCE]

www.grokkingandroid.com/adding-files-to-androids-media-library-using-the-mediascanner/

stackoverflow.com/questions/32789157/how-to-write-files-to-external-public-storage-in-android-so-that-they-are-visibl

 

Leave a Reply

error: Content is protected !!