在Android应用上接收短信
我跟着一个教程接收我的应用程序的短信,并阅读它通过SMSbody吐司。 那就是Receiver类。
public class SmsReciever extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent){ Bundle bundle= intent.getExtras(); SmsMessage[] msgs= null; String str=""; if(bundle != null ){ Object [] pdus=(Object[]) bundle.get("pdus"); msgs=new SmsMessage[pdus.length]; for(int i=0; i< msgs.length;i++){ msgs[i]= SmsMessage.createFromPdu((byte[])pdus[i]); str+= msgs[i].getMessageBody(); } Toast.makeText(context, str, Toast.LENGTH_LONG).show(); } } }
清单文件
<receiver android:name="com.msoft.masrooq.SmsReciever"> <intent-filter> <action android:name="android.provider.telephony.SMS_RECIEVED"></action> </intent-filter> </receiver> <uses-permission android:name="android.permission.RECEIVE_SMS"/> <uses-permission android:name="android.permission.READ_SMS" />
该应用程序启动罚款,但它不响应接收短信它什么都不做。
这是我的接收短信的实现。 短信可能会分解成许多,注意它是如何处理的。 还要检查android:priority
属性。
public class SmsReceiver extends BroadcastReceiver { private static final String SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED"; @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(SMS_RECEIVED)) { Bundle bundle = intent.getExtras(); if (bundle != null) { // get sms objects Object[] pdus = (Object[]) bundle.get("pdus"); if (pdus.length == 0) { return; } // large message might be broken into many SmsMessage[] messages = new SmsMessage[pdus.length]; StringBuilder sb = new StringBuilder(); for (int i = 0; i < pdus.length; i++) { messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]); sb.append(messages[i].getMessageBody()); } String sender = messages[0].getOriginatingAddress(); String message = sb.toString(); Toast.makeText(context, message, Toast.LENGTH_SHORT).show(); // prevent any other broadcast receivers from receiving broadcast // abortBroadcast(); } } } }
AndroidManifest.xml中
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.smsreceiver" android:versionCode="1" android:versionName="1.0"> <uses-sdk android:minSdkVersion="4" /> <uses-permission android:name="android.permission.RECEIVE_SMS" /> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".SmsLoggerActivity" 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="com.example.smsreceiver.SmsReceiver" android:enabled="true"> <intent-filter android:priority="2147483647"> <action android:name="android.provider.Telephony.SMS_RECEIVED" /> </intent-filter> </receiver> </application> </manifest>
几个注意事项:如果你声明你的接收器在xml比系统可以使用你的接收器,无论你的应用程序曾经启动。 由于有关接收到的短信息的Android 1.6通知以有序广播forms发送,所以可以使用<intent-filter>
android:priority
属性来告诉系统首先将短信发送给您的应用程序(您也可以调用abortBroadcast()不会收到短信,例如本地的短信应用程序)。 不要忘记广播接收机的执行时间大约为10秒,否则在完成作业之前可能会提前终止。
广播区分大小写。 使用“android.provider。Telephony .SMS_RECEIVED”不是“android.provider。telephony .SMS_RECEIVED”
此外,我也有一个类别集,但我不知道这是强制性的:
<intent-filter> <action android:name="android.provider.Telephony.SMS_RECEIVED" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter>