2

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

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

是否有另一种方法可以通知 Android 添加了新图像?(我已经尝试过这里描述的方法,但我无法使用这些方法获得真正的路径)

4

1 回答 1

1

我现在找到了解决方案。我正在使用以下方法从 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;
}
于 2015-07-10T08:57:52.967 回答