3

我在java.lang.IllegalStateException: not connected to MediaScannerService我的应用程序的一些崩溃报告中收到此异常。

它们不是太多,但我不知道我的代码有什么问题,因为在我的手机/模拟器上它工作正常。我正在使用一种方法来调用根据如何获取和设置(更改)音频文件的 ID3 标记(元数据)中的 SO 问题/答案改编的 MediaScanner?

方法:

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

如何避免这些异常?

4

1 回答 1

3

这是一个竞赛条件。您正在迭代onMediaScannerConnected()方法中的多个文件。但是您disconnect()用于添加文件的连接。

假设您有三个文件。文件一开始,对于文件二,您也可以scanFile()毫无问题地调用。但在您调用scanFile()第三个文件之前,第一个文件已经完成。因此 Android 调用您的回调方法onScanCompleted()。在这里,您正在调用disconnect()从而关闭要用于第三个文件的连接。因此,第三次scanFile()调用连接不再有效!

这可能会发生,也可能不会。取决于哪个线程运行多快并以特定顺序获得处理时间。因此,您只会时不时地得到这个例外。

如果您愿意,我将提供一个包含 ytdownloader 修复程序的拉取请求。

于 2013-05-10T08:10:31.970 回答