我在我的应用程序的一些崩溃报告中收到此 java.lang.IllegalStateException: not connected to MediaScannerService
异常。
它们不是太多,但我不知道我的代码有什么问题,因为在我的手机/模拟器上它工作正常。 我正在使用一种方法来调用改编自 How to get and set (change) ID3 tag (metadata) of audio files? 上的 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/*"});`
如何避免这些异常?
最佳答案
这是一个竞争条件。您正在 onMediaScannerConnected()
方法中迭代多个文件。但是您disconnect()
用于添加文件的连接。
假设您有三个文件。文件一开始,对于文件二,您也可以毫无问题地调用 scanFile()
。但是在您为第三个文件调用 scanFile()
之前,第一个文件已经完成。因此 Android 调用您的回调方法 onScanCompleted()
。在这里您调用 disconnect()
从而关闭您想要用于第三个文件的连接。因此,对于第三个 scanFile()
调用,连接不再有效!
这可能会发生,也可能不会。取决于哪个线程运行得有多快,并以哪种特定顺序获得处理时间。因此,您只是时不时地遇到此异常。
如果您愿意,我会提供一个包含 ytdownloader 修复程序的拉取请求。
关于android - "java.lang.IllegalStateException: not connected to MediaScannerService"在Android中添加文件到媒体库时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16477635/