国际电话号码的规则

  在涉及到漫游的时候,经常会出现问题。

  比如国内的长途电话,固定电话加拨区号等问题。在国外需要添加0086的前缀之类的。那么到底是怎么个情况呢?

  漫游,离开自己注册登记的服务区域,移动到另一服务区,移动通信仍然可以向其提供服务的功能。要求网络制式兼容且已经联网的国内城市间或已经签署双边漫游协议的地区或国家之间。

  先说手机,一般现在的都是开通了国内长途的(小灵通已经废除)。但是打国外的需要加拨国际识别码,比如一个归属地为中国18699998888的电话想要拨打澳门的电话+85366224209(可能我位数弄错了),那么就直接拨打+853加上后面澳门的号码就可以了。澳门拨打中国的在电话号码前面加上+86就可以了。“+”是什么呢,根据维基百科所得是支持GSM的都可以用"+"号来代替当地国家(你在哪个国家或地区拨打国际电话的代码),比如在中国或者欧洲地区一般是00,而在北美则是1,GSM把00和1作了一个标记直接用"+"来代替,这在支持GSM制式的地区都可以被运营商识别。因为运营商就是干这个电话转接服务的。CDMA我还没有去考虑。

  Google作为服务全球的公司提供了一个LibphoneNumber的jar包,在github上面有其的开源项目,介绍了各种格式化,用起来比较方便的。另外可以和android自己提供的TelephonyManager类提供的sim信息一起来做事情。比如获取SIM注册地址(基站定位)和国家代码,运营商信息等。

  全球电信组织做了一些努力在标准化上,但是因为长期的市场发展,还是有一些其它的格式。目前比较出名的是E164格式,就是我上面的类似+8613555556666等。还有其它的可能中间加"-"等。

  

PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance();
TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
try {
            String networkIso = tm.getNetworkCountryIso();// 返回该sim卡注册的网络运营商的国家代码
        Phonenumber.PhoneNumber numberProto = phoneUtil.parse(incomingNumber, networkIso.toUpperCase(Locale.ENGLISH));
            String e164Number = phoneUtil.format(numberProto, PhoneNumberUtil.PhoneNumberFormat.E164);

  这是一个简单的根据来电号码格式化后得到E164号码的代码。

  

posted @ 2016-02-24 11:47  likeshu  阅读(3612)  评论(0编辑  收藏  举报