Oreo DocumentsContract.getDocumentId(uri)返回路径,而不是Long

时间:2018-07-02 12:50:43

标签: android file path filesystems android-8.1-oreo

我正在尝试获取存储在Android文件系统中的文件的真实路径(我正在使用Android 8.1在模拟器上进行测试)

这是我的代码:

final String id = DocumentsContract.getDocumentId(uri);
final Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));
return getDataColumn(context, contentUri, null, null);

对于早期版本的Android 8.0,变量id包含一个long值,因此下一行可以按预期工作。

Android 8上,变量id包含一个类似raw:/storage/emulated/0/Download/my_file.pdf的路径,因此强制转换Long.valueOf(id))抛出一个'java.lang.NumberFormatException' Exception.

有什么想法吗?谢谢。

2 个答案:

答案 0 :(得分:12)

通过执行以下操作解决了相同的问题。

final String id = DocumentsContract.getDocumentId(uri);
if (!TextUtils.isEmpty(id)) {
            if (id.startsWith("raw:")) {
                return id.replaceFirst("raw:", "");
            }
            try {
                final Uri contentUri = ContentUris.withAppendedId(
                        Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));
                return getDataColumn(context, contentUri, null, null);
            } catch (NumberFormatException e) {
                 return null;
            }
      }

在评论https://github.com/Yalantis/uCrop/issues/318中找到了解决方案

答案 1 :(得分:0)

使用这个

 String id = DocumentsContract.getDocumentId(uri);
 id = id.replaceAll("\\D+","");