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);
转储文件在崩溃后立即出现。
我在我的应用程序中实现了一个异常处理程序,它会在应用程序因未捕获的异常而崩溃时创建一个转储文件,然后交给默认的异常处理程序。
创建的文件内容正确,但在连接的 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);
转储文件在崩溃后立即出现。