我正在开发的一个应用程序允许用户读取确认短信的内容,以便自己输入验证码。对于使用Oreo (API26)之前的操作系统的所有设备,BroadcastReceiver的实现工作正常,并允许正确接收短消息。在这个实现中,我的意思是将接收器对象放在AndroidManifest中。
<receiver android:name=".SmsReceiver">
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>
但是,从奥利奥开始,必须显式地将BroadcastReceivers注册到适当的上下文中。我已经实现了如下内容:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
smsReceiver = new SmsReceiver();
IntentFilter intentFilter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
intentFilter.addAction(Telephony.Sms.Intents.DATA_SMS_RECEIVED_ACTION);
this.registerReceiver(smsReceiver, intentFilter);
}
此代码块在获得Manifest.permission.READ_SMS权限后执行。SmsReceiver类扩展了BroadcastReceiver并覆盖了它的onReceive()方法。
在这里,我有几个问题:
发布于 2018-05-28 09:20:58
之前我请求-Manifest.permission.READ_SMS,但没有起作用,然后我将权限更改为- Manifest.permission.RECEIVE_SMS,然后它开始在奥利奥中工作,我还在清单中指定了接收器,我不知道这是否有帮助,但这对我来说就是一天
public static void requestPermissionForReadSMS(Fragment fragment) {
// if (fragment.shouldShowRequestPermissionRationale(Manifest.permission.READ_SMS)) {
// Helpers.showRequestPermissionAlertDialog(fragment, fragment.getString(R.string.read_sms_permission), fragment.getString(R.string.permission_request));
// } else {
fragment.requestPermissions(new String[]{Manifest.permission.RECEIVE_SMS},
Constants.READ_SMS_PERMISSION);
// }
}
发布于 2018-08-24 21:47:44
对我来说,这是可行的:
private int MY_PERMISSIONS_REQUEST_SMS_RECEIVE = 10;
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.RECEIVE_SMS},
MY_PERMISSIONS_REQUEST_SMS_RECEIVE);
在授予权限后,在你的主活动中提到上面的代码。在此之后,覆盖以下内容:
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[]
permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == MY_PERMISSIONS_REQUEST_SMS_RECEIVE) {
Log.d("TAG", "My permission request sms received successfully");
}
}
这就是全部。所以现在不需要手动关闭和打开几秒钟后的短信权限。
发布于 2018-08-25 17:51:07
@rohit sharma 给出的答案最初对我有效,但后来我也在一加、mi、oppo和vivo等各种设备上测试了我的应用程序,并发现
1.在vivo、oppo和mi (有miui)设备上,有一种叫做自动启动的功能,默认情况下是禁用的,所以SMS_RECIEVED_ACTION无法工作(这里的工作指的是在sms_recieved上启动应用程序或在后台运行任何服务),甚至被列入了最近的隐式禁令名单。
2.在一加设备上有电池优化功能,如果你的应用程序被列为电池优化(这是默认情况下是),那么SMS_RECIEVED_ACTION将只在你的应用程序在前台或后台时工作,如果你的应用程序被杀死或手机重启后广播接收器不工作。要使SMS_RECIEVD_ACTION正常工作,您必须将应用程序从电池中移除optimizatons.For有关这方面的更多信息,您可以关注此帖子here
https://stackoverflow.com/questions/48789572
复制相似问题