チュートリアルに従って、アプリケーションでSMSを受信し、それを読んでSMSbodyをToastに渡しました。これは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" />
アプリは正常に起動しますが、SMSの受信に応答せず、何もしません。
これがSMSメッセージを受信する私の実装です。 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受信したSMSメッセージに関する通知は順序付けられたブロードキャストとして配信されるため、Android:priority
の<intent-filter>
属性を使用して、システムに最初にSMSをアプリケーションに送信するように指示できます(また、abortBroadcast()を呼び出して、他のアプリケーションがSMSを受信しないようにすることもできます(ネイティブSMSアプリなど)。ブロードキャストレシーバーが操作を実行するのに約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>
注:一部のデバイスでは、インテントフィルターに Android:priority = "100" がないとコードが機能しません。
<application
<uses-permission Android:name="Android.permission.RECEIVE_SMS" />
<uses-permission Android:name="Android.permission.READ_SMS" />
...
<receiver
Android:name=".SMSReceiver">
<intent-filter Android:priority="100">
<action Android:name="Android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
...
</application>
そしてここでJavaコード:
public class SMSReceiver extends BroadcastReceiver {
public static final String ACTION ="Android.provider.Telephony.SMS_RECEIVED";
private static final String SMS_SENDER="123456789";
@Override
public void onReceive(Context context, Intent intent) {
if (intent != null && intent.getAction() != null &&
ACTION.compareToIgnoreCase(intent.getAction()) == 0) {
Object[] pduArray = (Object[]) intent.getExtras().get("pdus");
SmsMessage[] messages = new SmsMessage[pduArray.length];
for (int i = 0; i < pduArray.length; i++) {
messages[i] = SmsMessage.createFromPdu((byte[]) pduArray[i]);
}
// SMS Sender, example: 123456789
String sms_from = messages[0].getDisplayOriginatingAddress();
//Lets check if SMS sender is 123456789
if (sms_from.equalsIgnoreCase(SMS_SENDER)) {
StringBuilder bodyText = new StringBuilder();
// If SMS has several parts, lets combine it :)
for (int i = 0; i < messages.length; i++) {
bodyText.append(messages[i].getMessageBody());
}
//SMS Body
String body = bodyText.toString();
// Lets get SMS Code
String code = body.replaceAll("[^0-9]", "");
}
}
}