Android M Permission处理

Android M(6.0)相比之前的版本,做了比较多的优化与改进。其中变化最大的一点是权限管理方面的改变,即不再是应用安装时授权,而改为运行时授权机制;一直以来,系统安全都是用户非常关心的问题,而之前的版本都是在安装应用时统一、强制的进行授权。一般用户在安装某个应用时,可能并不想授予应用某个权限,或是很容易忽略应用权限列表。致使很多应用肆意的申请权限,做一些不法的事情!这个问题在Android M将得到解决,它采用了运行时授权机制,在应用申请权限的时候提示用户,是否授权。提高用户对权限的认识!

对用户来说是非常有利的,但是对于开发者来说,则需要做更多的工作。

1.对于已经上线的应用

  对于这类应用(targetSdkVersion < 23),Android M 系统做了兼容性处理。这类应用仍然按照之前的权限认证机制(用户在安装的时候不得不接受所有权限,安装后app就有了那些权限)工作。但是对于这类应用,用户仍然可以在设置中对应用的权限进行管理,可以取消授权。此时,当应用使用到用户取消的权限时,仍然不会出现异常,但是却不会执行相关操作,他将什么都不干,直接null或者0,这对于未做处理的程序来说,仍然会出现异常。只有祈求用户不随便取消权限和对新版本app中拥抱新的权限机制!

2.还未上线应用

  随着Android M的发布,会陆续有很多的设备,使用新版本的系统。因此对我们来说拥抱新的权限机制是解决问题的最好办法!

  (1)设置compileSdkVersion and targetSdkVersion为 23

1 android {
2     compileSdkVersion 23
3     ...
4
5     defaultConfig {
6         targetSdkVersion 23
7         ...
8     }
9 }

  (2)同以前一样在AndroidManifest.xml添加声明权限

1     <uses-permission android:name="android.permission.BLUETOOTH" />
2     <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
3     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

  (3)权限检查,申请

 1     /**
 2      * 检查,申请权限
 3      * */
 4     private void addPremission() {
 5         // 系统版本检查
 6         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
 7             // 检查权限
 8             int permission = checkSelfPermission(Manifest.permission.WRITE_CONTACTS);
 9             // 检查权限(兼容操作,可不判断系统版本)
10             // int permission = ActivityCompat.checkSelfPermission(mContext, Manifest.permission.WRITE_CONTACTS);
11             if (permission != PackageManager.PERMISSION_GRANTED) {
12                 // if(ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.WRITE_CONTACTS)) {
13                 if (shouldShowRequestPermissionRationale(Manifest.permission.WRITE_CONTACTS)) {
14                     showMessageOKCancel("You need to allow access to Contacts",
15                             new DialogInterface.OnClickListener() {
16                                 @Override
17                                 public void onClick(DialogInterface dialog, int which) {
18                                     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
19                                         requestPermissions(new String[]{Manifest.permission.WRITE_CONTACTS},
20                                                 REQUEST_CODE_WRITE_CONTACTS_PERMISSIONS);
21                                     }
22                                 }
23                             });
24                     return;
25                 }
26                 // 申请权限
27                 // ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_CONTACTS}, REQUEST_CODE_WRITE_CONTACTS_PERMISSIONS);
28                 requestPermissions(new String[]{Manifest.permission.WRITE_CONTACTS}, REQUEST_CODE_WRITE_CONTACTS_PERMISSIONS);
29                 return;
30             }
31         }
32     }
33
34
35     /**
36      * 权限结果申请处理
37      * */
38     @Override
39     public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
40         super.onRequestPermissionsResult(requestCode, permissions, grantResults);
41         switch (requestCode) {
42             case REQUEST_CODE_WRITE_CONTACTS_PERMISSIONS:
43                 if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
44                     // Permission Granted
45                     adapter.setData(getLocalContactsInfos());
46                 } else {
47                     // Permission Denied
48                     Toast.makeText(MainActivity.this, "WRITE_CONTACTS Denied", Toast.LENGTH_SHORT)
49                             .show();
50                     this.finish();
51                 }
52                 break;
53             default:
54                 super.onRequestPermissionsResult(requestCode, permissions, grantResults);
55         }
56     }

    (4)权限使用

    检查有相关权限,或没权限申请到权限后才能执行具体操作,否则每次使用时,提醒用户授权!

    

时间: 2024-10-18 04:03:10

Android M Permission处理的相关文章

Android权限Permission详解

android.permission.EXPAND_STATUS_BAR 允许一个程序扩展收缩在状态栏,Android开发网提示应该是一个类似Windows Mobile中的托盘程序 android.permission.FACTORY_TEST 作为一个工厂测试程序,运行在root用户 android.permission.INSTALL_PACKAGES 允许一个程序安装packages android.permission.INTERNAL_SYSTEM_WINDOW 允许打开窗口使用系统

android权限permission大全

1.Android.permission.WRITE_USER_DICTIONARY允许应用程序向用户词典中写入新词 2.android.permission.WRITE_SYNC_SETTINGS写入Google在线同步设置 3.android.permission.WRITE_SOCIAL_STREAM读取用户的社交信息流 4.android.permission.WRITE_SMS允许程序写短信 5.android.permission.WRITE_SETTINGS允许程序读取或写入系统设

Android(permission)常用权限

Android应用需要在AndroidManifest.xml添加某些权限.才能调用系统功能.如应用提供震动功能.必须在配置文件中加入震动权限. 属性 说明 android.permission.ACCESS_CHECKIN_PROPERTIES 允许读写访问 "properties"表在checkin数据库中,改值可以修改上传 android.permission.ACCESS_COARSE_LOCATION 通过WiFi或移动基站的方式获取用户错略的经纬度信息,定位精度大概误差在3

Android笔记——permission权限大全

访问登记属性 android.permission.ACCESS_CHECKIN_PROPERTIES ,读取或写入登记check-in数据库属性表的权限 获取错略位置 android.permission.ACCESS_COARSE_LOCATION,通过WiFi或移动基站的方式获取用户错略的经纬度信息,定位精度大概误差在30~1500米 获取精确位置 android.permission.ACCESS_FINE_LOCATION,通过GPS芯片接收卫星的定位信息,定位精度达10米以内 访问定

[转载]Android之Permission denied (maybe missing INTERNET permission) 错误解决

异常: java.lang.SecurityException: Permission denied (missing INTERNET permission?) 解决方法: internetexceptioneclipsesocketandroid工具 这是一个经典错误, Socket不能对外连接,错误不会被报出,调试的时候,能看到Exception. 原因是: 需要访问到网络,所以,在AndroidManifest.xml中,需要进行如下配置: <manifest>   //加入以下许可

Android M Permission 学习笔记

Android应用权限简要介绍 一个Android应用默认情况下是不拥有任何权限的, 这即是说, 在默认情况下, 一个应用是没有权利去进行一些可能会造成不好影响的操作的. 这些不好的影响可能是对其它应用,操作系统,或者是用户. 如果应用需要一些额外的能力,则它需要在AndroidManifest.xml中静态地声明相应的权限. 如果应用没有在manifest中声明权限, 却使用了相应的功能, 在调用到相应功能的时候, 将会抛出异常. 比如程序要发送一个请求,却忘记加Internet权限, 那么在

android绕过permission验证及fork进程权限提升

脱壳时写patch补丁时Native代码并没有太高的权限,以至于如文件IO.网络IO等基本的C函数都无法使用,提示权限不足.在网上搜索了资料大致进行以下几种尝试: 1.APK在安装时会在/data/system/packages.xml记录当前app需要申请的权限,如下:  <package name="com.example.unpacker" codePath="/data/app/com.example.unpacker-1.apk" nativeLib

Android 权限permission

转:http://www.cnblogs.com/houfeng/archive/2011/08/22/2149309.html <uses-permission android:name="android.permission.ACCESS_CHECKIN_PROPERTIES" ></uses-permission>允许读写访问"properties"表在checkin数据库中,改值可以修改上传 <uses-permission a

android自定义permission简单实用手册

自定义permission可以提高app的安全性.通过设定permission,可以保护app免受非法授权的app的访问.比如我们在androidmanifest.xml中会注册activity/service/reciever,在intent-filter中filter我们要接收的action,如果有个不是我们知道的发送源发给我们一个匹配的action,就有可能影响到我们的app,甚至可能危害到用户. 如何使用 注册permission 在对应的activity/service和recieve