原文: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 动态申请、授权的更多相关文章

  1. Android之动态申请权限(API23以上需求)

    API 23之前的版本都是自动获取权限,而从 Android 6.0 开始添加了权限申请的需求,更加安全. 这里以单个存储权限为例: · 在 Manifest 中添加访问权限:(只需设置可写,因为可写 ...

  2. android 权限动态申请

    名字其实有点让人感觉高大上"权限动态申请",其实也没有什么, 以前做Android程序的时候,比如需要打开摄像头 那么需要在 然后就可以了, 但是Android6.0之后呢,有些权 ...

  3. 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 ...

  4. Android 动态申请权限问题【转】

    Android 动态申请权限问题 感谢大佬:https://www.jianshu.com/p/2324a2bdb3d4 感谢大佬:https://blog.csdn.net/weixin_42910 ...

  5. android:动态申请权限(一)

    环境: android版本6.0 对应SDK版本23 动态申请权限说明:所有动态申请的权限,必须在AndroidManifest.xml中进行声明 步骤 1.新建一个android工程 默认创建即可 ...

  6. Android 6.0 动态申请 音频+拍照+相册 权限

    1.音频的权限(包括录音和播放) 1.1.首先要在清单中加上两个权限 <uses-permission android:name="android.permission.WRITE_E ...

  7. Android适配API23之后权限的动态申请

    一.权限介绍 对于6.0以下的权限及在安装的时候,根据权限声明产生一个权限列表,用户只有在同意之后才能完成app的安装,造成了我们想要使用某个app,就要默默忍受其一些不必要的权限(比如是个app都要 ...

  8. Android 动态申请权限

    AndroidManifest.xml(清单文件)添加需要的权限 <uses-permission android:name="android.permission.ACCESS_CO ...

  9. android6.0以上权限动态申请,有视频链接可以看效果。

    android6.0以上某些权限需要动态申请,虽然现在大多的手机系统版本在6.0,但是升级到6.0及以上是迟早的事,所以如何能够更好的控制动态申请权限时能有好的提示用户,及给用户带去更好的体验,是需要 ...

随机推荐

  1. HDOJ 5001 Walk

    概率DP dp[j][d] 表示不经过i点走d步到j的概率, dp[j][d]=sigma ( dp[k][d-1] * Probability ) ans = sigma ( dp[j][D] ) ...

  2. [GraphQL] Use GraphQLList with GraphQLObject Types

    When working with collections of things in GraphQL, we'll always reach out for the GraphQLListType. ...

  3. php标准库中的优先队列SplPriorityQueue怎么使用?(继承)

    php标准库中的优先队列SplPriorityQueue怎么使用?(继承) 一.总结 1.new对象,然后通过insert方法和extract方法来使用,top方法也很常用. 2.类的话首先想到继承, ...

  4. CSDN code使用教程之git使用方法具体解释

          首先须要下载GITclient.http://git-scm.com/downloads. . . 然后再code.csdn.net上面创建一个项目,假设 你的项目已经存在.那么请建立项目 ...

  5. [NPM] Pass arguments to npm scripts

    Often times you’ll have variations that you’ll want to make to your npm scripts and repeating yourse ...

  6. 我的Java开发学习之旅------&gt;Java经典排序算法之归并排序

    一.归并排序 归并排序是建立在归并操作上的一种有效的排序算法,该算法是採用分治法(Divide and Conquer)的一个很典型的应用.将已有序的子序列合并,得到全然有序的序列.即先使每一个子序列 ...

  7. js进阶 9-9 html控件如何实现回车键切换焦点

    js进阶 9-9 html控件如何实现回车键切换焦点 一.总结 一句话总结:在onkeydown事件中判断event对象的键位码,然后focus事件. 二.js进阶 9-9 html控件如何实现回车键 ...

  8. 囚徒困境、价格大战与 iPhone 的价格

    静态/动态,完全/不完全: 完全信息静态博弈: 不完全信息静态博弈: 完全信息动态博弈: 不完全信息动态博弈: 囚徒困境实际上反映了一个深刻的哲学问题:个人利益与集体利益的矛盾.个人为了自己利益的最大 ...

  9. Qt单元测试工具 QTestlib(QVERIFY, QFETCH, QCOMPARE等)

    优点: QTestLib提供了单元测试框架的基本功能,并提供了针对GUI测试的扩展功能. 特性 详细描述 轻量级 QTestlib 只包含 6000行代码和 60个导出符号. 自包含 对于非GUI测 ...

  10. 过滤Filter推断用户是否登录

    WEB.XML <!-- 用户session的 键 sessionKEY --> <context-param> <param-name>userSessionKe ...