宇朔项目中,因为客户的需求,我把很多无关的APP都给去掉了,只保留了客户需要的电话、短信、蓝牙、通讯录、设置等几个基本APP。后来,客户反映,我们的系统,不能正常地发送接收短信,之前我没有测试过这个,还好他们测试之后提出来,不然这个不能接收短信的问题就被掩埋了!

短信不能收发的情况是这样的:发送短信时,编辑好短信,点击发送,短信APP立即弹出“很抱歉‘信息’已停止运行”提示信息;接收短信, 用可以正常发送短信的手机,给“怡康智能终端”机器(以下简称“怡康”)发送短信,“怡康”也不能接收到短信,没有拒绝接收的提示。

比对了之前的系统——没有任何修改的ITAB-01工业平板的系统,ITAB-01的系统是能够正常收发短信的,那么,就是定制系统的过程中的改动影响到了短信APP及其APP相关的服务!

首先,从日志LOG入手,通过查看相关的日志,提取有用的信息。
果然,发现,Log提示短信APP缺乏一些的权限,调用了空指针,导致短信APP停止运行。后来屏蔽掉这个权限,避免空指针的出现,果真能够正常发送短信了;
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
LOG:
01-01 02:31:25.059 9487-9487/? E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.android.mms, PID: 9487
java.lang.NullPointerException: Attempt to invoke interface method 'boolean com.mediatek.common.telephony.ILteDataOnlyController.checkPermission(int)' on a null object reference
at com.mediatek.mms.ext.DefaultMmsUtilsExt.is4GDataOnly(DefaultMmsUtilsExt.java:122)
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
在文件中~/mt8735v/packages/apps/Mms/ext/src/com/mediatek/mms/ext/DefaultMmsUtilsExt.java,进行修改

  1. @Override
  2. public boolean is4GDataOnly(Context context, int subId) {
  3. Log.d("DefaultMmsUtilsExt", "[is4GDataOnly]");
  4. if (context == null) {
  5. return false;
  6. }
  7. boolean result = false;
  8. ILteDataOnlyController ldoc = (ILteDataOnlyController) MPlugin.createInstance(
  9. ILteDataOnlyController.class.getName(), context);
  10. if (ldoc == null) {
  11. result = false;
  12. }
  13. + else{  // 不检查权限问题,避免空指针的出现
  14. if (ldoc.checkPermission(subId)) {
  15. result = false;
  16. } else {
  17. result = true;
  18. }
  19. +}
  20. Log.d("DefaultMmsUtilsExt", "[is4GDataOnly],result:" + result);
  21. return result;
  22. }

其次,对于不能接收到短信,还是通过查看日志的方式来找出问题:(1)过滤出mms这个关键词,(2)清出无关的日志,保持LogCat窗口空白,(3)给机器发送短信,LogCat打印出拒收短信的日志信息。通过日志信息,提取关键LOG,以便定位到相关代码。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
LOG:
01-01 01:18:28.670 9487-9487/? D/ActivityThread: BDC-Calling onReceive: intent=Intent { act=android.provider.Telephony.SMS_REJECTED flg=0x10 cmp=com.android.mms/.transaction.SmsRejectedReceiver (has extras) }, receiver=com.android.mms.transaction.SmsRejectedReceiver@23da0792
01-01 01:18:28.673 9487-9487/? D/Mms/Txn: SmsRejectedReceiver: onReceive() intent=Intent { act=android.provider.Telephony.SMS_REJECTED flg=0x10 cmp=com.android.mms/.transaction.SmsRejectedReceiver (has extras) }
01-01 01:18:28.675 9487-9487/? D/ActivityThread: BDC-RECEIVER handled : 0 / ReceiverData{intent=Intent { act=android.provider.Telephony.SMS_REJECTED flg=0x10 cmp=com.android.mms/.transaction.SmsRejectedReceiver (has extras) } packageName=com.android.mms resultCode=-1 resultData=null resultExtras=null}
01-01 01:18:28.674 9487-9487/? D/Mms/Txn: Sms Rejected, reason=2
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  搜索关键的LOG“Sms Rejected, reason”,找到对应的文件夹~/mt8735v/packages/apps/Mms/src/com/android/mms/transaction/SmsRejectedReceiver.java

  1. /**
  2. * Receive Intent.SMS_REJECTED. Handle notification that received SMS messages are being
  3. * rejected. This can happen when the device is out of storage.
  4. */
  5. public class SmsRejectedReceiver extends BroadcastReceiver {
  6. public static final int SMS_REJECTED_NOTIFICATION_ID = 239;
  7. @Override
  8. public void onReceive(Context context, Intent intent) {
  9. /// M:
  10. MmsLog.d(MmsApp.TXN_TAG, "SmsRejectedReceiver: onReceive() intent=" + intent);
  11. if (Settings.Global.getInt(context.getContentResolver(),
  12. Settings.Global.DEVICE_PROVISIONED, 0) == 1 &&
  13. Telephony.Sms.Intents.SMS_REJECTED_ACTION.equals(intent.getAction())) {
  14. int reason = intent.getIntExtra("result", -1);
  15. /// M:
  16. MmsLog.d(MmsApp.TXN_TAG, "Sms Rejected, reason=" + reason);
  17. boolean outOfMemory = reason == Telephony.Sms.Intents.RESULT_SMS_OUT_OF_MEMORY;
  18. if (!outOfMemory) { // 执行了这个语句,就没有往下执行了,说明不是内存溢出的问题。
  19. // Right now, the only user-level rejection we show to the user is out-of-memory.
  20. return;
  21. }
  22. ... ...
  23. }

复制代码

但是,LOG信息在短信接收问题上,并没有提供太大的帮助,没定位到问题的根源。至此,只能寻求TimKing的帮助。TimKing怀疑是缺少安装了某个APP导致的,于是新建了一个临时分支,将退回到安装了全部原有APP的版本,但是,这短信还是不能接收!

这个“怡康”软件系统,客户是要在系统中添加APP签名的,也就是系统预置的APP安装在系统中,以及客户提供的已经经过签名的APP安装在系统上。会不会是这个APP签名导致有一些与短信APP相关的服务或者APP没有安装!

那么,我们就将这个APP签名屏蔽,看看能不能短信APP能不能正常接收短信。结果是可以的,然后我们把已经回退的版本给还原,包括取消DefaultMmsUtilsExt.java对短信权限、空指针的修改,没有APP签名短信APP就能够正常发送接收。那么就是这个APP签名,引起的问题。

客户要求是用户不能自己在系统上安装任何无关的APP,所以,这个签名是必须要的。那么,我们的解决办法是:在匹配签名时,将判断条件if ((flags & PARSE_IS_SYSTEM) == 0) 改为 if (flags == PARSE_CHATTY)  < 备注:public final static int PARSE_IS_SYSTEM = 1<<0; public final static int PARSE_CHATTY = 1<<1; > 这个修改,系统中的APP都不会被限制安装,而且用户不能安装任何APP。

针对有APP签名的系统中,短信不能收发的问题解决过程相关推荐

  1. 中国信通院推出了一个“APP签名服务系统,可防篡改、可追溯、第三方认证“的初步了解

    中国信通院推出了一个"APP签名服务系统,可防篡改.可追溯.第三方认证"的初步了解 今天查看邮箱无意间看到一封小米应用商店的发的邮箱,内容如下: 点击上图中的链接进入官网 国家工信 ...

  2. iOS调用系统发短信功能详解

    iOS调用系统的发短信功能可以分为两种:1,程序外调用系统发短信.2,程序内调用系统发短信.第二种的好处是用户发短信之后还可以回到app.这对app来说非常重要. 程序外调用系统发短信 这个方法其实很 ...

  3. iOS开发之系统发短信功能详解

    iOS调用系统的发短信功能可以分为两种:1,程序外调用系统发短信.2,程序内调用系统发短信.第二种的好处是用户发短信之后还可以回到app.这对app来说非常重要. 程序外调用系统发短信 这个方法其实很 ...

  4. android不调用系统发送短信,android之两种方式调用短信发送接口

    释放双眼,带上耳机,听听看~! 相信很多程序员在开发程序的时候都会遇到短信调用端口的情况,今天是技术狗小编为大家带来的关于android之两种方式调用短信发送接口,希望对你学习这方面知识有帮助! an ...

  5. Android调用系统发送短信界面

    很多软件都有分享的功能,不少是支持短信分享的,其实就是调用系统发送短信的Activity.代码实现非常简单: /*** 发送短信* @param smsBody*/private void sendS ...

  6. android调用系统发送短信

    思路 1.获取用户输入的将要接收短信的号码: 2.获取用户输入的将要发生发送的短信内容 3.利用 Intent 调用系统发送短信: 实践 1.layout布局 <EditText android ...

  7. Android调用系统群发短信,vivo部分手机弹出“无效的地址”解决方法

    Android调用系统群发短信,vivo部分手机弹出"无效的地址"解决方法 第一次写文章,来试试水 之前项目中有一个需求是获取通讯录联系人信息,并展示出来,然后可以选择一个或者多个 ...

  8. 快速集成APP注册页面免费获取短信验证码功能

    前言: 最近这段时间都忙着优化自己的个人项目,好久没来总结分享了,今天就抽空跟大家分享一下快速集成APP注册页面免费获取短信验证码功能吧. 一.使用第三方短信SDK前期准备: 在这里我是使用了第三方免 ...

  9. 【回顾】基于树莓派下的4G模块(EC200U-CN)实现远程控制短信的收发

    1. 项目简介: 树莓派通过USB与4G模块(EC200U-CN)进行连接,通过串口进行通信,使用AT指令进行控制短信收发,在远程PC端上部署短信收发的控制端,PC端通过MQTT物理网通信协议发布指令 ...

最新文章

  1. java 枚举抽象方法_Java枚举抽象方法实战
  2. mysql存储过程是什么
  3. 棒棒糖 宏_棒棒糖图表
  4. java audiostream 用不了_AudioInputStream不起作用
  5. [leetcode] 1335. 工作计划的最低难度
  6. MySQL分页查询优化
  7. 华为MA5620、MA5626 ONU改交换机详细配置(小白级教程)
  8. petalinux 建立工程两种方式
  9. Java web 集成使用QQ互联
  10. 驱动篇 -- 继电器
  11. java通过代理使用redis,redis自动关闭连接,释放资源
  12. NLP学习(二)中文分词技术
  13. 用u盘重装微软官方win10专业版--详细操作文档
  14. 远距离遥控玩具中的8通道无线收发芯片
  15. UFT 12 – Top 5 New Features you are going to Love
  16. 禾川科技科创板上市破发:大跌17% 公司市值近30亿
  17. [SpringBoot] SpringBoot入门
  18. Applier编译安装
  19. FG-301A型综合大气采样器介绍
  20. 获取roe,最好给财务做一个单独的表格,别直接连进去,太复杂了,那就

热门文章

  1. 硬件工程师七夕鹊桥设计锦集
  2. pillow之new和paste
  3. 淘宝网前台应用性能优化实践
  4. java/php/net/python驾校学员管理系统设计
  5. mybatis-plus使用注意事项
  6. GameofMir引擎架设传奇服务器【1:架设服务端】
  7. mysql自定义变量比较大小_MySQL 自定义变量@ 常用案例
  8. JMeter Dummy sampler结果乱码 及 正则表达式提取器乱码的解决
  9. 友盟 推特分享错误
  10. iOS开发者账号过期续费