当前位置: 首页 > 知识库问答 >
问题:

Android存储访问框架和媒体扫描仪

丁念
2023-03-14

我正在使用存储访问框架将图像下载到外部sd卡。问题是这些图像不会出现在图库中。我试图通过发送DocumentFile uri来通知Android媒体扫描仪使用意图,但这似乎不起作用。下面是我如何尝试通知媒体扫描器添加了新图像:

Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
intent.setData(documentFile.getUri());
sendBroadcast(intent);

有没有其他方法来通知Android添加了新图像?(我已经尝试了这里描述的方法,但我无法使用这些方法获得真实路径)

共有1个答案

沙海
2023-03-14

我现在找到了解决办法。我使用下面的方法从DocumentFile中获取文件路径。当将此路径发送到介质扫描仪时,文件被正确扫描:

private static Object[] volumes;

public static Uri getDocumentFileRealPath(Context context, DocumentFile documentFile) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
    final String docId = DocumentsContract.getDocumentId(documentFile.getUri());
    final String[] split = docId.split(":");
    final String type = split[0];

    if (type.equalsIgnoreCase("primary")) {
        File file = new File (Environment.getExternalStorageDirectory(), split[1]);
        return Uri.fromFile(file);
    } else {
        if (volumes == null) {
            StorageManager sm=(StorageManager)context.getSystemService(Context.STORAGE_SERVICE);
            Method getVolumeListMethod = sm.getClass().getMethod("getVolumeList", new Class[0]);
            volumes = (Object[])getVolumeListMethod.invoke(sm);
        }

        for (Object volume : volumes) {
            Method getUuidMethod = volume.getClass().getMethod("getUuid", new Class[0]);
            String uuid = (String)getUuidMethod.invoke(volume);

            if (uuid != null && uuid.equalsIgnoreCase(type))
            {
                Method getPathMethod = volume.getClass().getMethod("getPath", new Class[0]);
                String path = (String)getPathMethod.invoke(volume);
                File file = new File (path, split[1]);
                return Uri.fromFile(file);
            }
        }
    }

    return null;
}
 类似资料:
  • 在更新的Android Q中,许多事情发生了变化,特别是作用域存储和URI的逐渐弃用。问题是缺乏关于如何在Android Q设备上正确处理媒体文件的文档。 我有一个媒体文件(音频)管理应用程序,但我还找不到一个可靠的方法告诉操作系统,我对一个文件执行了更改,以便它可以更新其纵隔记录。 选项1:MediaScannerService 与主存储中的URI一起工作 不能使用来自辅助存储(如可移动存储)的

  • 我试图通过DownloadManager下载一张图片,并将其显示在Gallery应用程序中,但我所做的一切都不起作用。根据文档,我认为这段代码就足够了: 但是当文件下载时,它不会出现在Gallery应用程序中。所以我尝试了一个下载接收器来手动添加它,如下所示: 那也不行。打印有“filename”标记的URI类似于content://downloads/my_downloads/97'而不是下载的

  • 我是Android上存储访问框架的新手。 谢谢

  • 我在一个应用程序上工作,我想访问“/存储/仿真/0/Android/媒体/com.whatsapp/WhatsApp/Media/.Statuses”来为我的应用程序获取状态文件夹中的数据。

  • 本文向大家介绍Android中扫描多媒体文件操作详解,包括了Android中扫描多媒体文件操作详解的使用技巧和注意事项,需要的朋友参考一下 这篇文章从系统源代码分析,讲述如何将程序创建的多媒体文件加入系统的媒体库,如何从媒体库删除,以及大多数程序开发者经常遇到的无法添加到媒体库的问题等。本人将通过对源代码的分析,一一解释这些问题。 Android中的多媒体文件扫描机制 Android提供了一个很棒

  • Android上现有的Xamarin Forms应用程序。老板们的新功能要求:将一些更新的文档从USB闪存盘复制到已在平板电脑中的extSD上的已知目录中。 好像不需要博士学位。到目前为止,我们所做的一切都是在内部存储中进行的,所以典型的System.io调用可以正常工作。但Android有一个完整的存储访问框架,可以用于外部SD、Google Drive或其他任何地方。 我看到的每一个问题和教程