在Oreo中识别短信号码ID

时间:2018-07-15 17:05:15

标签: java android broadcastreceiver

我的实际代码块可以完美地调用,但是现在我想标识一个传入的SMS号码ID并做一些事情,例如标记为已读或诸如此类(例如Mediumthis一个)。

我已经阅读了几篇文章和主题,但它甚至都没有意图,请再次注意,此代码可以完美地阻止呼叫,因此我将粘贴与SMS相关的信息

Manifest.xml

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

<service android:name=".CallReceiverService" />

广播接收器服务

@Override
public void onCreate() {
    super.onCreate();

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {

        Intent notificationIntent = new Intent(this, MainActivity.class);
        notificationIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
        PendingIntent pendingIntent = PendingIntent.getActivity(this,
                0, notificationIntent, 0);

        Notification notification = new Notification.Builder(this, SERVICE_CHANNEL_ID)
                .setSmallIcon(R.mipmap.ic_launcher)
                .setContentText(this.getResources().getString(R.string.stg_ServiceRunning))
                .setContentIntent(pendingIntent)
                .setCategory(Notification.CATEGORY_CALL)
                .build();

        startForeground(44332255, notification);
    }

    IntentFilter intentFilter = new IntentFilter();
    intentFilter.addAction("android.intent.action.PHONE_STATE"); // related to call feature, ignore
    intentFilter.addAction("android.provider.Telephony.SMS_RECEIVED");
    intentFilter.addAction("Telephony.Sms.Intents.SMS_RECEIVED_ACTION");
    intentFilter.setPriority(1000);
    registerReceiver(callCheckReceiver, intentFilter);
}


private BroadcastReceiver callCheckReceiver = new BroadcastReceiver() {

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

        try {
            if (intent.getAction().equals(Telephony.Sms.Intents.SMS_RECEIVED_ACTION)) {
                Log.d("Call", "SMS received");
                String smsSender = "";
                if (intent.getAction().equals(Telephony.Sms.Intents.SMS_RECEIVED_ACTION)) {
                    Log.d("Call", "SMS received");
                    String smsSender = "";
                    for (SmsMessage smsMessage : Telephony.Sms.Intents.getMessagesFromIntent(intent)) {
                        smsSender = smsMessage.getDisplayOriginatingAddress();
                    }

                    if (!isValidPhoneNumber(smsSender)) {
                        Log.d("Call", "Invalid SMS detected: From " + smsSender);
                    }
                }
                if (!isValidPhoneNumber(smsSender)) {
                    Log.d("Call", "Invalid SMS detected: From " + smsSender);
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

};

public static boolean isValidPhoneNumber(String phoneNumber) {
    return android.util.Patterns.PHONE.matcher(phoneNumber).matches();
}

基本上,我是在MainActivity中请求权限,在清单中设置它们,然后在Oreo或更低版本的Android中正确调用的服务中传递FilterIntent。目标API> = 19

我不想构建用于管理SMS的应用,我只想拦截数字ID并执行操作。有人可以建议吗?

1 个答案:

答案 0 :(得分:0)

您需要的是SMS Retriever API

如果要检测SMS,只需使用

    SmsRetrieverClient client = SmsRetriever.getClient(this /* context */);
    Task<Void> task = client.startSmsRetriever();
    task.addOnSuccessListener(new OnSuccessListener<Void>()
    {
        @Override
        public void onSuccess(Void aVoid)
        {
            // Successfully started retriever, expect broadcast intent
            // ...
        }
    });

    task.addOnFailureListener(new OnFailureListener()
    {
        @Override
        public void onFailure(@NonNull Exception e)
        {
            // Failed to start retriever, inspect Exception for more details
            // ...
        }
    });

在AndroidManifest.xml中,只需添加接收器

    <receiver
        android:name=".custom.SMSBroadcastReceiver"
        android:exported="true">
        <intent-filter>
            <action android:name="com.google.android.gms.auth.api.phone.SMS_RETRIEVED" />
        </intent-filter>
    </receiver>

在接收器中,您可以对检测到的消息进行任何操作

    public class SMSBroadcastReceiver extends BroadcastReceiver
{
    @Override
    public void onReceive(Context context, Intent intent)
    {
        if (SmsRetriever.SMS_RETRIEVED_ACTION.equals(intent.getAction()))
        {
            Bundle extras = intent.getExtras();
            Status status = (Status) extras.get(SmsRetriever.EXTRA_STATUS);
            switch (status.getStatusCode())
            {
                case CommonStatusCodes.SUCCESS:
                    // Get SMS message contents
                    String message = (String) extras.get(SmsRetriever.EXTRA_SMS_MESSAGE);
                    // Extract one-time code from the message and complete verification
                    // by sending the code back to your server for SMS authenticity.




                    break;
                case CommonStatusCodes.TIMEOUT:
                    // Waiting for SMS timed out (5 minutes)
                    // Handle the error ...
                    break;

            }
        }
    }
}

应注意,SMSRetrieverClient默认超时为5分钟。

要创建可检测的SMS,请遵循SMS Creator for Google