gpt4 book ai didi

android - 扫描 Android SD 卡中的新文件

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:56:53 24 4
gpt4 key购买 nike

我的应用允许用户将图像保存到他们的 SD 卡中。但是在卸载并重新安装 SD 卡之前,我不确定如何让它出现在画廊中。我已经用谷歌搜索了几天这个问题,但我不确定如何让它自动出现。我发现 this链接,但我不确定如何使用该类(class)。这是我用来保存文件的。在 try catch block 的底部是我要扫描 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+) 上仍然不行。


文件行者

许多 Play Store 应用程序试图克服 MediaStore 不 promise 更新其数据库的问题,其中之一是 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,又非常耗时,因此不是很推荐。


“外壳方式”

在某些情况下,似乎唯一可以与 KitKat 一起工作的是通过 adb shell 发送广播。因此,此代码段允许您以编程方式执行此操作:

Runtime.getRuntime().exec("am broadcast -a android.intent.action.MEDIA_MOUNTED -d file://" + Environment.getExternalStorageDirectory());

这更像是一种 hack-ish 的方式,但目前是我能想到的最好的方式。


底线

上述每个解决方案实际上都适用于 KitKat 以外的所有内容。那是因为,感谢 Justin , 已发现错误并将其发布到 official Tracker .这意味着,在错误被解决之前,我们将得不到真正的 KitKat 支持。

使用哪一个?其中,我会使用 MediaScannerWrapper 解决方案,以及 shell-ish 方法(最后一个)。

关于android - 扫描 Android SD 卡中的新文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4753252/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com