2013-05-10 2 views
2

내 응용 프로그램의 일부 오류 보고서에서이 java.lang.IllegalStateException: not connected to MediaScannerService 예외가 발생합니다.Android의 미디어 라이브러리에 파일을 추가 할 때 "java.lang.IllegalStateException : MediaTannerService에 연결되지 않았습니다."

그들은 너무 많지는 않지만 내 전화/에뮬레이터에서 문제없이 작동하기 때문에 내 코드에서 무엇이 잘못되었는지 알지 못합니다.

public static void scanMedia(Context context, final File[] file, final String[] mime) { 
    msc = new MediaScannerConnection(context, new MediaScannerConnectionClient() { 
     public void onScanCompleted(String path, Uri uri) { 
      Utils.logger("d", "Scanned " + path + ":", DEBUG_TAG); 
      Utils.logger("d", "-> uri: " + uri, DEBUG_TAG); 
      msc.disconnect(); 
     } 
     public void onMediaScannerConnected() { 
      for (int i = 0; i < file.length; i++) { 
       msc.scanFile(file[i].getAbsolutePath(), mime[i]); 
      } 
     } 
    }); 
    msc.connect(); 
} 

내 전화 :

Utils.scanMedia(getApplicationContext(), 
       new File[] {myVideo}, 
       new String[] {"video/*"}); 

또는

Utils.scanMedia(getApplicationContext(), 
       new File[] {myOtherVideo, myAudio}, 
       new String[] {"video/*", "audio/*"});` 
나는 방법 How to get and set (change) ID3 tag (metadata) of audio files?

에서 SO 질문/대답에서 적응 MediaScanner를 호출하는 방법을 사용하고 있습니다

어떻게 이러한 예외를 피할 수 있습니까?

답변

2

경쟁 조건입니다. onMediaScannerConnected() 메서드에서 여러 파일을 반복합니다. 하지만 당신은 disconnect() 파일을 추가하는 데 사용하는 연결.

3 개의 파일이 있다고 가정 해보십시오. 파일 하나가 시작되고 파일 2에 대해서는 아무 문제없이 scanFile()으로 전화 할 수 있습니다. 그러나 세 번째 파일에 대해 scanFile()을 호출하기 전에 첫 번째 파일은 이미 완료되었습니다. 따라서 Android는 콜백 메소드 onScanCompleted()을 호출합니다. 그리고 여기서 disconnect()을 호출하여 세 번째 파일에 사용할 연결을 닫습니다. 따라서 세 번째로 scanFile() 전화가 연결되면 더 이상 유효하지 않습니다!

이런 일이 발생할 수도 있고 그렇지 않을 수도 있습니다. 어떤 스레드가 얼마나 빨리 실행되고 특정 순서로 처리 시간을 가지는지에 따라 다릅니다. 따라서 여러분은이 예외 사항을 매 순간 만 얻습니다.

원한다면 ytdownloader에 대한 수정 사항을 제공 할 것입니다.

+0

당신은 전적으로 록, 내 친구 ... 그리고'예'나는 당연히 당기는 요청을 좋아할 것입니다. ;) – dentex

+0

Wolfram의 블로그에서 제공하는 솔루션 : http://www.grokkingandroid.com/adding-files-to-androids-media-library-using-the-mediascanner/ – dentex

+1

ytdownloader의 출처에 대한 링크 및 의견을 보내 주셔서 감사합니다! –