e164号码

news/2024/11/29 16:33:22/

概述

E.164 是国际电信联盟定义的在PSTN和一些数据网使用的国际公共电话码号方案,同时定义了具体的码号的格式。E.164定义了最大15数字,完整号码有国际呼叫前缀。
E.164号码是MSISDN号码,它是主叫用户为呼叫移动通信网中用户所需拨号的号码。
其格式为:CC+NDC+SN,也可以表示为:国家代码+N1N2N3+H0H1H2H3+ABCD
(CC=国家码,中国为86;NDC=国内目的码;SN=用户号码)
例如给中国广东深圳0755-12345678拨号,处理后的结果是+8675512345678。其中+号表示要进行国际拨号,在拨号到运营商网络时候会自动(gsm会,cdma不一定)转成一个号码(中国就是00,+86在中国打的话其实就是0086),这个号码代表拨号时注册的运营商网络所在国家;86代表目的所在国家代码,中国的是86;755代表国内地区码(中国很大,按地区分,有些小国根本不需要),0755中的0是国内长途接入码,例如国内座机拨打外地手机号要加0,国际拨号的时候不需要;最后是目的地的号码,座机或者手机号码。

android中的使用

e164号码格式在Android framework中很多地方都有出现,格式化的方法见

frameworks/base/telephony/java/android/telephony/PhoneNumberUtils.java

   /*** Formats the specified {@code phoneNumber} to the E.164 representation.** @param phoneNumber the phone number to format.* @param defaultCountryIso the ISO 3166-1 two letters country code.* @return the E.164 representation, or null if the given phone number is not valid.*/public static String formatNumberToE164(String phoneNumber, String defaultCountryIso) {return formatNumberInternal(phoneNumber, defaultCountryIso, PhoneNumberFormat.E164);}
  private static String formatNumberInternal(String rawPhoneNumber, String defaultCountryIso, PhoneNumberFormat formatIdentifier) {PhoneNumberUtil util = PhoneNumberUtil.getInstance();try {PhoneNumber phoneNumber = util.parse(rawPhoneNumber, defaultCountryIso);if (util.isValidNumber(phoneNumber)) {if (formatIdentifier == PhoneNumberFormat.RFC3966) {String postDial = extractPostDialPortion(rawPhoneNumber);if (postDial != null && postDial.length() > 0) {phoneNumber = new PhoneNumber().mergeFrom(phoneNumber).setExtension(postDial.substring(1));}}return util.format(phoneNumber, formatIdentifier);}} catch (NumberParseException ignored) { }return null;
其中要完成格式化的类参见import:

import com.android.i18n.phonenumbers.NumberParseException;
import com.android.i18n.phonenumbers.PhoneNumberUtil;
import com.android.i18n.phonenumbers.PhoneNumberUtil.PhoneNumberFormat;
import com.android.i18n.phonenumbers.Phonemetadata.PhoneMetadata;
import com.android.i18n.phonenumbers.Phonenumber.PhoneNumber;
import com.android.i18n.phonenumbers.ShortNumberUtil;
这些都在libphonenumber静态包中,代码目录在external/libphonenumber下

external/libphonenumber/libphonenumber/src/com/google/i18n/phonenumbers/PhoneNumberUtil.java

 public String format(PhoneNumber number, PhoneNumberFormat numberFormat) {if (number.getNationalNumber() == 0 && number.hasRawInput()) {// Unparseable numbers that kept their raw input just use that.// This is the only case where a number can be formatted as E164 without a// leading '+' symbol (but the original number wasn't parseable anyway).// TODO: Consider removing the 'if' above so that unparseable// strings without raw input format to the empty string instead of "+00"String rawInput = number.getRawInput();if (rawInput.length() > 0) {return rawInput;}}StringBuilder formattedNumber = new StringBuilder(20);format(number, numberFormat, formattedNumber);return formattedNumber.toString();}
 public void format(PhoneNumber number, PhoneNumberFormat numberFormat,StringBuilder formattedNumber) {// Clear the StringBuilder first.formattedNumber.setLength(0);int countryCallingCode = number.getCountryCode();String nationalSignificantNumber = getNationalSignificantNumber(number); //获取国内拨号号码,要处理国内地区码if (numberFormat == PhoneNumberFormat.E164) {// Early exit for E164 case (even if the country calling code is invalid) since no formatting// of the national number needs to be applied. Extensions are not formatted.formattedNumber.append(nationalSignificantNumber);prefixNumberWithCountryCallingCode(countryCallingCode, PhoneNumberFormat.E164,formattedNumber);return;}...}
  private void prefixNumberWithCountryCallingCode(int countryCallingCode,PhoneNumberFormat numberFormat,StringBuilder formattedNumber) {switch (numberFormat) {case E164:formattedNumber.insert(0, countryCallingCode).insert(0, PLUS_SIGN);  //插入加号和国家码return;...}}
格式化e164的调用链条如上,最后生成了一个可以用于国际拨号的号码。

cdma加号替换

由于cdma网络不一定转换加号,所以电信定制机都会加入自动转换加号的功能。mtk贴心的加入了这个功能:

/frameworks/opt/telephony/src/java/com/android/internal/telephony/cdma/CdmaCallTracker.java

    /// @}/// M: CC101: CDMA plus code @{private ICdmaCallTrackerExt mCdmaCallTrackerExt= MPlugin.createInstance(ICdmaCallTrackerExt.class.getName());/// @}
中间加入了mCdmaCallTrackerExt专门处理加号转换,ICdmaCallTrackerExt在
vendor/mediatek/proprietary/frameworks/common/src/com/mediatek/common/telephony/cdma/ICdmaCallTrackerExt.java

ICdmaCallTrackerExt是接口类,具体实现类在:
vendor/mediatek/proprietary/frameworks/base/packages/FwkPlugin/src/com/mediatek/op/telephony/cdma/CdmaCallTrackerExt.java

    public String processPlusCodeForDriverCall(String number, boolean isMt, int typeOfAddress) {if (isMt && typeOfAddress == PhoneNumberUtils.TOA_International) {Rlog.d(TAG, "processPlusCodeForDriverCall, before format number:" + number);if (number != null && number.length() > 0 && number.charAt(0) == '+') {number = number.substring(1, number.length());}number = mPlusCodeUtils.removeIddNddAddPlusCode(number);Rlog.d(TAG, "processPlusCodeForDriverCall, after format number:" + number);}number = PhoneNumberUtils.stringFromStringAndTOA(number, typeOfAddress);return number;}
其中可以看出这个类还是委托给PlusCodeProcessor去处理, 代码文件又回到了framework中,mtk加号处理实现的代码都在

frameworks/base/telephony/java/com/mediatek/internal/telephony/cdma/pluscode文件夹下,加号处理的具体逻辑还是很复杂的,不过对外使用很清晰。


http://www.ppmy.cn/news/185526.html

相关文章

用电梯服务器怎么解显示e34,默纳克1000显示E34故障代码,怎么排除。

满意答案 dvfxlo 2014.05.18 采纳率:42% 等级:9 已帮助:965人 E01 逆变单元保护 E31 DPRAM异常 E02 加速过电流 E32 CPU异常 E03 减速过电流 E33 电梯速度异常 E04 恒速过电流 E34 控制器逻辑故障 E05 加速过电压 E35 井道自学习数据异常 …

19.【e!】

题目背景 e的近似值计算公式为: e 1 1 1 ! 1 2 ! … … 1 ( n − 1 ) ! e 1 1 ! 1 ​ 2 ! 1 ​ … … ( n − 1 ) ! e1\frac{1}{1!}\frac{1}{2!}……\frac{1}{(n-1)!}e1 1! 1 ​ 2! 1 ​ …… (n−1)! e11!1​2!1​……(n−1)!1​e11!1​2!1​……(n−1…

Linux系统安装(超级详细教程)

Linux系统安装 步骤有点多,请耐心走下去。 1、首先,使用光驱或U盘或你下载的Linux ISO文件进行安装。 界面说明: Install or upgrade an existing system 安装或升级现有的系统 install system with basic video driver 安装过程中采用基…

默纳克服务器上电后显示NICE,默纳克NICE1000故障代码

满意答案 ssm19941105 2013.06.30 采纳率:54% 等级:12 已帮助:26349人 E01逆变单元保护E31DPRAM异常 E02加速过电流E32CPU异常 E03减速过电流E33电梯速度异常 E04恒速过电流E34控制器逻辑故障 E05加速过电压E35井道自学习数据异常 E06减速…

远程面试阿里、蚂蚁、京东、美团后整理份283页Java核心面试宝典

本文整理了一些面试时面试官必问的知识点,其中包括了有基础知识、Java集合、JVM、多线程并发、spring原理、微服务、Netty 与RPC 、Kafka、日记、设计模式、Java算法、数据库、Zookeeper、分布式缓存、数据结构等等。 以下是文档涉及的主要内容: &#…

瑞萨RL78簇bootloader深入探讨(一):User工程建立

瑞萨RL78簇bootloader深入探讨(一) 前言 bootloader是单片机开发重要的一环,近期笔者需要完成一个瑞萨相关的bootloader项目,然而ARM有关bootloader的开发资料网上能找到很多,但是瑞萨相关的资料相对而言就少很多了。经过一周多从各处收集资…

根据STM32CubeMX软件创建STM32芯片的Altium Designer原理图库教程

1所需软件及环境 1.STM32CubeMX软件。 2.Altisum Designer软件。 3.Win10操作系统,Excel为Mondo 2016版本(类似于2016版或365版)。 本例教程中的STM32CubeMX版本号为6.2.0,Altisum Designer版本号为21.5.1。不同版本的软件操作不…

联想340c笔记本cpu能升级吗_联想E49笔记本CPU升级笔记复习过程

学习资料 仅供学习与参考 联想 E49 笔记本 CPU 升级笔记 wzy19800109 一、基本情况 联 想 昭 阳 E49G 2013 年 9 月 份 机 器 模 型 20162 BIOS H2ET31WW(10.9) 配置: b830cpu 2G 内存 500G 硬盘 HM77 主板 集成显卡,有蓝牙, 有指纹识别。 经…