在Android系统的发展历程中,Android 6.0(Marshmallow)引入了一项重大改变,即运行时权限(Runtime Permissions)管理机制。在此之前,应用程序在安装时会一次性获取所有所需权限,而在Android 6.0及以上版本,对于敏感的权限,如访问联系人、位置、相机等,应用必须在运行时请求用户的许可。这一改动提升了用户对应用权限使用的控制权,同时也给开发者带来了新的挑战。本示例"Android 6.0动态权限demo"将详细展示如何在6.0及以上版本中处理这些动态权限。 我们要了解AndroidManifest.xml文件中的权限声明发生了变化。虽然仍然需要在这里列出应用所需的权限,但不再保证安装时就能全部获取。例如,如果你的应用需要读取联系人,你需要在Manifest中声明`<uses-permission android:name="android.permission.READ_CONTACTS" />`,但实际的权限请求将在运行时进行。 接下来,我们来看动态权限请求的实现。在Android API 23及以上,我们需要使用`ContextCompat.checkSelfPermission()`来检查当前应用是否已经获得了某个权限。如果权限尚未授予,我们可以通过`ActivityCompat.requestPermissions()`发起请求。这个方法需要传递三个参数:当前活动(Activity),一个包含所需权限的字符串数组,以及一个回调接口`RequestPermissionsResultCallback`,用于处理用户给予或拒绝权限的结果。 ```java if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_CONTACTS}, MY_PERMISSIONS_REQUEST_READ_CONTACTS); } ``` 当用户做出响应后,`onRequestPermissionsResult()`方法会被调用。在这个方法里,你可以根据返回的`grantResults`数组判断用户是否授予了权限: ```java @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { switch (requestCode) { case MY_PERMISSIONS_REQUEST_READ_CONTACTS: { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // 权限已授予,执行相应的功能 } else { // 权限被拒绝,可能需要提示用户为何需要此权限或者再次请求 } return; } } } ``` 此外,为了提供更好的用户体验,开发者应该在请求权限时解释为什么应用需要这个权限,而不仅仅是简单地弹出请求框。可以使用`.shouldShowRequestPermissionRationale()`来检查是否需要向用户解释。如果用户之前已经拒绝过并选择了“不再询问”,这个方法将返回`false`,这时通常建议引导用户到应用设置中手动开启权限。 考虑到设备可能升级到Android 6.0以上版本,应用需要兼容旧版本。因此,我们需要编写条件语句来判断API级别,并针对不同版本采取不同的处理方式。 总结起来,"Android 6.0动态权限demo"主要展示了如何在Android 6.0及以上版本中适配运行时权限请求,包括检查权限状态、发起请求、处理结果回调,以及在用户体验上下文中解释权限需求。通过这个示例,开发者可以更好地理解并实现在新版本Android系统中处理权限的正确做法。
- 1
- 2
- 3
- 4
- 5
- 6
- 12
- yiyi_123_2018-02-09还可以,学习了。
- 和炳坤2017-07-25mark一下,不过应该用的到
- 雨潇轻海2018-03-23还可以,学习了
- 粉丝: 1
- 资源: 13
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- (源码)基于SimPy和贝叶斯优化的流程仿真系统.zip
- (源码)基于Java Web的个人信息管理系统.zip
- (源码)基于C++和OTL4的PostgreSQL数据库连接系统.zip
- (源码)基于ESP32和AWS IoT Core的室内温湿度监测系统.zip
- (源码)基于Arduino的I2C协议交通灯模拟系统.zip
- coco.names 文件
- (源码)基于Spring Boot和Vue的房屋租赁管理系统.zip
- (源码)基于Android的饭店点菜系统.zip
- (源码)基于Android平台的权限管理系统.zip
- (源码)基于CC++和wxWidgets框架的LEGO模型火车控制系统.zip