【问题标题】:Android SMS Broadcast Receiver doesn't workAndroid SMS 广播接收器不起作用
【发布时间】:2017-10-12 22:32:00
【问题描述】:

您好,我正在尝试捕获短信内容并在我的应用程序中使用,所以我制作了一个带有权限和清单的 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

这是我的清单的一部分:

<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 收到一条消息,以便我可以继续工作,但接收器似乎甚至没有触发

【问题讨论】:

  • 编译时有什么错误吗?我的意思是你manifest 中的那些点。他们真的在那里吗?您的应用中有任何活动吗?
  • 此外,在 Android 3.1 及更高版本上,用户必须启动您的一项活动,然后任何清单注册的 BroadcastReceiver 才能工作。
  • 没有错误我在我的设备上运行应用程序,没有点只有常见的属性,如图标或名称等。是的,我当然有几个活动,是的,我运行应用程序并打开那个活动注册接收者。
  • 安装后需要先打开应用,广播接收器才能工作。
  • 是的,正如我所说,我先打开应用程序

标签: java android broadcastreceiver sms intentfilter


【解决方案1】:

您应该阅读Automatic SMS Verification

公共抽象任务startSmsRetriever()

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

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

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();
  }
});

当在用户的设备上收到验证消息时,Play 服务会向您的应用显式广播 SmsRetriever.SMS_RETRIEVED_ACTION Intent,其中包含消息的文本。使用 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;
      }
    }
  }

在您应用的 AndroidManifest.xml 文件中使用意图过滤器 com.google.android.gms.auth.api.phone.SMS_RETRIEVED 注册您的 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>

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

IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(SmsRetriever.SMS_RETRIEVED_ACTION);
getApplicationContext().registerReceiver(broadcastReceiverOBJ, intentFilter);

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

【讨论】:

    【解决方案2】:

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

    进入 Settings->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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

        然后:Google Hangout --&gt; Settings(Disable merged conversations) --&gt; 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>
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-09-14
          • 1970-01-01
          • 2016-10-22
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多