Android UncaughtExceptionHandler 中的 MediaScanner 未扫描文件

Android MediaScanner in UncaughtExceptionHandler not scanning file

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

创建的文件内容正确,但在连接的 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,它在扫描完成时设置一个标志并等待设置该标志.但是,该侦听器似乎从未被调用过。

我的猜测是否正确?这里有什么问题吗?如何确保媒体扫描仪能够扫描文件?

知道了。我不知道为什么上面的方法不起作用,但是发送 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);

转储文件在崩溃后立即出现。