更新
我有一台运行 8.0.0 T-Mobile 的三星 Galaxy S8+,它在运行 8.0.0 时运行良好
我的三星 Galaxy S9+ 运行 8.0.0 Verizon,每次都因非法参数而失败。
我的三星 Galaxy S9+ 运行 8.0.0 T-Mobile 没有问题并且工作正常
因此,这可能是 OEM 特定型号问题,但尚不确定如何解决。我也试过重启手机,结果没有变化。
此外,我从 Evernote 中打开了公共下载文件并将文件作为附件保存到 Note,这告诉我 Evernote 能够很好地访问公共目录并附加文件,因此可以在设备上进行。让我相信它与代码相关。
因此,我最近升级了一个运行良好的项目,现在它有一个错误,因为它正在使用构建工具 28 进行编译,适用于最新版本的 Android。
所以我一直使用这个 PathUtil 从隐式意图中获取我需要的文件路径,以从用户那里获取文件选择。我将在下面分享一个我使用了很长时间的代码的链接。
它只是一个实用程序类,用于检查提供者权限并获取您尝试读取的文件的绝对路径。
当用户从公共下载目录中选择一个文件时,它会返回到onActivityResult:
content://com.android.providers.downloads.documents/document/2025
现在 nice 实用程序将其解析出来并告诉我这是一个下载目录文件,并且是一个 id 为 2025 的文档。感谢实用程序,这是一个很好的开始。
接下来是使用内容解析器来查找文件的绝对路径。这曾经是有效的,但不再有效:(。
现在,路径实用程序只使用他们最有可能从核心库自己获得的合约数据。我尝试导入提供程序类以避免静态字符串,但它似乎不可用,所以我想简单地使用匹配字符串是目前最好的方法。
这是核心 DownloadProvider 供参考,它为内容解析器提供所有访问权限。 下载提供者
注意* 这个 DownloadProvider 是 Android,不是我的
这是为 contentProvider 构建 Uri 的代码
val id = DocumentsContract.getDocumentId(uri)
val contentUri = ContentUris.withAppendedId(Uri.parse(PUBLIC_DOWNLOAD_PATH), id.toLong())
return getDataColumn(context, contentUri, null, null)
调用参考:
private fun getDataColumn(context: Context, uri: Uri, selection: String?, selectionArgs: Array<String>?): String? {
var cursor: Cursor? = null
val column = "_data"
val projection = arrayOf(column)
try {
cursor = context.contentResolver.query(uri, projection, selection, selectionArgs, null)
if (cursor != null && cursor.moveToFirst()) {
val column_index = cursor.getColumnIndexOrThrow(column)
return cursor.getString(column_index)
}
}catch (ex: Exception){
A35Log.e("PathUtils", "Error getting uri for cursor to read file: ${ex.message}")
} finally {
if (cursor != null)
cursor.close()
}
return null
}
本质上,要解决的 contentUri 最终是
内容://下载/public_downloads/2025
然后,当您调用查询方法时,它会抛出:
java.lang.IllegalArgumentException:未知 URI:content://downloads/public_downloads/2025
我已经确认或尝试过的事情
- 读取外部权限(附带写入,但还是这样做了)
- 写入外部权限
- 权限在清单中并在运行时检索
- 我选择了多个不同的文件,看看其中一个是否奇怪
- 我已确认在应用程序设置中授予权限
- 我最后将 Uri 硬编码为 /1 甚至 /#2052 以尝试各种结束类型
- 我研究了核心库上的 uriMatching 以了解它期望它如何格式化并确保它匹配
- 我已经在 uri 中使用了 all_downloads 目录并解决了!!,但是有安全异常,所以解析器必须存在。
我不知道还能尝试什么,任何帮助将不胜感激。