UncaughtExceptionHandler中的Android MediaScanner无法扫描文件

时间:2016-04-14 08:08:27

标签: android exception-handling race-condition android-mediascanner

我在我的应用程序中实现了一个异常处理程序,当应用程序因未捕获的异常而崩溃时会创建一个转储文件,然后将其移交给默认的异常处理程序。

使用正确的内容创建文件,但除非我手动触发媒体扫描,否则它在连接的PC上不可见。我已经添加了代码来触发新文件的媒体扫描,如下所示:

    Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler() {
        public void uncaughtException(Thread t, Throwable e) {
            Context c = getApplicationContext();
            File dumpDir = c.getExternalFilesDir(null);
            DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss", Locale.ROOT);
            fmt.setTimeZone(TimeZone.getTimeZone("UTC"));
            String fileName = String.format("dump-%s.log", fmt.format(new Date(System.currentTimeMillis())));

            File dumpFile = new File (dumpDir, fileName);
            PrintStream s;
            try {
                InputStream buildInStream = getResources().openRawResource(R.raw.build);
                // write dump
                s.flush();
                s.close();
                String [] scanPaths = {dumpFile.toString()};
                MediaScannerConnection.scanFile(c, scanPaths, null, null);
            } catch (FileNotFoundException e2) {
                e2.printStackTrace();
            }
            defaultUEH.uncaughtException(t, e);
        }
    });

但是,在我手动触发完整媒体扫描之前,该文件仍然无法显示。通过插入日志语句,我可以在媒体扫描被触发后验证我的代码一直运行到最后。

我的怀疑是 实际扫描参与同一个进程,因此一旦默认异常处理程序完成就会被杀死,这可能比扫描完成时更快 应用程序在扫描完成之前被杀死,如果请求进程不再存在,则媒体扫描程序将中止任务。

怀疑应用程序在扫描完成之前被杀死,并且媒体扫描程序因此中止了扫描,我实现了OnScanCompletedListener,它在扫描完成时设置一个标志并等待设置该标志。但是,这个听众似乎永远不会被召唤。

我的怀疑是否正确?这里有什么问题?如何确保媒体扫描程序扫描文件?

1 个答案:

答案 0 :(得分:0)

知道了。我不知道为什么上述内容无效,但发送Intent而不是依赖MediaScannerConnection工作。

替换

String [] scanPaths = {dumpFile.toString()};
MediaScannerConnection.scanFile(c, scanPaths, null, null);

Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
Uri contentUri = Uri.fromFile(dumpFile);
mediaScanIntent.setData(contentUri);
c.sendBroadcast(mediaScanIntent);

并在崩溃后立即显示转储文件。