权限对话框在Android 6.0.1(棉花糖)中未显示。

3
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.SEND_SMS) == PackageManager.PERMISSION_GRANTED) {
        try {
            Cursor temp = db.rawQuery("Select name from profile;", null);
            temp.moveToFirst();
            Toast.makeText(TrustedContacts.this, ""+c.getString(2), Toast.LENGTH_SHORT).show();
            (SmsManager.getDefault()).sendTextMessage("0"+c.getString(2), null, "Automated SMS by Medical Alert App by " + temp.getString(0), null, null);
            Toast.makeText(TrustedContacts.this, "SMS Sent!", Toast.LENGTH_SHORT).show();
        }
        catch (Exception e)
        {
            Toast.makeText(TrustedContacts.this, ""+e.getMessage(), Toast.LENGTH_SHORT).show();
        }
    } else
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.SEND_SMS}, 1);

以下是通过短信管理器发送短信的代码,但权限对话框没有显示出来。

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
 <uses-permission android:name="android.permission.SEND_SMS"/>
 <uses-permission android:name="android.permission.CALL_PHONE" />

我已经在清单文件中添加了权限。接收开机完成权限也是同样的情况。然而,拨打电话权限可以完美工作。无法确定问题所在。 Android Studio目标API为23,最低API为15。


@MikeM。在build.gradle中,目标版本SDK设置为23。只有电话呼叫权限对话框会显示出来,其他的不会。 - Soumyadeep Ghosh
是的,我刚刚注意到你提到了CALL_PHONE可以工作。你能发短信吗?我的意思是,你实际上获得了权限吗?顺便说一句,RECEIVE_BOOT_COMPLETED不是危险权限,因此不需要在运行时请求。 - Mike M.
不,我无法发送短信。控制进入else部分,然后继续执行而不显示。 - Soumyadeep Ghosh
TrustedContacts 继承自哪个类? - Mike M.
嗯。你确定所有权限都在<application>标签之外吗?而且你在SEND_SMS元素中拼写得完全正确吗?你可以尝试清理/重建你的项目。 - Mike M.
显示剩余2条评论
3个回答

3
如果您的应用程序中涉及关键用户隐私问题(例如发送短信、读取联系人等)并使用了一些危险权限,那么仅在MANIFEST清单中添加权限是不够的。在Marshmallow中,您必须在应用程序执行特定功能之前,在运行时(使用JAVA)要求用户授权。
运行时应用程序权限仅适用于Android OS 6(Marshmallow)及以上版本。
请在Manifest.java中添加权限。
<uses-permission android:name="android.permission.SEND_SMS" />

试试我的代码

private static final int PERMISSION_REQUEST = 100;

//this is the onclick listener of send button
public void send(View view) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        if (checkSelfPermission(Manifest.permission.SEND_SMS) != PackageManager.PERMISSION_GRANTED) {
            if (shouldShowRequestPermissionRationale(Manifest.permission.SEND_SMS)) {
                Snackbar.make(findViewById(R.id.rl), "You need to grant SEND SMS permission to send sms",
                        Snackbar.LENGTH_LONG).setAction("OK", new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        requestPermissions(new String[]{Manifest.permission.SEND_SMS}, PERMISSION_REQUEST);
                    }
                }).show();
            } else {
                requestPermissions(new String[]{Manifest.permission.SEND_SMS}, PERMISSION_REQUEST);
            }
        } else {
            sendSMS();
        }
    } else {
        sendSMS();
    }
}

private void sendSMS() {
    String phoneNumber = "1234";
    String msg="hello, this is a text message";
    SmsManager sms = SmsManager.getDefault();
    sms.sendTextMessage(phoneNumber, null, msg, null, null);
}

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {

        Snackbar.make(findViewById(R.id.rl), "Permission Granted",
                Snackbar.LENGTH_LONG).show();
        sendSMS();

    } else {

        Snackbar.make(findViewById(R.id.rl), "Permission denied",
                Snackbar.LENGTH_LONG).show();

    }
}

提示用户授予权限或拒绝权限,您可以编写以下代码,它将自动向用户显示对话框并给予他/她允许或拒绝的选项。请注意,此对话框是系统定义的,不可编辑。

requestPermissions(new String[] {Manifest.permission.SEND_SMS}, PERMISSION_REQUEST);

输出将类似于:

enter image description here


请告诉我这是否适用于您的情况,因为它在我的应用程序中有效。 - Abhishek T.
这个回答怎么能解决问题呢?楼主在问关于棉花糖权限对话框的问题。 - Mike M.

0

只有在您的设备运行 Andorid OS 6.0 或更高版本时,才会显示权限对话框;否则不会显示对话框,但在之前的版本中已经获得了权限而无需对话框。


OP在标题中表示他们使用的是6.0.1版本。 - Mike M.

0
我解决了。实际上我在应用程序内部编写了权限,而不是在清单文件中定义。抱歉 :P

1
好的,但你能否给我的答案点个赞或接受它呢。 :) - Abhishek T.

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