Android 解决双卡双待手机解析短信异常

http://blog.csdn.net/t12x3456/article/details/17339657

开发中,难免会遇到各种各样的适配问题,尤其是经过深度修改定制过的系统,有的无论是软硬件上都有很大的区别,这里不得不提到一种奇葩的机型,没错,那就是双卡双待的手机(比如XT800, A60, S8600 , Lenovo A750,中兴V889D等).由于是双SIM卡,而且两个卡槽支持的运营商或者网络制式不一定相同,比如一个卡槽支持WCDMA,另一个却只支持GSM ,导致用正常方法解析短信很容易遇到异常

想深入了解双卡双待手机短信发送与接收流程的话,请看我之前关于 MMS的分析:

Android 短信模块分析(四) MMS之短信的发送与接收

这里先看下解决方案,这里需要以反射的方式解析不同类型的短信,并且对于不同机型,需对应地进行调整适配:

获取短信信息,注意:为解决双卡双待手机解析短信异常问题,使用Java反射机制,优先解析GSM类型的短信,假如解析失败才按CDMA类型的短信进行解析)

[java] view
plain
copy

  1. public static SmsMessage[] getSmsMessage(Intent intent) {  
  2.         SmsMessage[] msgs = null;  
  3.         Object messages[] = (Object[]) intent.getSerializableExtra("pdus");  
  4.         int len = 0;  
  5.         if (null != messages && (len = messages.length) > 0) {  
  6.             msgs = new SmsMessage[len];  
  7.             try {  
  8.                 for (int i = 0; i < len; i++) {  
  9.                     SmsMessage message = null;  
  10.                     if ("GSM".equals(intent.getStringExtra("from"))) { // 适配MOTO XT800双卡双待手机  
  11.                         message = createFromPduGsm((byte[]) messages[i]);  
  12.                     } else if ("CDMA".equals(intent.getStringExtra("from"))) { // 适配MOTO XT800双卡双待手机  
  13.                         message = createFromPduCdma((byte[]) messages[i]);  
  14.                     } else {  
  15.                         message = SmsMessage.createFromPdu((byte[]) messages[i]); // 系统默认的解析短信方式  
  16.                     }  
  17.                     if (null == message) { // 解决双卡双待类型手机解析短信异常问题  
  18.                         message = createFromPduGsm((byte[]) messages[i]);  
  19.                         if (null == message) {  
  20.                             message = createFromPduCdma((byte[]) messages[i]);  
  21.                         }  
  22.                     }  
  23.                     if (null != message) {  
  24.                         msgs[i] = message;  
  25.                     }  
  26.                 }  
  27.             } catch (Exception e) {  
  28.                 e.printStackTrace();  
  29.                 msgs = getSmsMessageByReflect(intent); // 解决双卡双待手机解析短信异常问题  
  30.             } catch (Error er) {  
  31.                 er.printStackTrace();  
  32.                 msgs = getSmsMessageByReflect(intent); // 解决双卡双待手机解析短信异常问题  
  33.             }  
  34.         }  
  35.         return msgs;  
  36.     }  

反射方式获取短信

[java] view
plain
copy

  1. /** 
  2.      * 使用Java反射机制获取短信信息(解决双卡双待手机解析短信异常问题,优先解析GSM类型的短信,假如解析失败才按CDMA类型的短信进行解析) 
  3.      *  
  4.      * @param intent 
  5.      * @return 
  6.      */  
  7.     private static SmsMessage[] getSmsMessageByReflect(Intent intent) {  
  8.         SmsMessage[] msgs = null;  
  9.         Object messages[] = (Object[]) intent.getSerializableExtra("pdus");  
  10.         int len = 0;  
  11.         if (null != messages && (len = messages.length) > 0) {  
  12.             msgs = new SmsMessage[len];  
  13.             try {  
  14.                 for (int i = 0; i < len; i++) {  
  15.                     SmsMessage message = createFromPduGsm((byte[]) messages[i]);  
  16.                     if (null == message) {  
  17.                         message = createFromPduCdma((byte[]) messages[i]);  
  18.                     }  
  19.                     if (null != message) {  
  20.                         msgs[i] = message;  
  21.                     }  
  22.                 }  
  23.             } catch (SecurityException e) {  
  24.                 e.printStackTrace();  
  25.             } catch (IllegalArgumentException e) {  
  26.                 e.printStackTrace();  
  27.             } catch (ClassNotFoundException e) {  
  28.                 e.printStackTrace();  
  29.             } catch (NoSuchMethodException e) {  
  30.                 e.printStackTrace();  
  31.             } catch (IllegalAccessException e) {  
  32.                 e.printStackTrace();  
  33.             } catch (InvocationTargetException e) {  
  34.                 e.printStackTrace();  
  35.             } catch (InstantiationException e) {  
  36.                 e.printStackTrace();  
  37.             }  
  38.         }  
  39.         return msgs;  
  40.     }  

通过Java反射机制解析GSM类型的短信:

[java] view
plain
copy

  1. private static SmsMessage createFromPduGsm(byte[] pdu) throws SecurityException, IllegalArgumentException, ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {  
  2.         return createFromPdu(pdu, "com.android.internal.telephony.gsm.SmsMessage");  
  3.     }  

解析CDMA类型的短信

[java] view
plain
copy

  1. private static SmsMessage createFromPduCdma(byte[] pdu) throws SecurityException, IllegalArgumentException, ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {  
  2.     return createFromPdu(pdu, "com.android.internal.telephony.cdma.SmsMessage");  
  3. }  

解析GSM或者CDMA类型的短信

[java] view
plain
copy

  1. private static SmsMessage createFromPdu(byte[] pdu, String className) throws ClassNotFoundException, SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException, InstantiationException {  
  2.         Class<?> clazz = Class.forName(className);  
  3.         Object object = clazz.getMethod("createFromPdu", byte[].class).invoke(clazz.newInstance(), pdu);  
  4.         if (null != object) {  
  5.             Constructor<?> constructor = SmsMessage.class.getDeclaredConstructor(Class.forName("com.android.internal.telephony.SmsMessageBase"));  
  6.             constructor.setAccessible(true);  
  7.             return (SmsMessage) constructor.newInstance(object);  
  8.         } else {  
  9.             return null;  
  10.         }  
  11.     }  
时间: 2024-10-23 08:14:35

Android 解决双卡双待手机解析短信异常的相关文章

浅析Android手机卫士之手机实现短信指令获取位置_Android

推荐阅读: 浅析Android手机卫士sim卡绑定 深入浅析Android手机卫士保存密码时进行md5加密 详解Android 手机卫士设置向导页面 浅析Android手机卫士关闭自动更新 浅析Android手机卫士自定义控件的属性 浅析Android手机卫士读取联系人 浅析Android手机卫士接收短信指令执行相应操作 浅析Android手机卫士手机定位的原理 获取位置 新建一个service的包 新建一个GPSService类继承系统的Service类 清单文件中注册一下 重写onCreat

Android中实现基本的短信拦截功能的代码示例_Android

要点 1.在Manifest.xml里加"接收"SMS的权限 <uses-permission Android:name="android.permission.RECEIVE_SMS"></uses-permission> 2.在Manifest.xml里注册一个receive <!-- 注册Receiver,并且设置优先级 --> <receiver android:name=".AutoSMS" a

Android中实现基本的短信拦截功能的代码示例

要点 1.在Manifest.xml里加"接收"SMS的权限 <uses-permission Android:name="android.permission.RECEIVE_SMS"></uses-permission> 2.在Manifest.xml里注册一个receive <!-- 注册Receiver,并且设置优先级 --> <receiver android:name=".AutoSMS" a

Android 开发之旅:短信的收发及在android模拟器之间实践(二)

引言 前面我们介绍都只是如何发送SMS消息,接下来我们介绍如何接收SMS消息,及另一种发短信的方式并增强为可以发生图片等,最后介绍一下emulator工具.本文的主要内容如下: 1~5见Android 开发之旅:短信的收发及在android模拟器之间实践(一) 6.温故知新之Intent 7.准备工作:SmsMessage类 8.SMS接收程序 9.另一种发送短信的方式:使用Intent 10.增强SMS为MMS 6.温故知新之Intent 此系列前面简单地接受过意图(Intent),这里再次简

Android编程之SMS读取短信并保存到SQLite的方法_Android

本文实例讲述了Android编程之SMS读取短信并保存到SQLite的方法.分享给大家供大家参考,具体如下: Android 之 SMS 短信在Android系统中是保存在SQLite数据库中的,但不让其它程序访问(Android系统的安全机制) 现在我们在读取手机内的SMS短信,先保存在我们自己定义的SQLite数据库中,然后读取SQLite数据库提取短信,并显示 SMS短信SQLite存取代码: package com.homer.sms; import java.sql.Date; imp

Android编程之SMS读取短信并保存到SQLite的方法

本文实例讲述了Android编程之SMS读取短信并保存到SQLite的方法.分享给大家供大家参考,具体如下: Android 之 SMS 短信在Android系统中是保存在SQLite数据库中的,但不让其它程序访问(Android系统的安全机制) 现在我们在读取手机内的SMS短信,先保存在我们自己定义的SQLite数据库中,然后读取SQLite数据库提取短信,并显示 SMS短信SQLite存取代码: package com.homer.sms; import java.sql.Date; imp

用C#通过Nokia手机发送短信(使用Nokia SDK3.0)

我在网络上找到一个用Oxygen控件发送短信的C#源码,试着调试了一下,发现确实不错,使用起来也简单.但美中不足的是在发送的短信中会自动加上控件公司的信息,注册后会取消这些信息,但注册需要一笔不小的费用.我直接在Nokia的网站上下载了免费的PC Connectivity SDK3.0,调试后发现可以实现同样的功能.以下程序在Nokia8310用红外线连接电脑下发送短信成功.安装SDK3.0后,在引用中添加COM组件Nokia Setting Adapter for PC suite 3.7和N

怎么使用苹果恢复大师恢复iPhone手机的短信附件?

  怎么使用苹果恢复大师恢复iPhone手机的短信附件? 第一步:打开苹果恢复大师,首页界面如下图,点击[开始]. 苹果恢复大师 第二步:点击[短信附件]. 苹果恢复大师 第三步:等待苹果恢复大师扫描设备. 第四步:勾选 iPhone 中信息附件[短信图片]或[短信音频],在右上角勾选"全选"或在选择勾选个别图片.音频,点击右下角[恢复到电脑]. 苹果恢复大师 第五步:点击[浏览],选择想保存的路径;点击[打开],查看路径;点击[一键恢复],将数据保存在本地主机;点击[取消],取消备份

用户手机注册短信验证

问题描述 用户手机注册短信验证 在做用户注册是忘记密码的时候需要手机验证.... 比如在项目中用手机号注册,然后会收到一个验证信息,正确就成功否则失败!有没有哪位大牛做过,求指导一下,如何做....最好可以有个demo和说下用的哪个运营商稳定些!谢谢了