2013-05-10 115 views
2

將文件添加到媒體庫時,我收到來自我的應用程序的一些崩潰報告這個java.lang.IllegalStateException: not connected to MediaScannerService例外。「java.lang.IllegalStateException:沒有連接到MediaScannerService」 Android中

他們不是太多,但我不知道什麼是錯在我的代碼,因爲我的手機/模擬器它的工作原理確定。 我使用的方法調用改編自SO提問/回答的MediaScanner在How to get and set (change) ID3 tag (metadata) of audio files?

的方法:

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/*"});` 

如何避免這些例外?

回答

2

這是一種競爭條件。您正在迭代onMediaScannerConnected()方法中的多個文件。但你用disconnect()你用來添加文件的連接。

說你有三個文件。文件一開始,文件二你可以打電話scanFile()也沒有任何問題。但在第三個文件調用scanFile()之前,第一個文件已經完成。因此,Android會調用您的回撥方法onScanCompleted()。在這裏你打電話disconnect(),從而關閉你想用於第三個文件的連接。因此與第三個scanFile()調用連接不再有效!

可能發生這種情況,還是不行。取決於哪個線程運行的速度有多快,並獲得特定順序的處理時間。因此你只是偶爾得到這個例外。

,如果你喜歡,我會提供與ytdownloader修復拉請求。

+0

你完全是ROCK,我的朋友......而'YES'我很樂意提出拉請求。 ;)從Wolfram的博客 – dentex 2013-05-10 08:30:10

+0

解決方案:http://www.grokkingandroid.com/adding-files-to-androids-media-library-using-the-mediascanner/ – dentex 2013-05-11 08:36:01

+1

感謝您的鏈接和評論中ytdownloader的源泉! – 2013-05-11 18:41:26

相關問題