其他分享
首页 > 其他分享> > 扫描Android SD卡以获取新文件

扫描Android SD卡以获取新文件

作者:互联网

我的应用程序允许用户将图像保存到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

最简单,最天真的解决方案.它包括从您的代码执行以下指令:

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缺乏更新数据库承诺的众多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和耗时的,因此不太推荐.

“贝壳方式”

在某些情况下,唯一可以与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,sd-card,media,android-mediascanner
来源: https://codeday.me/bug/20190917/1810079.html