前言

某天,QA给我提了一个Bug,说是包裹物流追踪的电话不能自动识别了。正常情况如下图所示:

物流追踪

在8.1的机器上,TextView突然不能自动识别电话号码了。

1.电话号码识别

Android SDK中,TextView提供了一个autoLink属性来帮助我们识别各种各样的链接,我们只需要将autoLink属性设置为"phone",就能轻易识别出电话号码。

这个属性在8.1之前的机器上是可以正常工作的,然而在8.1的机器上突然不可以了。那么原因是为何呢?

2.原因探究

通过查看TextView的源码,我们可以知道,系统是借助了一个名叫Linkify的类来识别电话号码的,具体可以查看文章——autoLink实现原理

第一个回答中解释了为何autoLink会无效,我们可以了解到,autoLink跟手机的语言有关(英文或中文)。

首先看下Linkify的关键代码在8.1之前的实现:

private static final void gatherTelLinks(ArrayList links, Spannable s) {

PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance();

Iterable matches = phoneUtil.findNumbers(s.toString(),

Locale.getDefault().getCountry(), Leniency.POSSIBLE, Long.MAX_VALUE);

for (PhoneNumberMatch match : matches) {

LinkSpec spec = new LinkSpec();

spec.url = "tel:" + PhoneNumberUtils.normalizeNumber(match.rawString());

spec.start = match.start();

spec.end = match.end();

links.add(spec);

}

}

从上面代码我们可以看到,phoneUtil.findNumbers函数中传入了Locale.getDefault().getCountry(),即国家码,所以如果当前手机的地区变动,那么可能某些电话号码就不会被正确识别了。

然后再看下8.1上Linkify代码的实现:

private static void gatherTelLinks(ArrayList links, Spannable s,

@Nullable Context context) {

PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance();

final TelephonyManager tm = (context == null)

? TelephonyManager.getDefault()

: TelephonyManager.from(context);

Iterable matches = phoneUtil.findNumbers(s.toString(),

tm.getSimCountryIso().toUpperCase(Locale.US),

Leniency.POSSIBLE, Long.MAX_VALUE);

for (PhoneNumberMatch match : matches) {

LinkSpec spec = new LinkSpec();

spec.url = "tel:" + PhoneNumberUtils.normalizeNumber(match.rawString());

spec.start = match.start();

spec.end = match.end();

links.add(spec);

}

}

以上代码可以看到,原本传入地区码的地方,变成了getSimCountryIso()。那么看下这个函数的注解:

/**

* Returns the ISO country code equivalent of the current registered

* operator's MCC (Mobile Country Code).

*

* Availability: Only when user is registered to a network. Result may be

* unreliable on CDMA networks (use {@link #getPhoneType()} to determine if

* on a CDMA network).

*/

public String getNetworkCountryIso() {

return getNetworkCountryIsoForPhone(getDefaultPhone());

}

翻译过来就是获取当前运营商注册的国家码。而QA的测试机是没有插入sim卡的,那么这个函数返回的CountryCode绝对不是CN(具体返回啥由底层ROM决定)

在测试机插入sim卡之后,TextView的autolink又正确工作了,所以可以确定问题是出在这里。

3.总结

8.1之前的手机,TextView的电话号码匹配和当前手机的地区有关,切换语言时有可能导致号码匹配失效。

大于等于8.1的手机上,号码匹配和当前手机插入的sim卡有关,当使用国外的SIM卡或者不插入SIM卡时,有可能会导致号码匹配失效。

android autolink识别错误,TextView autoLink=phone 在8.1机器上无效相关推荐

  1. android autolink识别错误,android - autolink窃取ontouch事件,从而反馈触摸列表视图行无效 - 堆栈内存溢出...

    我有一个listview . 并且行布局中包含很少的布局. 在行布局中,我有一个TextView ,我想在其上启用自动链接当我启用自动链接时,链接工作正常但我们点击列表行时得到的反馈不再有效. 在行布 ...

  2. 关闭Win8快速启动,解决网卡识别错误/网卡驱动安装不正确的问题

    阴魂不散的问题 笔者安装的Windows 8是64位专业版,主板內建Intel 82597V千兆网络芯片.Windows 8系统的识别错误经常出现,尤其是当笔者上不了网时,一查看网络适配器,发现它被识 ...

  3. Android利用SpannableStringBuilder设置TextView中部分文字的颜色...

    原文:android - SpannableString或SpannableStringBuilder以及string.xml文件中的整型和string型代替 背景介绍 在开发应用过程中经常会遇到显示 ...

  4. Android 第五章 TextView

    android:id="@+id/xx"控件标识.标签.ID android:layout_margin="10dp" 子控件与父控件之间距离10dp andr ...

  5. 【Android 应用开发】Android UI 设计之 TextView EditText 组件属性方法最详细解析

    . 作者 :万境绝尘  转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/18964835 . TextView 相关类的继承结构 ...

  6. Android软件开发之TextView详解(六)

    Android软件开发之TextView详解 雨松MOMO原创文章如转载,请注明:转载自雨松MOMO的博客原文地址:http://blog.csdn.net/xys289187120/article/ ...

  7. Android 指纹识别(给应用添加指纹解锁)

    使用指纹 说明 : 指纹解锁在23 的时候,官方就已经给出了api ,但是由于Android市场复杂,无法形成统一,硬件由不同的厂商开发,导致相同版本的软件系统,搭载的硬件千变万化,导致由的机型不支持 ...

  8. android指纹识别源码

    随着科技的进步,不仅是软件方面,安卓系统在硬件发展上也有了日新月异的发展.2015年下半年出的安卓手机基本上都带指纹识别功能,不管是炒得很热的360奇酷手机.魅族手机,还是"中华酷联&quo ...

  9. Android文字识别tess-two OCR

    OCR Tesseract tess-two文字识别Android Studio实现 1.简介 OCR (Optical Character Recognition,光学字符识别)是指电子设备(例如扫 ...

最新文章

  1. Config Sharepoint 2013 Workflow PowerShell Cmdlet
  2. 在2008 server上部署域
  3. windows下安装PyTorch0.4.0
  4. 鸿蒙是学生开发的系统,9岁小学生展示鸿蒙OS开发
  5. MySQL小误区:关于set global sql_slave_skip_counter=N 命令的一些点
  6. ansible /usr/bin/python: not found
  7. 【Elasticsearch】es CPU热点线程 HotThreads 源码解析
  8. java validate注解_JAVA 注解验证字段(例子)
  9. 你分得清楚Maven的聚合和继承吗?
  10. SVM入门(一)至(三)
  11. 新旧_飘云羽逸_新浪博客
  12. 视觉SLAM十四讲学习1 环境配置
  13. 2010版gmp 计算机系统,2010版GMP附录:计算机化系统 整体及条款解读
  14. 计算四则表达式(中缀式转后缀式,然后计算结果)
  15. 1、NetBIOS简介
  16. 【IOI2020国家集训队作业 Part 1】CF505E Mr. Kitayuta vs. Bamboos
  17. Visual Studio 2017 智能提示英文怎么切换成中文?
  18. linux下qt软件使用方法,QT入门 QT Creator 使用
  19. 词霸天下---词根227【-gress- = -grad- = -gred- = -gre(e)- 步,走】
  20. 阿里云服务器选择不同的地域有何区别,应该如何选择?

热门文章

  1. 华东理工大学计算机专业英语,化学工程与工艺专业英语翻译(华东理工大学_最完整版本).pdf...
  2. DTK——显示helloWorld
  3. python从键盘上输入五个数字打一成语_批量查询5个字成语首字母组成的.com域名...
  4. 刚好遇见你计算机简谱,刚好遇见你李玉刚简谱
  5. python实战-批量查询网站权重
  6. pytorch实践08(刘二大人)
  7. modbus 03 10消息实现
  8. 最近公共祖先(三种方法)
  9. genetic and generic - a genetic element; generic drugs
  10. Echarts Chinajs绘制中国地图 全国geojson