You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 03:42:40