检查广播接收器是否正常工作

Checking if a Broadcast Receiver is Working

我正在开发一个应用程序,它将使用 BroadcastReceiver 来接收满足特定条件的特定 SMS 消息。距离完成还有很长的路要走,主要是因为 BroadcastReceiver 似乎无法正常工作。我尝试使用 toast 来检查它是否有效,但没有得到任何结果。所以要么:

  1. BroadcastReceiver 不工作
  2. 我的测试方法不对
  3. 或两者兼而有之

AndroidManifest.xml 文件是

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.example.alert6">

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

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.Alert6">

        <activity
            android:name=".SendResponseActivity"
            android:parentActivityName=".ReceiveAlertActivity">
        </activity>

        <activity
            android:name=".ReceiveAlertActivity"
            android:parentActivityName=".MainActivity">
        </activity>

        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <receiver
            android:name=".SmsBroadcastReceiver"
            android:enabled="true"
            android:exported="true">
            <intent-filter android:priority="999" >
                <action android:name="android.provider.Telephony.SMS_RECEIVED" />
            </intent-filter>
        </receiver>

    </application>

</manifest>

这是 SmsBroadcastReceiver java 文件

package com.example.alert6;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.provider.Telephony;
import android.telephony.SmsMessage;
import android.widget.Toast;

public class SmsBroadcastReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context,"SMS Is Being Received",Toast.LENGTH_LONG).show();
        if (intent.getAction().equals(Telephony.Sms.Intents.SMS_RECEIVED_ACTION)) {
            String smsSender = "";
            String smsBody = "";
            for (SmsMessage smsMessage : Telephony.Sms.Intents.getMessagesFromIntent(intent)) {
                smsSender = smsMessage.getOriginatingAddress();
                smsBody = smsMessage.getMessageBody();
            }

            if (smsSender.equals("+420775367297")) {
                if (smsBody.contains("Test")) {
// I haven't done this bit yet
                }
            }
        }
    }
}

当我向测试设备发送 SMS 时,我会收到提示消息“正在接收 SMS”。相反,该应用程序从屏幕上消失,取而代之的是我的默认短信应用程序。我做错了什么?

自 Android API 23 起,您不仅需要在清单 class 中设置权限,还需要手动设置权限。你应该在应用程序的设置中设置它,或者你应该从你的代码中请求权限。这是您需要添加到 activity 主文件中的内容:

// constant for request code
private final int MY_PERMISSIONS_REQUEST_SMS_RECEIVE = 10; // any number which you want

//function for permission request
@RequiresApi(api = Build.VERSION_CODES.M)
public void checkPermission() {
    if ((ContextCompat.checkSelfPermission(this, Manifest.permission.RECEIVE_SMS) != PackageManager.PERMISSION_GRANTED)) {
        requestPermissions(new String[]{Manifest.permission.RECEIVE_SMS}, MY_PERMISSIONS_REQUEST_SMS_RECEIVE);
    }
}

你还需要在某处调用这个函数。例如你可以在 onCreate().

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        checkPermission();
    }
    //do something else
}

经过大量的摆弄和测试,我得出的结论是广播接收器不工作。可能是由于 Android 对“危险”权限的限制。我不认为这个线程还有任何生命,但我会继续尝试说服我的 Android 应用程序在必要的权限下工作。