Android Java:从URI字符串中提取特定字符后的子串
优雅提取Content URI中Scheme之后的内容
嘿,你的需求其实用Android官方提供的Uri工具类就能完美解决,完全避开你不想用的正则和硬编码定位字符的方式,而且既高效又可靠!
核心思路:利用URI的标准结构解析
Android的Uri类已经帮我们把URI拆分成了标准的组成部分(scheme、authority、path等),我们只需要把authority和path拼接起来,就能得到你想要的com.android.providers.media.documents/document/image%3A38这部分内容。
代码示例
Kotlin版本
val originalUriStr = "content://com.android.providers.media.documents/document/image%3A38" val uri = Uri.parse(originalUriStr) // 拼接authority和path,得到目标内容 val targetContent = "${uri.authority}${uri.path}" // 输出结果:com.android.providers.media.documents/document/image%3A38
Java版本
String originalUriStr = "content://com.android.providers.media.documents/document/image%3A38"; Uri uri = Uri.parse(originalUriStr); String targetContent = uri.getAuthority() + uri.getPath(); // 结果:com.android.providers.media.documents/document/image%3A38
为什么这个方案更优?
- 无性能开销:完全依赖系统原生的URI解析逻辑,比正则表达式高效得多,也没有字符串遍历的额外消耗
- 不硬编码:不是通过定位第二个
/来截取,而是基于URI的标准结构拆分,哪怕后续URI的authority长度变化、path层级增加,都能正确提取 - 兼容性强:如果你的URI后续带有query参数(比如
content://xxx/yyy?param=1),这种方式只会提取到path部分;如果需要保留query,也可以灵活调整
备选简化方案
如果你的URI结构非常固定,也可以用字符串的substringAfter方法,但要基于解析后的scheme来,避免硬编码"content://":
val uri = Uri.parse(originalUriStr) val targetContent = originalUriStr.substringAfter("${uri.scheme}://")
这个方法更简洁,但相比拼接authority+path,它会保留URI中scheme之后的所有内容(包括query、fragment等),你可以根据实际需求选择。
内容的提问来源于stack exchange,提问作者felixwcf
相关产品推荐
相关产品推荐

