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

本文涉及的产品
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
简介:

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 在CODE上查看代码片 派生到我的代码片
  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 在CODE上查看代码片 派生到我的代码片
  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 在CODE上查看代码片 派生到我的代码片
  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 在CODE上查看代码片 派生到我的代码片
  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 在CODE上查看代码片 派生到我的代码片
  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.     }  

相关文章
|
20天前
|
IDE Android开发 iOS开发
深入解析Android与iOS的系统架构及开发环境差异
本文旨在探讨Android和iOS两大主流移动操作系统在系统架构、开发环境和用户体验方面的显著差异。通过对比分析,我们将揭示这两种系统在设计理念、技术实现以及市场策略上的不同路径,帮助开发者更好地理解其特点,从而做出更合适的开发决策。
80 2
|
9天前
|
测试技术 数据库 Android开发
深入解析Android架构组件——Jetpack的使用与实践
本文旨在探讨谷歌推出的Android架构组件——Jetpack,在现代Android开发中的应用。Jetpack作为一系列库和工具的集合,旨在帮助开发者更轻松地编写出健壮、可维护且性能优异的应用。通过详细解析各个组件如Lifecycle、ViewModel、LiveData等,我们将了解其原理和使用场景,并结合实例展示如何在实际项目中应用这些组件,提升开发效率和应用质量。
|
15天前
|
移动开发 Android开发 数据安全/隐私保护
移动应用与系统的技术演进:从开发到操作系统的全景解析随着智能手机和平板电脑的普及,移动应用(App)已成为人们日常生活中不可或缺的一部分。无论是社交、娱乐、购物还是办公,移动应用都扮演着重要的角色。而支撑这些应用运行的,正是功能强大且复杂的移动操作系统。本文将深入探讨移动应用的开发过程及其背后的操作系统机制,揭示这一领域的技术演进。
本文旨在提供关于移动应用与系统技术的全面概述,涵盖移动应用的开发生命周期、主要移动操作系统的特点以及它们之间的竞争关系。我们将探讨如何高效地开发移动应用,并分析iOS和Android两大主流操作系统的技术优势与局限。同时,本文还将讨论跨平台解决方案的兴起及其对移动开发领域的影响。通过这篇技术性文章,读者将获得对移动应用开发及操作系统深层理解的钥匙。
|
22天前
|
存储 开发框架 数据可视化
深入解析Android应用开发中的四大核心组件
本文将探讨Android开发中的四大核心组件——Activity、Service、BroadcastReceiver和ContentProvider。我们将深入了解每个组件的定义、作用、使用方法及它们之间的交互方式,以帮助开发者更好地理解和应用这些组件,提升Android应用开发的能力和效率。
|
25天前
|
缓存 Android开发 开发者
Android RecycleView 深度解析与面试题梳理
本文详细介绍了Android开发中高效且功能强大的`RecyclerView`,包括其架构概览、工作流程及滑动优化机制,并解析了常见的面试题。通过理解`RecyclerView`的核心组件及其优化技巧,帮助开发者提升应用性能并应对技术面试。
53 8
|
25天前
|
存储 缓存 Android开发
Android RecyclerView 缓存机制深度解析与面试题
本文首发于公众号“AntDream”,详细解析了 `RecyclerView` 的缓存机制,包括多级缓存的原理与流程,并提供了常见面试题及答案。通过本文,你将深入了解 `RecyclerView` 的高性能秘诀,提升列表和网格的开发技能。
45 8
|
3天前
|
安全 网络安全 Android开发
深度解析:利用Universal Links与Android App Links实现无缝网页至应用跳转的安全考量
【10月更文挑战第2天】在移动互联网时代,用户经常需要从网页无缝跳转到移动应用中。这种跳转不仅需要提供流畅的用户体验,还要确保安全性。本文将深入探讨如何利用Universal Links(仅限于iOS)和Android App Links技术实现这一目标,并分析其安全性。
25 0
|
1月前
|
监控 算法 数据可视化
深入解析Android应用开发中的高效内存管理策略在移动应用开发领域,Android平台因其开放性和灵活性备受开发者青睐。然而,随之而来的是内存管理的复杂性,这对开发者提出了更高的要求。高效的内存管理不仅能够提升应用的性能,还能有效避免因内存泄漏导致的应用崩溃。本文将探讨Android应用开发中的内存管理问题,并提供一系列实用的优化策略,帮助开发者打造更稳定、更高效的应用。
在Android开发中,内存管理是一个绕不开的话题。良好的内存管理机制不仅可以提高应用的运行效率,还能有效预防内存泄漏和过度消耗,从而延长电池寿命并提升用户体验。本文从Android内存管理的基本原理出发,详细讨论了几种常见的内存管理技巧,包括内存泄漏的检测与修复、内存分配与回收的优化方法,以及如何通过合理的编程习惯减少内存开销。通过对这些内容的阐述,旨在为Android开发者提供一套系统化的内存优化指南,助力开发出更加流畅稳定的应用。
52 0
|
1月前
|
图形学 iOS开发 Android开发
从Unity开发到移动平台制胜攻略:全面解析iOS与Android应用发布流程,助你轻松掌握跨平台发布技巧,打造爆款手游不是梦——性能优化、广告集成与内购设置全包含
【8月更文挑战第31天】本书详细介绍了如何在Unity中设置项目以适应移动设备,涵盖性能优化、集成广告及内购功能等关键步骤。通过具体示例和代码片段,指导读者完成iOS和Android应用的打包与发布,确保应用顺利上线并获得成功。无论是性能调整还是平台特定的操作,本书均提供了全面的解决方案。
116 0

推荐镜像

更多