* MediaScannerConnection 이용

private MediaScannerConnectionClient client = new MediaScannerConnectionClient(){
        public void onMediaScannerConnected() {
            mediaScanner.scanFile(path, mimetype);
        }

        public void onScanCompleted(String path, Uri uri) {
mediaScanner.disconnect();
        }
};

MediaScannerConnection mediaScanner = new MediaScannerConnection(context.getApplicationContext(), client);
mediaScanner.connect();

이건 원하는 파일을 scanning 할 수 있다.
그리고 MediaScannerConnection 의 첫번째 인자로 Context가 들어가는데 ApplicationContext를 넣어줘야 connect가 되더라;
이거때문에 삽질;;

기존의 content가 삭제된 경우는 scan한다고 해서 기존의 content가 db에서 제거되지 않기때문에
content uri를 얻어와서 provider를 통해 직접 delete를 호출해 줘야 한다.
(scan한다음 넘어오는 uri 사용, scan 안한다면 where문 잘써서 query 날려~)

* 구찮으니 통째로 Scanning!!

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

media mount action을 새로 보내버리는 것이다.
그럼 다시 scanning을 하기때문에 파일을 이동시킨경우 삭제된 것 까지 처리가 쉽게 되버린다~
하지만 비효율적이니;


이를 수행하고 나면 아래와 같은 log를 볼수 있다.

D/MediaScannerService(  181): start scanning volume external
D/MediaScanner(  181):     scan time: 111ms
D/MediaScanner(  181): postscan time: 59ms
D/MediaScanner(  181):    total time: 687ms
D/MediaScannerService(  181): done scanning volume external


통째로 scanning하는 하는 방법은 비추이다

kitkat부터는 security가 강화되었는데 Intent.ACTION_MEDIA_MOUNTED 는 system 이 보내는 broadcast이므로 사용자가 보내면 FC가 발생한다.

쓰지맙시다!!


Posted by 바나나쥬스