一、问题分析:
最近在做一个通过短信远程启动应用的功能,要用到短信监听,代码如下
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;
import android.widget.Toast;
public class SMSReceiver extends BroadcastReceiver
{
/*当收到短信时,就会触发此方法*/
public void onReceive(Context context, Intent intent)
{
Bundle bundle = intent.getExtras();
if(bundle!=null && bundle.get("pdus")!=null){
Object[] pdus = (Object[]) bundle.get("pdus"); //得到由短信内容组成的数组对象
if(pdus!=null && pdus.length>0){
SmsMessage[] messages = new SmsMessage[pdus.length];
for(int i=0;i<pdus.length;i++){
byte[] pdu = (byte[]) pdus[i]; //得到短信内容,内容是以pdu格式存放的
messages[i] = SmsMessage.createFromPdu(pdu);
}
for(SmsMessage msg:messages){
String smscontent = msg.getMessageBody(); //得到短信内容
String smssender = msg.getOriginatingAddress(); //得到短信发送者的手机号
}
}
}
}
}
实际应用时发现双模手机对接收到的短信处理时总是在SmsMessage.createFromPdu的地方出现异常,异常信息:
java.lang.OutOfMemoryError: array size too large
at com.android.internal.telephony.cdma.SmsMessage.parsePdu(SmsMessage.java:658)
at com.android.internal.telephony.cdma.SmsMessage.createFromPdu(SmsMessage.java:116)
at android.telephony.SmsMessage.createFromPdu(SmsMessage.java:162)
而在android的源码中可以看到createFromPdu方法:
public static SmsMessage createFromPdu(byte[] pdu) {
SmsMessageBase wrappedMessage;
int activePhone = TelephonyManager.getDefault().getPhoneType();
if (PHONE_TYPE_CDMA == activePhone) {
wrappedMessage = com.android.internal.telephony.cdma.SmsMessage.createFromPdu(pdu);
} else {
wrappedMessage = com.android.internal.telephony.gsm.SmsMessage.createFromPdu(pdu);
}
return new SmsMessage(wrappedMessage);
}
如果是双模手机,调用此方法时会产生错误,问题就在于源码的TelephonyManager.getDefault().getPhoneType();该方法的返回值没有对应的双模手机的类型,而原生的android系统是不支持双模手机的。
二、解决办法:
我们可以采用广播接收者和内容观察者相结合的方式,直接读取手机的短信数据库,这样就避免了错误的产生,废话就不多说了,直接上代码:
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.database.ContentObserver;
import android.database.Cursor;
import android.net.Uri;
import android.os.Handler;
public class SMSReceiver extends BroadcastReceiver {
private static final String SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED";
private Context m_Context;
private SmsContentObserver m_Smsobserver = new SmsContentObserver(new Handler());
@Override
public void onReceive(Context context, Intent intent) {
this.m_Context = context;
if (intent.getAction().equals(SMS_RECEIVED)) {
//注册短信变化监听
context.getContentResolver().registerContentObserver(Uri.parse("content://sms/"), true, m_Smsobserver);
}
}
/**
* 短信内容观察者
* @author sinber
*
*/
private class SmsContentObserver extends ContentObserver{
public SmsContentObserver(Handler handler) {
super(handler);
}
/**
* @Description 当短信表发送改变时,调用该方法
* 需要两种权限
* <li>android.permission.READ_SMS读取短信 </li>
* <li>android.permission.WRITE_SMS写短信 </li>
* @Author sinebr
*
*/
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
Cursor cursor = null;
try{
//读取收件箱中的短信
cursor = m_Context.getContentResolver().query(Uri.parse("content://sms/inbox"), null, null, null, "date desc");
String body;
boolean hasDone = false;
if (cursor != null){
while (cursor.moveToNext()){
body = cursor.getString(cursor.getColumnIndex("body"));
if(body != null && body.equals("【startMyActivity】")){
//此处略去启动应用的代码
hasDone = true;
break;
}
if (hasDone){
break;
}
}
}
}catch(Exception e){
e.printStackTrace();
}finally{
if(cursor!=null)
cursor.close();
}
}
}
}
最后别忘了在AndroidManifest.xml中添加相应的权限,
<!-- 接收短信权限 -->
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
<!-- 发送短信权限 -->
<uses-permission android:name="android.permission.SEND_SMS"/>
还有别忘了注册广播接收者:
<receiver android:name=".SMSReceiver">
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>
这样就能适应所有的android手机了,无论是双模还是单模都没问题,问题解决了。
原文链接:http://www.cnblogs.com/sinber/archive/2011/06/22/CDMA_GSM_SMS.html
分享到:
相关推荐
NXP 公司 TD-scdma/Gsm 双模手机、上网卡设计平台
已出现的双模手机模式有:CDMA/GSM、GSM/PHS、WCDMA/GSM、TD-SCDMA/GSM,甚至还出现了GSM/GSM双卡双号手机。 关于双模终端的类型,3GPP给出了以下定义。 TYPE 1:手动模式切换,无模式间测量能力。 TYPE 2...
摘 要:本文分析了PHS/GSM双模的选择机制,提出了一种基于PHS移动台的PHS/GSM双模手机的设计方案... 图1硬件系统框图 图2软件系统框图 PHS/GSM双模选择机制PHS/GSM双模手机在一台手机终端上可同时实现PHS和GSM系统
摘要:本文分析了PHS/GSM双模的选择机制,提出了一种基于PHS移动台的PHS/GSM双模手机的设计方案。 关键词:PHS;GSM;双模 引言 目前,2G系统与无线市话系统PHS是互不兼容的,不同网络的用户要想实现网间...
9.09最新终结版双模卡CDMA_GSM
CDMA/GSM双模卡的各种详细技术要求。规定了UIM/SIM双模卡的物理特性、 电气特性、逻辑结构、命令结构、安全以及与终端设备互通的接口要求。本规范 定义的双模卡,主要是为了解决中国电信的CDMA移动网络用户在国际...
工信部2013年发布最新有效4G五模双通手机标准
行业资料-电子功用-改善双模手机中GSM开关对CDMA灵敏度影响的电路结构
所谓的双模手机是指可以任意选择使用两套截然不同的移动网络的手机,这两套网络既可以是目前的GSM和CDMA、小灵通PHS和GSM,也可以是目前的2G、2.5G和未来的3G,甚至可以是两种不同的3G标准,如TD-SCDMA与...
规范综测仪的正确使用, 保证CDMA/GSM手机的射频参数测试的合理性与正确性。 2. 参考资料: YDN 055-1997《900/1800MHz TDMA 数字蜂窝移动通信网移动台设备技术规范》 EN 300 607-1(GSM 11.10-1)《数字蜂窝无线电...
作为具有中国自主知识产权的3G标准,TD-SCDMA为中国通信产业实现整体突破提供了机遇。而TD-SCDMA/GSM/GPRS 双模终端作为从二代网络向3G平滑过渡解决方案的关键因素,其成熟化及商业化更是重中之重。本文探讨了TD-...
ZTE-C R750 CDMA2000&GSM 双模双待数字移动电话机 使用手册.pdf
TTPCom的产品是DigRF规范版本的完整实现,它支持双模GSM/(E)-GPRS和WCDMA以及HSDPA。自从2004年发布以来,DigRF已成为数字基带和射频IC之间的事实标准接口。该规范为数字蜂窝终端的基带和射频集成电路定义了一个高效...
SGH-T578H手机基于T3G7210系统解决方案,并采用业界首个由恩智浦提供的“嵌入式矢量处理器”(EVP)的软件调制解调器(即由软件定义的调制解调器),从而实现高速数据传输和双模功能。 目前中国的10个主要城市已经完
凯明信息科技股份有限公司日前宣布推出第二代增强型基带芯片 “火星”,支持TD-SCDMA/GSM/GPRS双模和丰富的多媒体应用,不需增加单独的应用处理器。在2004年10月,凯明信息推出了单模芯片组方案。 据介绍,“火星...
TTPCom的产品是最新DigRF规范版本的完整实现,它支持双模GSM/(E)-GPRS和WCDMA以及HSDPA。自从2004年发布以来,DigRF已成为数字基带和射频IC之间的事实标准接口。该规范为数字蜂窝终端的基带和射频集成电路定义了一个...
许多中心都有了UMTS覆盖,并且市场上出现了十多种双模GSM/UMTS手机,维修中心遇到了如下问题,就是有手机故障时,以及维修后的手机送还顾客以前,都要对这些手机进行哪些测试。Willtek CommunicatiONs公司的一篇新...
锐迪科推出首颗支持 HSDPA 的 TD/GSM 双模射频芯片。作为 TD-SCDMA 产业联盟的成员,锐迪科微电子从2006年开始了针对 HSDPA 技术研究,在原双模解决方案 RDA8206 的基础上进行了技术改进和升级工作,目前...
从技术层面上来看,PHS实现网络漫游不存在任何问题。但由于PHS在中国被定义为...采用PHS/GSM双模手机的设计方案,可以很好地解决两网融和的问题,使用户既能够享受PHS网络的低廉价格,又能够充分利用GSM网络覆盖的优势。
G/C双模双待机CDMA侧短消息功能的实现pdf,G/C双模双待机CDMA侧短消息功能的实现