2011-03-05 3 views
2

나는 사용자가 그릴 수있는 앱을 가지고 있으며 그 그림을 외부 저장 장치에 .png 파일로 '내보냄'(있는 경우)합니다. 파일을 외부로 복사하는 PNG를 생성하면 매력처럼 작동하지만 다소 독특한 문제가 발생합니다. 내보내기 후에 사용자가 내 파일 (이 경우 2.2를 실행하는 Samsung Tab)을 통해 이미지를 탐색하면 .png 파일을 볼 수 있지만 파일을 열면 약 10 초 동안 검정색이됩니다. 그런 다음 그들은 이미지를 볼뿐만 아니라 이미지가 사용자의 '갤러리'앱에도 표시되지 않습니다.Android : Media Scanner가 실행되지 않는 문제

사용자가 USB를 통해 기기를 컴퓨터에 연결하거나 기기를 재부팅하면 내 파일에서 아무런 문제없이 이미지에 액세스 할 수 있으며 해당 시점부터 '갤러리'에 표시되지만 다시 새로 추가 된 파일은 장치를 다시 순환/연결할 때까지 동일한 문제가 발생합니다.

내 생각에이 문제는 미디어 스캐너와 관련이 있어야한다는 생각이 들었습니다. (적어도 '갤러리'문제의 경우에는 가장 확실합니다.)

그래서 Api 8+를 타겟팅하면서 정적 인 MediaScannerConnection.scanFile() 메서드를 사용하여 OS를 다시 스캔하고 갤러리에 이미지를 추가하는 등의 작업을 시도하고 있습니다. 또한 이상한 지연 문제가 해결되기를 기대합니다. 이미지를 열 때. 내가 이미지를 수출하고, 따라서 위의 호출을 실행할 때

MediaScannerConnection.scanFile(
    context, 
    new String[] { "/mnt/sdcard/MyApp" }, 
    null, 
    null 
); 

로그 캣이 나에게 다음과 같은 항목을 제공합니다 : 그래서

DEBUG/MediaScannerService(2567): IMediaScannerService.scanFile: /mnt/sdcard/MyApp mimeType: null 
DEBUG/MediaScannerService(2567): onStartCommand : intent - Intent { cmp=com.android.providers.media/.MediaScannerService (has extras) } 
DEBUG/MediaScannerService(2567): onStartCommand : flags [0], startId [1] 
DEBUG/MediaScannerService(2567): ServiceHandler:handleMessage volume[null], filePath[/mnt/sdcard/MyApp] 
DEBUG/MediaProvider(2567): getSdSerial() sd state = removed 
INFO/Database(2567): sqlite returned: error code = 17, msg = prepared statement aborts at 43: [SELECT DISTINCT sd_serial FROM images WHERE sd_serial LIKE 'external_0x%'] 
ERROR/MediaProvider(2567): removeMediaDBData called 
DEBUG/MediaScanner(2567): prescan enter: path - /mnt/sdcard/MyApp 
DEBUG/MediaScanner(2567): prescan return 

을 MediaScanner는 정확한 위치를 점점 것 같습니다, 여기 내 코드는 , 그러나 정확하고 실패한 SD 카드를 찾지 못하고 있습니다. 삼성 탭에는 비 SD 외부 저장소가 내장되어 있으며, Android는 Environment.getExternalStorageDirectory()을 통해 액세스 권한을 부여합니다. SD가 아닌 저장소를 검사하려면 어떻게해야합니까?

아이디어 진행 방법은 무엇입니까?

답변

3

찾을 인 텐트를 통해 미디어 스캐너에 방송 요청을 보내는 포함 여기에 솔루션 :

How to update the Android media database

MediaScannerConnection.scanFile로 문제를 파악하지 않았다 마십시오. 삭제를 들어 미디어 스토어 MediaStore

에서 지원하는 모든 MIME 타입으로 작업 : 단지 getContentResolver를 사용

0

당신이에게 파일을 추가 때마다,이

sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(imageAddedOrDeleted))); 

큰 장점 사용에 대한 미디어 스토어 MediaStore 컨텐트 제공자가 알고하자() .delete (uri, null, null)