URI含#号字符串解析问题:拨号界面丢失#号的解决求助
解决拨号URI中#号丢失的问题
嘿,我太懂这个坑了!你遇到的问题根源在于#是URI里的特殊字符(它用来标识片段标识符),直接把带#的字符串拼进tel: URI里时,系统的URI解析器会自动截断#及其后面的内容,导致拨号界面显示不全。
快速修复方案
你只需要对拨号字符串做URL编码处理,让#转换成它的编码值%23,系统拨号应用拿到编码后的URI会自动还原成#。最稳妥的方式是用Android自带的Uri.encode()方法来处理整个字符串,它能自动处理所有URI特殊字符,不止是#。
修改后的完整代码
@Override public void onBindViewHolder(@NonNull RecyclerAdapterDataView holder, int i) { final String code = list.get(i).getActivation(); holder.activation.setText("Activation Code: "+code); holder.activate.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 不管有没有#,直接编码都没问题,不用额外判断也可以 String encodedDialCode = Uri.encode(code); Intent dialIntent = new Intent(Intent.ACTION_DIAL); dialIntent.setData(Uri.parse("tel:" + encodedDialCode)); context.startActivity(dialIntent); } }); }
补充说明
- 我把原来的
if (code.contains("#"))判断去掉了,因为Uri.encode()对没有特殊字符的字符串也能正常处理,这样代码更简洁通用 - 如果以后你的激活码里出现其他特殊字符(比如
&、?之类的),这个方法也能完美兼容,不用再逐个处理 - 手动替换
#为%23也能解决当前问题,但通用性差一些,不如Uri.encode()靠谱
内容的提问来源于stack exchange,提问作者Habib Mhamadi
相关产品推荐
相关产品推荐

