UPDATE
我有一台运行 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 中打开了公共下载并保存了
文件作为笔记的附件,这告诉我 Evernote 能够
访问公共目录就好了并附加文件,所以它是
可以在设备上执行。让我相信这是代码
有关的。
所以我最近升级了一个项目,该项目运行得很好,但现在有一个错误,因为它正在使用最新版本的 Android 的构建工具 28 进行编译。
所以我一直使用这个 PathUtil 来从隐式意图中获取我需要的文件路径,以从用户那里获取文件选择。我将在下面分享我长期以来使用的代码的链接。
PathUtil https://gist.github.com/tatocaster/32aad15f6e0c50311626
它只是一个实用程序类,用于检查提供程序权限并获取您尝试读取的文件的绝对路径。
当用户从公共下载目录中选择文件时,它返回到活动结果 with:
content://com.android.providers.downloads.documents/document/2025
现在,nice 实用程序解析了该文件,并告诉我这是一个下载目录文件,并且是一个 id 为 2025 的文档。感谢实用程序,这是一个很好的开始。
接下来是使用内容解析器来查找文件绝对路径。
这曾经是有效的,但现在不再有效:(。
现在,路径实用程序仅使用他们最有可能从核心库本身获取的合约数据。我尝试导入提供程序类以避免静态字符串,但它似乎不可用,所以我想简单地使用匹配字符串是目前最好的方法。
这是供参考的核心 DownloadProvider,它为内容解析器提供所有访问权限。下载提供者 https://android.googlesource.com/platform/packages/providers/DownloadProvider/+/master/src/com/android/providers/downloads/DownloadProvider.java
注意* 这个 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 最终是
内容://downloads/public_downloads/2025
然后,当您调用查询方法时,它会抛出:
java.lang.IllegalArgumentException:未知 URI:content://downloads/public_downloads/2025
我已经确认或尝试过的事情
- 读取外部权限(带有写入权限,但还是这么做了)
- 写入外部权限
- 权限位于清单中并在运行时检索
- 我选择了多个不同的文件,看看其中一个是否奇怪
- 我已确认在应用程序设置中授予了权限
- 我已将 Uri 硬编码为 /1 甚至 /#2052 最后尝试各种结束类型
- 我研究了核心库上的 uriMatching,以了解它期望如何格式化并确保它匹配
- 我已经尝试过 uri 中的 all_downloads 目录,并且可以解析!!,但由于安全异常,因此解析器必须存在。
我不知道还能尝试什么,任何帮助将不胜感激。