如何在Android中自定义权限对话框?

39

假设我在运行时像以下一样请求权限:

ActivityCompat.requestPermissions(thisActivity,
            new String[]{Manifest.permission.READ_CONTACTS},
            MY_PERMISSIONS_REQUEST_READ_CONTACTS);

Android系统创建一个弹出对话框来请求权限。我如何为该对话框定义自定义布局?


1
你无法查看,参见https://dev59.com/No7da4cB1Zd3GeqP-kB_ - Igor Tyulkanov
3个回答

68
简短的回答是:你不能。
正如Android文档所述:
当你的应用调用requestPermissions()时,系统会向用户显示一个标准对话框。你的应用程序无法配置或更改该对话框。如果你需要向用户提供任何信息或解释,你应该在调用requestPermissions()之前进行,如“解释应用程序需要权限”中所述。
总结一下:目前没有办法为权限对话框定义自定义布局。
你可以在这里找到更详细的信息:http://developer.android.com/training/permissions/requesting.html

1
“android... 允许您向该对话框添加一些文本,以解释用户为什么需要请求该权限”-- 据我所知没有这个功能。 - CommonsWare
@CommonsWare 我认为开发者可以解释使用该权限的理由,这是错误的吗?还是只有安卓显示了关于该权限的默认解释? - yrazlik
3
通过 shouldShowPermissionRequestRationale() 方法,您可以了解是否需要显示权限请求的解释。但是,您必须在自己的用户界面中实现此功能。不能在系统对话框中添加说明文字。 - CommonsWare

22

我已经为权限创建了自定义对话框:

if (ContextCompat.checkSelfPermission(context, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
   if (ActivityCompat.shouldShowRequestPermissionRationale((Activity) context, Manifest.permission.READ_EXTERNAL_STORAGE)) {
       AlertDialog.Builder alertBuilder = new AlertDialog.Builder(context);
       alertBuilder.setCancelable(true);
       alertBuilder.setTitle("Permission necessary");
       alertBuilder.setMessage("External storage permission is necessary");
       alertBuilder.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {

       @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
       public void onClick(DialogInterface dialog, int which) {
           ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE);}});

       AlertDialog alert = alertBuilder.create();
       alert.show();
   } else { 
          ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE);}
    return false;} 
 else { 
     return true;
}

希望这能对你有所帮助 :)


2
看起来这只是创建一个新的对话框,当点击“是”时,将触发系统权限对话框,它不会改变Android中实际的权限对话框。与直接调用ActivityCompat.requestPermissions...没有区别。 - BabyishTank
@BabyishTank:你无法自定义系统对话框。只能创建一个带有自定义消息的自定义对话框。你可以直接调用带有系统权限的对话框。 - Anand Savjani
如果我有自定义权限而不是系统标准权限,该怎么办? - IgorGanapolsky

0

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