BroadcastReceiver SMS_Received无法在新设备上运行

Kho*_*khe 11 sms android broadcastreceiver android-permissions

在经历了几个资源和问题后,我仍然面临检测传入SMS消息的问题.

下面的代码显示了基础知识:

显示Toast onReceive的广播接收器类

public class IncomingSms extends BroadcastReceiver {
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "something received", Toast.LENGTH_SHORT).show();
    }
}
Run Code Online (Sandbox Code Playgroud)

简单清单,注册接收者和权限

<application
    <receiver 
        android:name=".IncomingSms"
        android:permission="android.permission.BROADCAST_SMS"
        android:exported="true">

        <intent-filter android:priority="2147483647" >
            <action android:name="android.provider.Telephony.SMS_RECEIVED" />
        </intent-filter>
    </receiver>

</application>

<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.SEND_SMS" />
Run Code Online (Sandbox Code Playgroud)

上面的代码声明并注册接收器,并具有适当的权限.此外,优先级设置为MAX_INT或2147483647.

我的设备是Nexus 6P,安装了默认的Messenger应用程序(我也尝试过环聊).该应用程序仍然不显示我的祝酒词.尝试使用较旧的三星设备后,正确打印了祝酒词.

优先问题

我在6P上安装了一个名为Manifest Viewer的应用程序,它允许我查看设备上安装的应用程序的manifest.xml.我检查了Messenger和Hangouts的清单,作为SMS标签的接收者,发现它们都指定了2147483647的优先级.看起来这两个信使应用程序最大优先级,一旦他们消费了消息,他们不允许其他应用程序进行干预.请注意,这些是Google应用程序的库存,而不是第三方.

在这一点上,我很困惑:

  • 他们为什么要这样做?
  • 如何绕过它?

非常感谢

Kho*_*khe 28

好的,问题解决了.问题不在于优先事项,而是我的手机是Nexus 6P(又名API 23).

仅在manifest.xml中提供权限是不够的,我不得不为运行时权限请求添加代码.有关运行时权限,请参阅Android文档

将此代码添加到您的MainActiviy:

ActivityCompat.requestPermissions(this, 
            new String[]{Manifest.permission.RECEIVE_SMS},
            MY_PERMISSIONS_REQUEST_SMS_RECEIVE);
Run Code Online (Sandbox Code Playgroud)

在MainActivity类的顶部定义它:

private int MY_PERMISSIONS_REQUEST_SMS_RECEIVE = 10;
Run Code Online (Sandbox Code Playgroud)

并添加此覆盖:

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode == MY_PERMISSIONS_REQUEST_SMS_RECEIVE) {
        // YES!!
        Log.i("TAG", "MY_PERMISSIONS_REQUEST_SMS_RECEIVE --> YES");
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,很棒的帖子,非常有帮助.虽然我的印象是问题与API级别23有关,而与Nexus设备无关.也许你应该注意到最后的覆盖并不是真的需要,只是像我这样的代码复制僵尸;-) (2认同)
  • 这解决了我的问题-我只请求`READ_SMS`权限,而不是`RECEIVE_SMS`权限。即使我遵循了有关Android Authority的教程! (2认同)