3

アプリで着信 SMS を監視しようとしています。Android 側から、 API 19からの受信 SMS を監視するためにいくつかの変更を行いました。

API 23で受信メッセージをバックグラウンドで追跡できません (アプリがバックグラウンドになく、モバイル画面がオフ状態のとき) 。

Android ドキュメントでは、アプリがAPI 19からの既定のメッセージ アプリではない場合、バックグラウンドで着信 SMS を追跡できないと述べています。

参照:- SMS アプリを KitKat に対応させる

しかし、My API 21(LOLLIPOP)デバイスで動作しています。API 23(Marshmallow)デバイスでは動作しません。デバイス画面がオンの場合、またはアプリが開いている場合は、API 23(Marshmallow)でも動作していることを意味します。

API 23(Marshmallow)で受信メッセージをバックグラウンドで追跡する方法はありますか?

マニフェスト コード

<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.READ_SMS" />

<receiver
        android:name=".SMSReceiver"
        android:enabled="true"
        android:exported="true"
        android:permission="android.permission.BROADCAST_SMS">
        <intent-filter android:priority="5822">
            <action android:name="android.provider.Telephony.SMS_RECEIVED" />
        </intent-filter>
</receiver>

ここに私のJavaコード

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.telephony.SmsMessage;

public class SMSReceiver extends BroadcastReceiver {

public static final String BROADCAST = "SMS_RECEIVER";
private static final String SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED";

Intent broadcast_intent;
String message_body = "", originAddress;

StringBuilder bodyText;

@Override
public void onReceive(Context context, Intent intent) {


    if (intent.getAction().equalsIgnoreCase(SMS_RECEIVED)) {

        broadcast_intent = new Intent(BROADCAST);

        Bundle bundle = intent.getExtras();
        SmsMessage[] messages;

        if (bundle != null) {

            Object[] pdus = (Object[]) bundle.get("pdus");

            messages = new SmsMessage[pdus.length];

            bodyText = new StringBuilder();

            for (int i = 0; i < messages.length; i++) {

                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    String format = bundle.getString("format");
                    messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i], format);
                } else {
                    messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
                }

                originAddress = messages[i].getOriginatingAddress().toUpperCase();
                bodyText.append(messages[i].getMessageBody());

            }

            message_body = bodyText.toString();

        }
    }
}
}
4

2 に答える 2

1

基本的には、放送受信機を登録してリッスンSMS_Receiveし、次のことを確認できます。

Intent intent = getIntent();
Bundle bundle = intent.getBundleExtra("mySMS");

if (bundle != null) {
    Object[] pdus = (Object[])bundle.get("pdus");
    SmsMessage sms = SmsMessage.createFromPdu((byte[])pdus[0]);
    Log.i(TAG, "smsActivity : SMS is <" +  sms.getMessageBody() +">");


    String message = sms.getMessageBody();
    //required sms
    TextView tx = (TextView) findViewById(R.id.TextBox);
    tx.setText(message);            
} else
    Log.i(TAG, "smsActivity : NULL SMS bundle");
于 2017-01-09T10:18:17.180 に答える