我的应用程序允许用户将图像保存到他们的SD卡中。但是在卸载并重新安装SD卡之前,我不确定如何使它出现在图库中。我已经用几天的时间在Google上搜索了此问题,但不确定如何使其自动出现。我发现
this链接,但是我不确定如何使用该类。这就是我用来保存文件的方式。在try catch块的底部是我要扫描sd卡以查找新媒体的位置。
FileOutputStream outStream = null;
File file = new File(dirPath, fileName);
try {
outStream = new FileOutputStream(file);
bm.compress(Bitmap.CompressFormat.JPEG, 100, outStream);
outStream.flush();
outStream.close();
} catch {
...
}
如果有人能指出正确的方向,我将不胜感激。
最佳答案
我尝试了多种不同的方法来触发MediaScanner,这些是我的结果。
发送广播
最简单,最幼稚的解决方案。它包括从您的代码中执行以下指令:
sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED,
Uri.parse("file://"+ Environment.getExternalStorageDirectory())));
但是,由于缺少必需的权限,此在KitKat设备中不再起作用。
MediaScannerWrapper
如here发布(根据@Brian的回答),它包含包装
MediaScannerConnection
实例,以便在特定目录上触发scan()
方法。实践证明,此方法在4.3及以下版本中可以正常工作,但使用KitKat(4.4+)仍然没有运气。FileWalker
尝试克服MediaStore缺乏更新数据库 promise 的众多Play商店应用之一就是ReScan SD。它发送许多不同的广播:
sendBroadcast(new Intent("android.intent.action.MEDIA_MOUNTED", Uri.parse("file://" + Environment.getExternalStorageDirectory())));
sendBroadcast(new Intent("android.intent.action.MEDIA_MOUNTED", Uri.parse("file:///Removable")));
sendBroadcast(new Intent("android.intent.action.MEDIA_MOUNTED", Uri.parse("file:///Removable/SD")));
sendBroadcast(new Intent("android.intent.action.MEDIA_MOUNTED", Uri.parse("file:///Removable/MicroSD")));
sendBroadcast(new Intent("android.intent.action.MEDIA_MOUNTED", Uri.parse("file:///mnt/Removable/MicroSD")));
sendBroadcast(new Intent("android.intent.action.MEDIA_MOUNTED", Uri.parse("file:///mnt")));
sendBroadcast(new Intent("android.intent.action.MEDIA_MOUNTED", Uri.parse("file:///storage")));
sendBroadcast(new Intent("android.intent.action.MEDIA_MOUNTED", Uri.parse("file:///Removable")));
并尝试通过在基本目录的每个文件上手动触发
scan()
方法来支持KitKat。不幸的是,这既占用大量CPU,又很耗时,因此不建议这样做。“ shell 之路”
在某些情况下,与KitKat一起使用的唯一似乎是通过
adb shell
发送广播。因此,此代码段允许您以编程方式执行此操作:Runtime.getRuntime().exec("am broadcast -a android.intent.action.MEDIA_MOUNTED -d file://" + Environment.getExternalStorageDirectory());
这更像是一种骇人听闻的方式,但是目前这是我能想到的最好的方式。
底线
以上每种解决方案实际上都适用于KitKat以外的所有产品。这是因为,由于有了Justin,已经发现了一个错误并将其发布给official Tracker。这意味着,在修复该错误之前,我们将获得真正的KitKat支持。
使用哪一个?其中,我将使用
MediaScannerWrapper
解决方案以及shell-ish
方法(最后一个)。关于android - 扫描Android SD卡中的新文件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4753252/