我有一个 SMS 监听器,它在 Oreo (API 26) 之前的版本中运行良好,但在 API 26 中似乎被忽略。根据文档,SMS_RECEIVED_ACTION
不受隐式广播限制 ( link ) 的约束,因此不需要进行任何更改。
这是我的听众:
public class SmsListener extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
(...)
}
}
我的 list 上有这个:
<receiver android:name=".communication.SmsListener"
android:permission="android.permission.BROADCAST_SMS">
<intent-filter android:priority="1000">
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>
并设置权限
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
<uses-permission android:name="android.permission.READ_SMS"/>
尝试过不同的示例项目,例如 this同样,结果是相同的,API 26 中没有捕获任何短信。
有人可以为我提供一个工作示例或帮助我确定是否需要更改某些内容或者 API 26 中是否存在错误?
最佳答案
仅在 manifest.xml
中提供权限是不够的,我必须为运行时权限请求添加代码。
将此代码添加到您的MainActiviy
中:
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.RECEIVE_SMS},
MY_PERMISSIONS_REQUEST_SMS_RECEIVE);
在MainActivity
类的顶部定义它:
private int MY_PERMISSIONS_REQUEST_SMS_RECEIVE = 10;
并添加此覆盖:
@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");
}
}
参见Android documentation for runtime permissions
参见BroadcastReceiver SMS_Received not working on new devices , Broadcast Receivers not working in Android 6.0 Marshmallow
关于java - Oreo 上的短信广播接收器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47678283/