前言

短信中心号码概念

短信中心号码类似信息服务器,如果信息中心号码不正确,短消息是无法发送成功的,各个地区都有自己的信息中心号码,其中移动以+86138开头,关于该号码的获取这举例说明。

获取方法

1、调用Phone中的getSmscAddress(Message message)方法,其中参数的message为获取到结果后发送消息给mHandler,并查询结果AsyncResult的result属性中。
            phone=PhoneFactory.getDefaultPhone();
phone.getSmscAddress(mHandler.obtainMessage(EVENT_QUERY_SMSC_DONE));

:2、mHandler实现代码

private Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
AsyncResult ar;
switch (msg.what) {
case EVENT_QUERY_SMSC_DONE:
ar= (AsyncResult) msg.obj;
if (ar.exception != null) {
} else {
// TODO: handle exception
mSmsServiceCenterPref.setSummary((String)ar.result);
}
}
default:
break;
}
}
};

原理分析

分析到这大家可能觉得短信中心号码的获取非常简单,但如果要实现该功能仅加上这几行代码,大家可以动手试试,会发现该功能不仅没有实现,甚至还抛出了一个“PhoneFactory.getDefaultPhone must be called from Looper thread”这样的异常。
:1、原因造成该异常的根本原因在通过PhoneFactory类的getDefaultPhone()方法返回一个Phone对象,我们可以进入这个类去看这个函数的实现

   public static Phone getDefaultPhone() {
      if (sLooper != Looper.myLooper()) {
throw new RuntimeException(
"PhoneFactory.getDefaultPhone must be called from Looper thread");
}
       if (!sMadeDefaults) {
throw new IllegalStateException("Default phones haven't been made yet!");
}
return sProxyPhone[getDefaultSubscription()];
}

该异常由于Looper对象不一样,Looper.myLooper()该对象是指调用getDefaultPhone方法的所在的进程的looper对象,sLooper对象又指的是谁的looper对象,在那赋值?在调用getDefaultPhone时会返回sProxyPhone[getDefaultSubscription()],该数组又是在那赋值的了?

首先,手机启动时会启动phone进程,phone会调用到PhoneApp.java的onCreate方法,在该方法中会调用PhoneFactory.makeDefaultPhones方法。然后,在makeDefaultPhones函数中,会做两件事情,一是初始化sLooper,二是给phone sProxyPhone[]数组赋值。以下是该方法的核心实现:

 if (!sMadeDefaults) {
sLooper = Looper.myLooper();
sContext = context;
if (sLooper == null) {
throw new RuntimeException(
"PhoneFactory.makeDefaultPhone must be called from Looper thread");
}
sProxyPhone = new PhoneProxy[numPhones];
for (int i = 0; i < numPhones; i++) {
int phoneType = getPhoneType(networkMode[i]);
Log.i(LOG_TAG, "get Phone Type:"+ phoneType);
if (phoneType == Phone.PHONE_TYPE_GSM) {
sProxyPhone[i] = new PhoneProxy(new GSMPhone(context,
sCommandsInterface[i], sPhoneNotifier, false, dct, i));
Log.i(LOG_TAG, "Creating GSMPhone");
} else if (phoneType == Phone.PHONE_TYPE_CDMA) {
sProxyPhone[i] = new PhoneProxy(new CDMAPhone(context,
sCommandsInterface[i], sPhoneNotifier, false, dct, i));
Log.i(LOG_TAG, "Creating CDMAPhone");
}
}

最后,通过前面可以看出sLooper对象是属于phone进程,而Looper.myLooper()是属于调用getDefaultPhone函数的进程,如果调用getDefaultPhone函数的进程和phone进程没有在一个进程空间中执行,则他们的looper对象肯定是不相同的,那么肯定就会抛出“PhoneFactory.getDefaultPhone must be called from Looper thread”这个异常。

:2、解决方法首先在需要在调用getDefaultPhone函数获取phone对象的进程manifest中声明一下代码

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.mms"
android:sharedUserId="android.uid.phone">

并将具体的Activity声明以下属性:

android:process="com.android.phone"
小结

短信中心号码的读取,这里只讲述了应用层最最基本的实现以及一些注意事项,其最最核心的实现还是落实到了中间层和Ril层.参考类Ril.java、PhoneBase.java。

自动读取短信中心号码相关推荐

  1. 短信发送失败之短信中心号码异常

    发送短信时,短信中心号码默认是从卡里面的 EFsmsp 读到的,有的卡不符合规范,SIM 卡里短信中心号码为空,导致短信发送失败. 排查这种情况,Android手机,可以通过*#*#4636#*#*进 ...

  2. iphone android短信中心号码,iPhone设置短信中心号码失败

    苹果手机设置短信中心号码失败原因有很多,首先需要确保手机的各种设置是正常状态. 设置短信中心号码失败原因: 1.确保信号正常,关闭飞行模式: 2.检查SIM卡状态是否正常: 3.检查发送键是否显示为亮 ...

  3. 全国手机短信中心号码

    全国手机短信中心号码 手机不能正常收发短信的根本原因在于短信中心号码设置有误,水货手机或者港行的机子短信中心号码一般都不是大陆的短信中心号码,行货手机刷机或者复位后也会变成出厂时的短信设置,一般是上海 ...

  4. 解决:更改短信中心号码不能及时更新显示

    [测试步骤]: 1.进入短信界面 2.菜单-设置 3.修改短信中心号码(Set the SIM's smsc number) 保存 [测试结果]:提示保存成功,但是号码没有改变,退出重新进入设置才会看 ...

  5. 多普达586短信中心号码设置

    不小心弄丢了,终于设上了,记下来备忘. 原厂的OS: 开始---设置----电话---服务--选择语音邮件和短信,然后点获取设置 WM5的: 开始-系统工具-系统设置-设置-电话-拨号选项 移动的短信 ...

  6. 安卓2.3以上版本设置与修改短信中心号码方法

    [原文:http://blog.sina.com.cn/s/blog_654cf05c01014wg4.html] 或参考http://mobile.zol.com.cn/220/2203558.ht ...

  7. oxygenOS手机更改短信中心号码

    我的手机是一加9Pro,oxygenOS 13.0,回国后新办的卡短信一直发不出去.咨询移动客服之后得知是短信中心号码不正确.在获得了正确的短信中心号码后尝试更改,发现SMSC是灰色无法更改状态. 尝 ...

  8. iphone android短信中心号码,iPhone发不了短信(设置短信中心号码)的解决办法

    为什么我的苹果5s设置完短信中心号码成功后是无地址,能打电话收短信.彩信还能给10086发短信但是就是不能给朋友发!为什么啊? iPhone发不了短信 具体问题分析: 1.确保信号正常,关闭飞行模式. ...

  9. 解决iphone的短信中心号码设置错误的方案

    1.有一台安卓手机 将电话卡插在安卓手机上,点击短信,设置,高级设置,然后设置sim卡的中心号码. 2.不同号码要按照归属地进行设定. 具体查询方案如下: http://www.360doc.com/ ...

最新文章

  1. 字符串比较--小问题大智慧
  2. 文本编辑器左边显示行数
  3. asp用于取代什么技术_ASP是不是已经被淘汰了?
  4. CG CTF MISC Remove Boyfriend
  5. Hadoop运维记录系列(十四)
  6. python实验九答案_Python实验九
  7. 【sklearn第五讲】特征提取(上)
  8. 【阅读】《乔布斯的魔力演讲》
  9. Fantastic Four: 具有恶意安全的诚实大多数四方安全计算
  10. java游戏主角用毛笔_Java FX版的毛笔效果
  11. Java 后端不懂 GC 调优很丢脸吗?
  12. PHP网页的工作原理
  13. 这么多年你还在怕正则吗?
  14. 站长SEO超级外链工具_V1.1
  15. java namevaluepair包_Java NameValuePair.setName方法代码示例
  16. java火山_火山代码转java源代码查看
  17. 宏基服务器型号,宏基云服务器排名
  18. 软件测试面试:拿到一个版本(产品),如何开展测试?
  19. Python机器学习笔记 使用scikit-learn工具进行PCA降维...
  20. 好用到爆的上班摸鱼神器,小说阅读器

热门文章

  1. element ui 前台模板_一个干净优雅的 Element UI Admin 模板
  2. 分享免端口访问群晖的方法,可以顶级域名
  3. 普及!cmnet、cmiot还傻傻分不清楚?APN设置看看这一篇就够了!!
  4. cocos creator 优化之相机渲染 drawcall优化
  5. 计算机职业生涯规划书一万字,大学生职业规划一万字
  6. 电脑各修改项【自用】
  7. 旅游商城会员中心HTML,旅游特产商城功能_旅游特产商城系统-思途旅游CMS
  8. 炫 音乐可视化 html5 在线,HTML5打造的炫酷本地音乐播放器-喵喵Player
  9. 计算机视觉 马尔_金山软件招聘计算机视觉实习生base珠海
  10. Linux 常见面试题