2013-05-10 82 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

相关问题