Android报错 Unknown URL content://com.example.*** 解决方案

今晚在学习《第一行代码》ContentProvider内容的时候,发现了这么一个错误:java.lang.IllegalArgumentException: Unknown URL content://com.example.***.provider/***

,一开始还以为是拼写错误。OK,,检查拼写并未发现有错。翻阅相关书籍也没发现不合理的地方。

后来还是查阅各大平台相关攻略,发现在R版本(Android 11)后,安卓更改了程序间访问数据的方式,在Android11后,需要在AndroidManifest.xml清单文件中加入<queries>标签,具体情况如下👇👇👇

 待添加标签复制👇👇👇

<queries>
        <package android:name="com.example.另一程序的包名" />
    </queries>

再次运行,没有报错,完美解决问题。

### 解决 Java 中 `IllegalArgumentException` 异常问题 当遇到 `java.lang.IllegalArgumentException: Unknown URL content` 的错误时,通常意味着应用程序尝试访问的内容提供者路径不被识别或不存在。对于 Android 应用程序而言,这可能是由于 URI 格式的误用或是权限配置不当所引起的。 #### 错误分析 该异常表明应用试图通过 ContentResolver 访问一个未知的 URI 或者是一个无法解析的内容提供商地址[^1]。例如,在处理文件选择器返回的结果时,如果选择了位于下载目录中的文件,则可能会触发此异常[^2]。 #### 处理方案 为了修复这个问题,可以采取以下几个措施: 1. **验证 URI** 确认传递给 ContentResolver 的 URI 是有效的,并且遵循正确的格式。可以通过打印日志来检查实际收到的 URI 字符串是否符合预期。 2. **添加必要的读写权限声明** 如果涉及到外部存储设备上的数据操作,确保已经在清单文件 (`AndroidManifest.xml`) 中请求了相应的读取和写入权限: ```xml <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> ``` 3. **使用安全的方式获取文件路径** 对于 API Level 29 (Q) 及以上版本的应用,默认启用了分区存储特性(scoped storage),因此建议采用更现代的方法如 MediaStore 来代替直接访问文件系统路径。下面给出了一种兼容新旧系统的解决方案示例代码: ```kotlin fun getPathFromUri(context: Context, uri: Uri): String? { var cursor: Cursor? = null try { val projection = arrayOf(MediaStore.Images.Media.DATA) cursor = context.contentResolver.query(uri, projection, null, null, null) if (cursor != null && cursor.moveToFirst()) { val columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA) return cursor.getString(columnIndex) } } finally { cursor?.close() } return null } ``` 4. **考虑使用 FileProvider 组件** 当需要分享私有文件或其他受限资源时,应该利用官方推荐的 `FileProvider` 类来进行跨进程间的安全共享。这样不仅可以规避潜在的安全风险,还能更好地适配不同版本的操作系统行为差异。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值