Android SMS广播接收器不起作用

时间:2017-05-13 20:00:59

标签: java android broadcastreceiver sms intentfilter

您好我正在尝试捕获短信内容并在我的应用中使用,所以我制作了一个具有权限和清单的BroadcastReceiver但是当设备收到短信时,我的代码没有运行,这意味着BroadcastReceiver不会触发。 我在这里内外检查了很多文章,有一些:

Android Sms Receiver Result to Main Activity SMS receiver didn't work

Android SMS Receiver not working

Broadcast Receiver not working for SMS

这是我Manifest的一部分:

<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.READ_SMS" />
<application.
...
...
<receiver android:name="com.example.android.receiver.SmsReceiver"
            android:permission="android.permission.BROADCAST_SMS">
            <intent-filter android:priority="2147483647">
                <action android:name="android.provider.Telephony.SMS_RECEIVED" />
            </intent-filter>
        </receiver>
</application>

这是我的接收者

public class SmsReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "SMS Received!", Toast.LENGTH_LONG).show();
    }
}

我还尝试在活动onCreate()内动态注册接收器,但没有改变

IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("android.provider.Telephony.SMS_RECEIVED");
intentFilter.setPriority(2147483647);
registerReceiver(new SmsReceiver(), intentFilter);

有谁知道问题出在哪里?它应该只是Toast一条消息被收到所以我可以继续工作,但接收器似乎甚至没有开火

4 个答案:

答案 0 :(得分:2)

您应该阅读Automatic SMS Verification

公共抽象任务startSmsRetriever()

启动SmsRetriever,它将等待匹配的SMS消息,直到超时(5分钟)。匹配的SMS消息将通过带有操作的广播意图发送 \s

准备好验证用户的电话号码时,请获取SmsRetrieverClient对象的实例,调用startSmsRetriever,并将成功和失败侦听器附加到SMS检索任务:

SmsRetriever.SMS_RETRIEVED_ACTION

在用户设备上收到验证消息后,Play服务会向您的应用明确广播 SmsRetriever.SMS_RETRIEVED_ACTION 目的,其中包含消息的文本。使用 BroadcastReceiver 接收此验证消息。

SmsRetrieverClient mClient = SmsRetriever.getClient(this);
Task<Void> mTask = mClient.startSmsRetriever();
mTask.addOnSuccessListener(new OnSuccessListener<Void>() {
  @Override public void onSuccess(Void aVoid) {
    Toast.makeText(YourActivity.this, "SMS Retriever starts", Toast.LENGTH_LONG).show();
  }
});
mTask.addOnFailureListener(new OnFailureListener() {
  @Override public void onFailure(@NonNull Exception e) {
    Toast.makeText(YourActivity.this, "Error", Toast.LENGTH_LONG).show();
  }
});

在应用程序的AndroidManifest.xml文件中使用意图过滤器 com.google.android.gms.auth.api.phone.SMS_RETRIEVED 注册您的BroadcastReceiver。

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.
          break;
        case CommonStatusCodes.TIMEOUT:
          // Waiting for SMS timed out (5 minutes)
          // Handle the error ...
          break;
      }
    }
  }

最后,在onCreate()部分注册您的BroadcastReceiver。

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

出于演示目的,您应该阅读Automatic SMS Verification Android

答案 1 :(得分:0)

我自己找到的。这是有效的代码!它必须包含这样做的SMS_DELIVER_ACTION。 (很多在github上都没有!)

进入“设置”->“ AppsNotifications”->“ DefaultApps”->“ MessagingApp”,将显示“ SMS App”供您选择。

https://android-developers.googleblog.com/2013/10/getting-your-sms-apps-ready-for-kitkat.html https://www.androidauthority.com/how-to-create-an-sms-app-part-2-724264/ https://github.com/treehousefrog/SMS-Project-Part-2

答案 2 :(得分:0)

您应该请求运行时权限才能接收SMS(Android 6.0及更高版本)。

https://developer.android.com/guide/topics/permissions/overview

答案 3 :(得分:0)

首先将另一个应用设为您的默认 SMS 应用。

然后:Google Hangout --> Settings(Disable merged conversations) --> SMS (Disable SMS)

或者,

此示例mainfest

         <receiver android:name=".SmsBroadcastReceiver"
            android:exported="true"
            android:permission="android.permission.BROADCAST_SMS">
            <intent-filter android:priority="999" >

                <action android:name="android.provider.Telephony.SMS_RECEIVED" />
                <action android:name="android.provider.Telephony.SMS_DELIVER" />
                <action android:name="android.provider.Telephony.SMS_DELIVER_ACTION" />
                <action android:name="android.intent.action.BOOT_COMPLETED"/>
            </intent-filter>
        </receiver>