Android permission 动态申请、授权
Android permission 新特性深度学习
本篇文章介绍android permission系统,并介绍android 6.0 permission的新特性,包括权限动态申请和授权等。
permission system
Android开发者都知道,我们开发的应用默认是没有任何权限的,我们没有办法联网,没有办法进行外部空间存储(内部空间是可以的),除非我们申请了相应的权限(permission)。
比如,我们在Manifest文件中,加入以下语句,我们就可以在我们的应用中连接到网络。
<uses-permission android:name="android.permission.INTERNET" />
那么,android为什么要这么设计呢?笔者认为,这样的设计的最大好处是,由于手机上存储了用户的大量隐秘信息,对于Android的用户来说,每次安装App时,都会提示用户该App拥有什么权限,这样用户对该App就有了大概的认识,该App可能会进行什么操作,会不会窃取我的隐私等(当然,普通的Android用户是没有这个意识的)。
Android将所有的权限分为了两种,一种是Normal,另一种是Dangerous. 关于两者,Developer是这么介绍的,
Normal permissions cover areas where your app needs to access data or resources outside the app’s sandbox, but where there’s very little risk to the user’s privacy or the operation of other apps. For example, permission to set the time zone is a normal permission. If an app declares that it needs a normal permission, the system automatically grants the permission to the app.
总的来说,normal类型的权限会泄露用户的风险会很少,所以Android会默认赋予这些权限。
Dangerous permissions cover areas where the app wants data or resources that involve the user’s private information, or could potentially affect the user’s stored data or the operation of other apps. For example, the ability to read the user’s contacts is a dangerous permission. If an app declares that it needs a dangerous permission, the user has to explicitly grant the permission to the app.
而Dangerous权限是怎样的呢?该类型的权限泄露用户隐私的风险会很大,例如,读取用户的通讯录。
关于Dangerous类的权限,Developer给出的有,
权限的赋予
上边介绍了危险权限是要用户的允许才能使用的,
before 6.0
在Android 6.0之前,这些权限的赋予是在用户安装App的时候,用户可以选择赋予该权限,然后安装App,但是如果用户不赋予的话,那么该App就无法安装,这就是所谓的All or Nothing。当然,这是原生系统的特性,据我所知,小米、魅族定制的系统已经可以动态赋予权限。
after 6.0
Android 6.0对该特性进行了修改,毕竟All or Nothing的机制存在较大的弊端,很多用户为了使用该App,就同意了所有权限,并且无法对其进行控制,这样就显得权限的作用并没有显现出来。所以Android 6.0 允许了动态赋予权限。
Developer对其的说明如下,
If the device is running Android 6.0 (API level 23) or higher, and the app’s targetSdkVersion is 23 or higher, the app requests permissions from the user at run-time. The user can revoke the permissions at any time, so the app needs to check whether it has the permissions every time it runs
如果你的设备的Android版本在6.0之上,并且App的目标sdk版本在23之上,那么用户就可以对其权限进行动态赋予。而其他情况下,用户无法动态赋予权限,还是All or Nothing。要不全部赋予,要不就不安装。
那么如何使用该新特性呢?
Check For Permissions
Develper的解释如下,
If your app needs a dangerous permission, you must check whether you have that permission every time you perform an operation that requires that permission. The user is always free to revoke the permission, so even if the app used the camera yesterday, it can’t assume it still has that permission today.
如果我们的应用包括危险权限,那么我们在每次执行对应的操作的时候,就应该检查是否被授予该权限。因为用户可以随时取消App的某个权限,所以我们应该每次都要检查用户是否赋予了该权限。否则,就会崩溃。
该函数的用法如下,
// Assume thisActivity is the current activity
int permissionCheck = ContextCompat.checkSelfPermission(thisActivity,Manifest.permission.WRITE_CALENDAR);
如果用户赋予了该权限,那么该方法会返回PackageManager.PERMISSION_GRANTED,然后我们就可以继续我们的操作;否则会返回PERMISSION_DENIED。如果返回PERMISSION_DENIED,我们就无法直接进行我们的操作,因为我们没有权限。那么应该怎么办呢?此时,我们应该显式的申请权限。
那么怎么显示的申请权限呢?这就用到下面的函数,
requestPermissions
当我们发现,我们的应用没有被授予某个权限的时候,我们就可以显示的申请。
一个例子如下,
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_CONTACTS}, MY_PERMISSIONS_REQUEST_READ_CONTACTS);
其中MY_PERMISSIONS_REQUEST_READ_CONTACTS是设置的requestCode,用来区分是申请哪个权限,该函数会弹出一个对话框,询问用户是否授权该权限,
用户可以选择授权或取消,那么我们如何知道用户的选择呢,这就要求我们重载Acitivity的一个接口,
@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
switch (requestCode) {
case MY_PERMISSIONS_REQUEST_READ_CONTACTS: {
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// permission was granted, yay! Do the
// contacts-related task you need to do.
System.out.println("User granted permission");
} else {
System.out.println("User didn't grante permission");
// permission denied, boo! Disable the
// functionality that depends on this permission.
}
return;
}
// other 'case' lines to check for other
// permissions this app might request
}
}
我们根据requestCode来区分申请的权限。当用户选择后,就会回调该接口,我们就可以知道用户的选择,进而执行下一步操作。
文中的例子,可以通过以下方式获得,
https://github.com/KingPaul/DynamicPermissionDemo
Android permission 动态申请、授权的更多相关文章
- Android之动态申请权限(API23以上需求)
API 23之前的版本都是自动获取权限,而从 Android 6.0 开始添加了权限申请的需求,更加安全. 这里以单个存储权限为例: · 在 Manifest 中添加访问权限:(只需设置可写,因为可写 ...
- android 权限动态申请
名字其实有点让人感觉高大上"权限动态申请",其实也没有什么, 以前做Android程序的时候,比如需要打开摄像头 那么需要在 然后就可以了, 但是Android6.0之后呢,有些权 ...
- Android异常:唤醒锁未授权。(Caused by: java.lang.SecurityException: Neither user 10044 nor current process has android.permission.WAKE_LOCK.)
Android异常:Caused by: java.lang.SecurityException: Neither user 10044 nor current process has android ...
- Android 动态申请权限问题【转】
Android 动态申请权限问题 感谢大佬:https://www.jianshu.com/p/2324a2bdb3d4 感谢大佬:https://blog.csdn.net/weixin_42910 ...
- android:动态申请权限(一)
环境: android版本6.0 对应SDK版本23 动态申请权限说明:所有动态申请的权限,必须在AndroidManifest.xml中进行声明 步骤 1.新建一个android工程 默认创建即可 ...
- Android 6.0 动态申请 音频+拍照+相册 权限
1.音频的权限(包括录音和播放) 1.1.首先要在清单中加上两个权限 <uses-permission android:name="android.permission.WRITE_E ...
- Android适配API23之后权限的动态申请
一.权限介绍 对于6.0以下的权限及在安装的时候,根据权限声明产生一个权限列表,用户只有在同意之后才能完成app的安装,造成了我们想要使用某个app,就要默默忍受其一些不必要的权限(比如是个app都要 ...
- Android 动态申请权限
AndroidManifest.xml(清单文件)添加需要的权限 <uses-permission android:name="android.permission.ACCESS_CO ...
- android6.0以上权限动态申请,有视频链接可以看效果。
android6.0以上某些权限需要动态申请,虽然现在大多的手机系统版本在6.0,但是升级到6.0及以上是迟早的事,所以如何能够更好的控制动态申请权限时能有好的提示用户,及给用户带去更好的体验,是需要 ...
随机推荐
- 用户之间imp的问题
今天同事说申请了一个从生产导出的dump文件,须要导入測试库进行測试. 之前做的基本都是本库导出,本库导入的操作,比如:imp test/***@test tables=tbl_fuel file=H ...
- Java中sleep()与wait()区别
学习时正好碰到这两个方法,就查阅相关资料,并通过程序实现,进行区别一下: 1.每个对象都有一个锁来控制同步访问,Synchronized关键字可以和对象的锁交互,来实现同步方法或同步块.sleep() ...
- 通过rinetd实现port转发来訪问内网的服务
一. 问题描写叙述 通过外网来訪问内网的服务 二. 环境要求 须要有一台能够外网訪问的机器做port映射.通过数据包转发来实现外部訪问阿里云的内网服务 三. 操作方法 做port映射的方案 ...
- Silverlight三维透视+倒影效果
原文:Silverlight三维透视+倒影效果 知识概要: 1.使用2D内容创建3D体验,了解图像的PlaneProjection属性,具体内容读者自己查看文档. 2.Silverlight图形图形的 ...
- 【codeforces 768C】Jon Snow and his Favourite Number
[题目链接]:http://codeforces.com/contest/768/problem/C [题意] 给你n个数字; 让你每次把这n个数字排序; 然后对奇数位的数字进行异或操作,然后对新生成 ...
- SecondaryNameNode 的作用
Secondary NameNode:它究竟有什么作用? 尽量不要将 secondarynamede 和 namenode 放在同一台机器上. 1. NameNode NameNode 主要是用来保存 ...
- Ubuntu 16.04安装MinGW32(在/etc/apt/sources.list里添加源)
Ubuntu 16.04下直接使用命令安装MinGW32: sudo apt-get install mingw32 但是,会报错: Unable to locate package mingw3 ...
- CUDA二维纹理内存+OpenCV图像滤波
CUDA和OpenCV混合编程,使用CUDA的纹理内存,实现图像的二值化以及滤波功能. #include <cuda_runtime.h> #include <highgui/hig ...
- Gram 矩阵性质及应用
v1,v2,-,vn 是内积空间的一组向量,Gram 矩阵定义为: Gij=⟨vi,vj⟩,显然其是对称矩阵. 其实对于一个XN⋅d(N 个样本,d 个属性)的样本矩阵而言,X⋅X′ 即为 Gram ...
- eclipse中让关闭的项目不再显示