targetSdkVersion 23以下6.0中调用requestPermissions()的问题

targetSdkVersion 23以下6.0中调用requestPermissions()的问题

targetSdkVersion如果是23以下,调用ActivityCompat.requestPermissions(),会弹出权限选择对话框,但是选择拒绝授权,onRequestPermissionsResult中的返回值却是PERMISSION_GRANTED,但选择同意授权,会把应用关闭重新开启当前activity,而不会调用onRequestPermissionsResult中的方法,所以不要在targetSdkVersion设置为23以下,又把complierSdkversion设置为23,这样会出现上述的问题。最好的方式是把targetSdkVersion也设置为23,就可以解决。一切完美运行。

下面是一些对应的解答:


The following are the Marshmallow permissions features every developer should keep in mind.

  1. As you may already know, all permissions are divided into two categories: normal and dangerous. Android 5.1 and older versions display dangerous permissions during installation. If a user denies them an application will not be installed at all. Starting from Android 6.0 dangerous permissions are divided into subcategories (see below), that should be separately confirmed by a user while using an app. You should remember though that if one permission from a group has been accepted, you will not be asked for additional confirmation of further ones that belong to it too.

image

  1. If you specify targetSdkVersion = 22 and lower in the build.gradle file while building-up an app, you will see a usual permission confirmation dialog during its installation from the Play Store to a device running Marshmallow. All permission groups will be turned on in settings after installation. If you try to turn off the app access to one of the needed permissions, the following dialog will be displayed:

image

  1. In case build.gradle targetSdkVersion = 23, you will need to add an access request to necessary permissions and user response processing. Let’s dig deeper into details here.

If you need access to the elements that require permissions, always check it with the help of the method:

ContextCompat.checkSelfPermission(activity,Manifest.permission.< verifiable_permission >

It is strongly recommended to use the ContextCompat class method  from the support-v4 library for verification, as Context.checkSelfPermission is available starting from Android 6.0 only and will cause crashes in the previous OS versions.

If this method returns the value PackageManager.PERMISSION_GRANTED, it means the permission has been confirmed and can be used now.

Otherwise, you need to request permission from a user. To do this, call the ActivityCompat.requestPermissions method and transfer the reference to Activity, the string array of necessary permissions and the request code as settings. If there have been no access requests to the needed permissions before, you will see a standard dialog that cannot be customized:

image

There is an onRequestPermissionsResult method added in Android 6.0 to process the call results. It works when a user pushes Deny or Allow buttons.

If a user presses Allow, access is confirmed and the app can go on running. No surprise about that. But what if not? In this case, further calls of ActivityCompat.requestPermissions will not display the dialog. Instead of this a developer is recommended to show a dialog with descriptions why the app needs the requested permissions. Use the ActivityCompat.shouldShowRequestPermissionRationale method and transfer the reference to Activity and permission there to check if the description is to be shown. If the method returns true, display the description and ask for access permission from a user again. This time the dialog will look different:

image

If a user presses Deny in this dialog and chooses Never ask again, all further calls of ActivityCompat.shouldShowRequestPermissionRationale will return false, and the ActivityCompat.requestPermissions call will not display the permission dialog. PERMISSION_DENIED will immediately return to onRequestPermissionResult instead.

There is a possibility to request a few permissions at a time, but official guidelines do not recommend to do that, except the case when a few permissions are required to appear on the same screen simultaneously.

As stated above, the ActivityCompat.requestPermissions method accepts the reference to Activity and the string array of necessary permissions as input parameters. You can indicate a few needed permissions in this string array and thus a user will see a separate dialog for each of them.

image

image

As a result, access parameters for each requested permission will be transferred to the onRequestPermissionsResult method.

This all is actually one more additional task to include into the general scope of application development activities but such individual permissions are more secure. Android gives its users the possibility to control and personalize the OS on their devices so don’t forget about that when creating apps for its Marshmallow and up versions.


转载于:https://my.oschina.net/u/990728/blog/550693

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/109194.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • C#的Button.DialogResult属性[通俗易懂]

    C#的Button.DialogResult属性[通俗易懂]如果此属性的DialogResult不是设置为None,并且父窗体是通过ShowDialog方法显示的,则不必挂钩任何事件,单击按钮也可关闭父窗体。然后,该窗体的DialogResult属性将设置为该按钮被单击时的DialogResult。例如,若要创建一个“是/否/取消”对话框,只需添加三个按钮并将其DialogResult属性分别设置为Yes、No和Cancel即可。…

    2022年6月22日
    21
  • 散列的基本概念

    散列的基本概念散列的基本概念什么是散列?为什么需要散列?散列是一种思想。与已经学过的其他数据结构相比较,向量是采用循秩访问(callbyrank)的访问方式,列表是采用循位置访问(callbyposition)的访问方式,二叉搜索树是采用循关键码访问(callbykey)的访问方式,散列与他们都不一样,是采用循值访问(callbyvalue)的访问方式。举个例子,你现在身处同济大学嘉定…

    2022年5月15日
    37
  • linux通配符主要有_linux通配符和正则表达式

    linux通配符主要有_linux通配符和正则表达式首先,通配符是shell提供的一种路劲扩展功能。在linux的shell中,要区分通配符和正则表达式的区别。简单理解,通配符是用来匹配文件名的。而正则表达式是用来匹首先,通配符是shell提供的一种路劲扩展功能。在linux的shell中,要区分通配符和正则表达式的区别。简单理解,通配符是用来匹配文件名的。而正则表达式是用来匹配文件内容的。了解通配符,首先,需要熟记通配符中的元字符:*:表示匹配任…

    2022年9月18日
    0
  • Selenium Grid 安装

    Selenium Grid 安装

    2022年3月4日
    43
  • git clone指定分支

    git clone指定分支技术背景Git是代码版本最常用的管理工具,此前也写过一篇介绍Git的基本使用的博客,而本文介绍一个可能在特定场景下能够用到的功能–直接拉取指定分支的内容。GitClone首先看一下如果我们按照常规的操作去拉取一个Gitee的代码仓,是什么样的效果:$gitclonehttps://gitee.com/mindspore/mindscience.git正克隆到’mindsci…

    2022年7月21日
    23
  • 简单描述时间轮_rocketmq 时间轮

    简单描述时间轮_rocketmq 时间轮时间轮作用也是用来作定时器触发任务,只是他更高效,时间复杂度为O(1)。运行原理为了方便理解我们参考钟表的形式,它分为3个层次:时、分、秒,只有秒钟在运动同样的,时间轮也分为多层,同样的只有第一层在运动,举个简单的4层时间轮例子(如下左图),我们假设最小计时单位为1(姑且理解为秒),用time来计时,初始为0,随着time递增,则:我们可以知道time应该落在第一层的位置intfirst_index=time%5当first_index==0,也就是第一层轮巡完毕,就需要将

    2022年9月30日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号