如何知道短信发送被权限检查阻止了?

3
以下是代码示例:
SmsManager sms = SmsManager.getDefault();
sms.sendTextMessage(target, null, content, sentPI, delieveredPI);

我在 AndroidManifest.xml 文件中声明了使用 "android.permission.SEND_SMS" 权限。
但是,在一些手机上,当使用 api 发送短信时,会弹出一个请求权限的对话框,如果用户选择“不授权”该权限,短信发送将静默失败,没有任何回调或广播。
问题是:是否有方法可以检测这种阻止行为?

3个回答

4

但是在一些手机上,使用API发送短信时会弹出一个请求权限的对话框。

是的,在安装有新的运行时权限模型的 Android Marshmallow 设备上会出现这种情况。

在尝试使用该权限之前,您需要使用checkSelfPermission方法,如下所示:

if (Context.checkSelfPermission(Manifest.permission.SEND_SMS)
                                  != PackageManager.PERMISSION_GRANTED) {
   // permission is not granted, ask for permission:
   requestPermissions(this, //assuming this is Activity or a subclass of it
            new String[] { Manifest.permission.SEND_SMS},
            MY_KEY_FOR_RETURNED_VALUE);
 }

可选的,你可以(也应该)向用户显示一个理由(首先使用shouldShowRequestPermissionRationale检查Android是否会要求用户授予权限-如果用户拒绝并标记“不再询问”,那么他将不会被提示,所以你应该先进行检查而不总是显示)。

然后在你的onRequestPermissionsResult实现中检查请求的答案:

@override
public void onRequestPermissionsResult(int requestCode,
    String permissions[], int[] grantResults) {

    if (requestCode == MY_KEY_FOR_RETURNED_VALUE) {
       if (grantResults.length > 0
            && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

           // permission is granted
       }
    }

您可以在这里了解更多信息,也可以在官方文档这里找到。


谢谢,我知道6.0中的这个新功能,但是一些设备制造商甚至在6.0以下的系统上以自己的方式实现了权限检查,比如小米、华为等。在这些手机上,如果用户选择不允许,那么呼叫将会被静默消耗,什么也不会发生... - ZhangYu
我明白了。从你的问题中并不清楚。无论如何,我不确定是否有一种方法可以检测它。我想PackageManager.checkPermission可能行不通,但值得一试。您也可以查看AppOpsManager类(使用((AppOpsManager)context.getSystemService(Context.APP_OPS_SERVICE)).checkOpNoThrow(permission, android.os.Process.myUid(), context.getPackageName());)。除此之外,我建议使用try/catch。很抱歉我帮不上更多的忙。 - Ori Lentz
再次感谢您!您的假设是正确的,checkPermission不起作用,它只是从AndroidManifest中提取值,我将尝试使用AppOpsManager。 - ZhangYu

0

对于 Android 6.0 及以上版本,我使用以下代码:

boolean isBlocked = shouldShowRequestPermissionRationale(Manifest.permission.SEND_SMS);

来检查权限是否被勾选为不再询问。

如果isBlocked返回true,则表示权限被拒绝。

如果isBlocked返回false,则表示权限被勾选为不再询问并且被阻止了。

在使用该方法之前,请先检查构建版本。

if (Build.VERSION.SDK_INT >= M){ boolean isBlocked = shouldShowRequestPermissionRationale(Manifest.permission.SEND_SMS); }

这是文档


isBlocked 在操作系统第一次显示权限对话框时将返回 false,请注意。 - Mohd Qasim

0
这是我用来检查权限的代码 -
// Check Permission fails on Android OSes below Marshmallow, so the below if sentence is necessary
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                if (checkSelfPermission(Manifest.permission.SEND_SMS) != PackageManager.PERMISSION_GRANTED) {
                    requestPermissions(new String[] {Manifest.permission.SEND_SMS},
            REQUEST_CODE_ASK_PERMISSIONS);
                }
            }

谢谢,我知道在6.0中有这个新功能,但是一些设备制造商甚至在他们6.0以下的系统中以自己的方式实现了权限检查,比如小米、华为等。在这些手机上,如果用户选择不允许,通话将会被静默消耗,什么都不会发生... - ZhangYu
@ZhangYu 他们需要前往设置并手动授予权限。 - TheRealChx101

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接