我在我的应用程序中实现了一个异常处理程序,当应用程序因未捕获的异常而崩溃时会创建一个转储文件,然后将其移交给默认的异常处理程序。
使用正确的内容创建文件,但除非我手动触发媒体扫描,否则它在连接的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
,它在扫描完成时设置一个标志并等待设置该标志。但是,这个听众似乎永远不会被召唤。
我的怀疑是否正确?这里有什么问题?如何确保媒体扫描程序扫描文件?
答案 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);
并在崩溃后立即显示转储文件。