一、问题分析:
最近在做一个通过短信远程启动应用的功能,要用到短信监听,代码如下
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/GSM 双模手机设计平台"的相关知识点,主要包括以下几个方面: ### 一、引言 #### 1.1 目的与范围 该文档主要介绍了NXP公司的TD-scdma/Gsm双模手机、上网卡设计平台...
已出现的双模手机模式有:CDMA/GSM、GSM/PHS、WCDMA/GSM、TD-SCDMA/GSM,甚至还出现了GSM/GSM双卡双号手机。 关于双模终端的类型,3GPP给出了以下定义。 TYPE 1:手动模式切换,无模式间测量能力。 TYPE 2...
总的来说,这个压缩包包含了一系列用于处理CDMA和GSM网络SIM卡的软件工具,以及一个指导手册,旨在帮助用户在win10系统下进行写卡操作,从而实现手机与不同运营商网络的兼容。用户在进行此类操作时,需谨慎对待,...
双模卡技术是一种通信技术,它允许用户在同一设备上使用两种不同的移动通信标准,即CDMA(码分多址)和GSM(全球系统 for 移动通信)。这种技术为用户提供了灵活性,可以在不同网络之间无缝切换,尤其在中国大陆地区...
摘 要:本文分析了PHS/GSM双模的选择机制,提出了一种基于PHS移动台的PHS/GSM双模手机的设计方案... 图1硬件系统框图 图2软件系统框图 PHS/GSM双模选择机制PHS/GSM双模手机在一台手机终端上可同时实现PHS和GSM系统
摘要:本文分析了PHS/GSM双模的选择机制,提出了一种基于PHS移动台的PHS/GSM双模手机的设计方案。 关键词:PHS;GSM;双模 引言 目前,2G系统与无线市话系统PHS是互不兼容的,不同网络的用户要想实现网间...
文章的关键字包括:双模、Qualcomm、AT命令、短信、协议GSM/CDMA。这些关键词点明了文章研究的主要内容和方向。 文章中提到的研究成果目前已经在双模手机研发中成功应用,并为其他类似产品的研发提供了参考。这说明...
在电子工程领域,双模手机的设计是一个复杂而关键的任务,特别是在处理GSM(全球系统移动通信)和CDMA(码分多址)两种不同通信标准的兼容性问题时。本资料主要关注的是如何通过改进电路结构来降低GSM开关对CDMA接收...
工信部2013年发布最新有效4G五模双通手机标准
2. 实现TD-SCDMA与GSM间的切换和漫游,依赖双模终端; 3. 优先满足数据业务需求,初期语音业务仅支持TD-SCDMA到GSM的单向切换; 4. 对于数据业务,可通过升级GSM网络或共享PS域核心网设备以提供GPRS/EDGE服务。 ...
双模手机能够支持两种不同的移动通信标准,如GSM(全球系统 for 移动通信)和CDMA(码分多址),或者是不同世代的网络,如2G、2.5G以及3G,甚至是不同3G标准,如TD-SCDMA和CDMA2000。这样的设计使得用户可以在多种...
《基于PHS移动台的PHS/GSM双模手机设计》 随着移动通信技术的不断发展,用户对于网络融合的需求日益增强。在中国,由于PHS(个人 Handyphone 系统)被定位为无线市话,主要用于固定电话的延伸,因此无法实现网络...
本规范主要针对中国电信CDMA/GSM双模卡的技术要求进行了详细的描述,旨在为用户提供一个能够在国际漫游时仍能享受中国电信或其他合作运营商移动通信服务的解决方案。该规范覆盖了双模卡的各个方面,包括但不限于物理...
这种类型的手机具有双模双待功能,即一张卡可以使用中国电信的CDMA2000/CDMA服务,而另一张卡则可以使用中国移动或中国联通的GSM网络,但仅限于语音和短信功能,无法使用这两家运营商的3G数据服务。 了解手机网络...
**ZTE-C R750 CDMA2000&GSM 双模双待数字移动电话机** 是中兴通讯推出的一款具有双重网络模式的智能手机。它支持CDMA2000和GSM两种通信标准,使得用户可以在两种网络间自由切换,满足不同地区或运营商的需求。该手机...
作为具有中国自主知识产权的3G标准,TD-SCDMA为中国通信产业实现整体突破提供了机遇。而TD-SCDMA/GSM/GPRS 双模终端作为从二代网络向3G平滑过渡解决方案的关键因素,其成熟化及商业化更是重中之重。本文探讨了TD-...
TTPCom的产品是DigRF规范版本的完整实现,它支持双模GSM/(E)-GPRS和WCDMA以及HSDPA。自从2004年发布以来,DigRF已成为数字基带和射频IC之间的事实标准接口。该规范为数字蜂窝终端的基带和射频集成电路定义了一个高效...
6. **CDMA2000/GSM 双模双待**:这种手机的特别之处在于它可以同时支持电信的2G和3G服务,并且另一张SIM卡槽能接受中国移动或中国联通的2G服务,用于语音和短信。这意味着你可以同时使用电信和非电信的网络,但要...
许多中心都有了UMTS覆盖,并且市场上出现了十多种双模GSM/UMTS手机,维修中心遇到了如下问题,就是有手机故障时,以及维修后的手机送还顾客以前,都要对这些手机进行哪些测试。Willtek CommunicatiONs公司的一篇新...