web-dev-qa-db-ja.com

受信SMS on Android App

チュートリアルに従って、アプリケーションで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の受信に応答せず、何もしません。

12
Morad Edwar

これが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秒かかることを忘れないでください。そうしないと、ジョブを終了する前に途中で終了する可能性があります。

26
biegleux

ブロードキャストでは大文字と小文字が区別されます。使用する 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>
2
marmor

注:一部のデバイスでは、インテントフィルターに 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]", ""); 
            }
      }
 }
2
ABDU