短消息是一个系统广播,所以我们需要在配置文件中填写相关的广播接收信息才能接收到系统短消息的广播通知,配置文件如下:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.qlf.test" android:versionCode="1" android:versionName="1.0"> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".mainActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <!--接受短消息需要注册的receiver,其中的android:name是继承了BroadCastReceiver的类的位置 android:priority="100" 指定了接收器的级别,这里设置的值比系统的值要高,这意味着程序的接受 短消息要早于系统接受短消息,这也就给我们提供了拦截短消息,不让系统发出短消息提示的机会。 --> <receiver android:name=".SmsBroadCast"> <intent-filter android:priority="100"> <action android:name="android.provider.Telephony.SMS_RECEIVED" /> </intent-filter> </receiver> </application> <uses-sdk android:minSdkVersion="8" /> <uses-permission android:name="android.permission.RECEIVE_SMS" /> </manifest>
然后,编写继承了BroadCastReceiver的类,用来实现短信广播的接受:
public class SmsBroadCast extends BroadcastReceiver { @Override public void onReceive(Context arg0, Intent arg1) { String dString = SmsHelper.getSmsBody(arg1); String address = SmsHelper.getSmsAddress(arg1); Log.i("qlf", dString+","+address); //阻止广播继续传递,如果该receiver比系统的级别高, //那么系统就不会收到短信通知了 abortBroadcast(); } }
随后再看看上面的SmsHelper类是如何实现短信的接收工作的。你也不要问我为什么是这么接收的,因为API就是这么用的,照办就是了:
/** * 短信帮助类 * * @author qianlifeng 2011-3-14 * */ public class SmsHelper { /** * 获得短信内容 * */ public static String GetSmsBody(Intent intent) { String tempString = ""; Bundle bundle = intent.getExtras(); Object messages[] = (Object[]) bundle.get("pdus"); SmsMessage[] smsMessage = new SmsMessage[messages.length]; for (int n = 0; n < messages.length; n++) { smsMessage[n] = SmsMessage.createFromPdu((byte[]) messages[n]); // 短信有可能因为使用了回车而导致分为多条,所以要加起来接受 tempString += smsMessage[n].getDisplayMessageBody(); } return tempString; } /** * 获得短信地址 * */ public static String GetSmsAddress(Intent intent) { Bundle bundle = intent.getExtras(); Object messages[] = (Object[]) bundle.get("pdus"); return SmsMessage.createFromPdu((byte[]) messages[0]) .getDisplayOriginatingAddress(); } /** * 发送短信 **/ public static Boolean SendSms(Context context,String addre, String mess) { try { PendingIntent mPI = PendingIntent.getBroadcast(context, 0, new Intent(), 0); SmsManager.getDefault().sendTextMessage(addre, null, mess, mPI,null); return true; } catch (Exception e) { return false; } } }
一些朋友可能还不知道如何在模拟器里面发送短消息,我截个图大家看一下:
最后,我们看一下拦截短信效果的截图:
源码下载