Develop--Training(六)Getting Started--Working with System Permissions
2016-01-03 20:32
316 查看
2016年开始了,这是第一篇博客。本来想在1号那天写的,无奈想打金币买个猴子,导致六连跪(哔了狗了),连首胜都没拿到,现在买到了,所以博客也得补上了。
这节课将指导你对于一个App怎样申明和请求一些权限?
你的App只允许一些直接的动作。你的App不需要权限,如果它的请求是其他的App来执行询问或者提供一些信息。例如,如果你的App需要阅读用户的通讯录,这个App只需要 READ_CONTACTS 权限。但是如果你的App使用了 intent 来要求一些信息从用户联系人这个App,你的App就不需要任何的权限,但是这个用户联系人的App需要权限。关于相关的更多信息,请查看 Consider Using an Intent 。
你定义一个权限主要依赖于你有一个敏感的请求对于系统行为而言。如果这个请求不影响到用户的隐私,系统将会自动授权。如果这个请求可能会访问一些敏感的用户信息,系统就会询问用户是否会允许这个请求。关于不同种类权限的更多信息,请查看 Normal and Dangerous Permissions 。
系统权限分为两个类别:正常的和危险的。
正常的权限对于用户的隐私是没有直接风险的。如果你App的权限列表已经在 manifest 里面了,这个系统将会自动授权的。
危险的权限能够让App访问用户保密的数据。如果你App的权限列表已经在 manifest 里面了,这个系统将会自动授权的。如果有一个危险的权限列表,用户将明确的是否允许App使用它。
关于更多的信息,请查看 Normal and Dangerous Permissions 。
在所有的安卓版本上,App需要申明正常的和危险的这两个权限都需要在App 的 Manifest 里面,具体请查看 Declaring Permissions 。然而,这个对于App使用的不同SDK版本的系统,它对于这个权限的影响是不同的。
如果运行在Android 5.0 或者更低,或者App的目标版本在22或者更低的时候。你App的权限列表在 Manifest 里面,当App安装的时候,用户会允许这些请求;如果他们不允许这些权限,系统将不会完全的安装这个App。
如果运行在Android 6..0 或者更高, 或者App的目标版本在23或者更高的时候。你App的权限列表在 Manifest 里面,在App运行时,对于每一个危险的权限,都必须要声明。用户可以允许或者拒绝每一个权限,这个App能够继续运行,但是它的某个功能可能会受到限制,当用户拒绝这个权限请求的时候。
注意:在Android 6.0(API 23)开始,用户能够在任何时候移除这些权限,即使这个App的目标版本低于这个API等级。你应该测试你的App它的行为是否正确,当它的一些权限被禁止的时候,不管这个API是否吻合你App的目标等级。
检查App是否有某个权限, ContextCompat.checkSelfPermission()方法。
如果有这个权限,这个方法会返回PackageManager.PERMISSION_GRANTED,可以继续下面的操作了。
如果没有这个权限,会返回 PERMISSION_DENIED,就会明确的询问用户是否开启这个权限。
如果应用程序已请求此权限之前,用户拒绝了这一要求,该方法返回true。
如果用户拒绝了权限,选择了不要再问了许可请求的系统对话框选项,此方法将返回false。如果一个设备政策禁止从具有权限的应用程序,该方法也返回false。
注意:如果App调用requestPermissions(),系统显示一个标准对话框给用户。App不能设置或更改对话框。如果需要提供的任何资料或解释给用户,你应该做的,你打电话之前requestPermissions(),如在 解释为什么应用程序需要的权限。
当系统要求用户授权时,用户告诉系统不要求该权限再次的选择。在这种情况下,任何时候一个App使用requestPermissions(),要求该权限的话系统都会立即拒绝该请求。该系统调用你的onRequestPermissionsResult()回调方法,并传递PERMISSION_DENIED,它会在用户已经明确地再次拒绝你的要求以同样的方式。这意味着,当你调用 requestPermissions(),你不能假设与用户进行任何直接的互动已经发生。
我们也可以使用 intent 来处理一个权限,打个比方,如果你要进行拍照,我们可以通过 intent 来调用相机,这样就不需要权限了。但是缺点在于:我们不能控制用户界面,我们不能处理处理用户的各种需求。如果我们使用申请权限,就可以完全自由的控制用户界面,但是会弹出太多的权限申请框,建议以后不需要的权限就不要在写在Manifest中了,还有,在哪个地方需要用到权限的时候,在去申请,不要一股脑在App运行的时候全部申请了。
注意:只要你的安卓设备时6.0的话,都会要求权限申请的,不管你的App时 Android x.x的。
哔哔哔…程序员又得有的做了,破Google。
Working with System Permissions (系统的工作权限)
为了保护系统的完整性和用户的隐私,安卓对运行每个App都限制了访问沙盒(权限)。如果 一个App想要获取沙盒外部的用户资源和信息,这个App需要明确的权限要求。App对于权限的要求,依赖于系统自动授权,或者系统询问用户是否授权。这节课将指导你对于一个App怎样申明和请求一些权限?
Declaring Permissions (描述权限的相关知识)
每一个安卓App在运行的时候都有一些访问限制沙盒。如果App需要沙盒外部的用户资源和信息,这个App可能需要一些适当的权限,在AppManifest里通过一个列表来描述你App需要的权限。对于一些敏感的权限,系统可能会自动授权了,或者可能要经过设备上用户的授权。例如,如果你的App请求许可是打开设备上的额闪光灯,系统会自动授权的。但是如果你的App是需要阅读手机上的联系人,系统就会询问用户是否允许这个要求。用户是否自动授权,依赖于平台的版本,在当他们安装一个App的时候(Android 5.1或者更低版本)或者运行一个App(Android 6.0 或者更高版本)。Determine What Permissions Your App Needs (确定App需要哪些权限)
在你开发App的时候,你应该注意当你的App使用一个功能的时候要求哪些权限。通常,一个App在需要权限要求的时候,每当需要用户的信息和资源,但是这个App却没有创建,或者要执行一些操作却影响都啊了设备上的其他App。例如,如果一个应用需要访问网络,使用相机,或者打开关闭WiFi,这个App需要一些适当的额权限。关于系统权限列表,请查看Normal and Dangerous Permissions。你的App只允许一些直接的动作。你的App不需要权限,如果它的请求是其他的App来执行询问或者提供一些信息。例如,如果你的App需要阅读用户的通讯录,这个App只需要 READ_CONTACTS 权限。但是如果你的App使用了 intent 来要求一些信息从用户联系人这个App,你的App就不需要任何的权限,但是这个用户联系人的App需要权限。关于相关的更多信息,请查看 Consider Using an Intent 。
Add Permissions to the Manifest (添加权限到Manifest)
描述了App需要的一些权限,在 Manifest 中添加 元素,是作为 元素的子元素(就是根元素的下一层)。例如,你的App需要发送短信,在Manifest配置如下:<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.snazzyapp"> <uses-permission android:name="android.permission.SEND_SMS"/> <application ...> ... </application> </manifest>
你定义一个权限主要依赖于你有一个敏感的请求对于系统行为而言。如果这个请求不影响到用户的隐私,系统将会自动授权。如果这个请求可能会访问一些敏感的用户信息,系统就会询问用户是否会允许这个请求。关于不同种类权限的更多信息,请查看 Normal and Dangerous Permissions 。
Requesting Permissions at Run Time (运行时所需要的权限)
从Android 6.0(API 23)开始,用户自动授权是当App运行时,而不是用户安装的时候。现在的安装过程已经简化了,自从用户安装或者更新App的时候不需要自动授权,它也给了用户更多可以控制App的功能。例如,用户可以选择给一个相机App访问相机,但是不给它设备的位置。用户可以在任何时候撤销这些权限,通过进入设置界面。系统权限分为两个类别:正常的和危险的。
正常的权限对于用户的隐私是没有直接风险的。如果你App的权限列表已经在 manifest 里面了,这个系统将会自动授权的。
危险的权限能够让App访问用户保密的数据。如果你App的权限列表已经在 manifest 里面了,这个系统将会自动授权的。如果有一个危险的权限列表,用户将明确的是否允许App使用它。
关于更多的信息,请查看 Normal and Dangerous Permissions 。
在所有的安卓版本上,App需要申明正常的和危险的这两个权限都需要在App 的 Manifest 里面,具体请查看 Declaring Permissions 。然而,这个对于App使用的不同SDK版本的系统,它对于这个权限的影响是不同的。
如果运行在Android 5.0 或者更低,或者App的目标版本在22或者更低的时候。你App的权限列表在 Manifest 里面,当App安装的时候,用户会允许这些请求;如果他们不允许这些权限,系统将不会完全的安装这个App。
如果运行在Android 6..0 或者更高, 或者App的目标版本在23或者更高的时候。你App的权限列表在 Manifest 里面,在App运行时,对于每一个危险的权限,都必须要声明。用户可以允许或者拒绝每一个权限,这个App能够继续运行,但是它的某个功能可能会受到限制,当用户拒绝这个权限请求的时候。
注意:在Android 6.0(API 23)开始,用户能够在任何时候移除这些权限,即使这个App的目标版本低于这个API等级。你应该测试你的App它的行为是否正确,当它的一些权限被禁止的时候,不管这个API是否吻合你App的目标等级。
Check For Permissions (权限的检查)
如果你的App有一些危险的权限,你必须要检查你是否拥有这个权限,在任何时候你在执行这个请求的时候。用户总是可以自由的移除这个权限,甚至于用户昨天使用了相机,假设到今天就一直不能使用了。检查App是否有某个权限, ContextCompat.checkSelfPermission()方法。
// Assume thisActivity is the current activity int permissionCheck = ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.WRITE_CALENDAR);
如果有这个权限,这个方法会返回PackageManager.PERMISSION_GRANTED,可以继续下面的操作了。
如果没有这个权限,会返回 PERMISSION_DENIED,就会明确的询问用户是否开启这个权限。
Explain why the app needs permissions (解释为什么App需要一些权限)
shouldShowRequestPermissionRationale()方法如果应用程序已请求此权限之前,用户拒绝了这一要求,该方法返回true。
如果用户拒绝了权限,选择了不要再问了许可请求的系统对话框选项,此方法将返回false。如果一个设备政策禁止从具有权限的应用程序,该方法也返回false。
Request the permissions you need (请求你需要的权限)
// Here, thisActivity is the current activity if (ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) { // Should we show an explanation? if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity, Manifest.permission.READ_CONTACTS)) { // Show an expanation to the user *asynchronously* -- don't block // this thread waiting for the user's response! After the user // sees the explanation, try again to request the permission. } else { // No explanation needed, we can request the permission. ActivityCompat.requestPermissions(thisActivity, new String[]{Manifest.permission.READ_CONTACTS}, MY_PERMISSIONS_REQUEST_READ_CONTACTS); // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an // app-defined int constant. The callback method gets the // result of the request. } }
注意:如果App调用requestPermissions(),系统显示一个标准对话框给用户。App不能设置或更改对话框。如果需要提供的任何资料或解释给用户,你应该做的,你打电话之前requestPermissions(),如在 解释为什么应用程序需要的权限。
Handle the permissions request response (处理权限的请求响应)
@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. } else { // permission denied, boo! Disable the // functionality that depends on this permission. } return; } // other 'case' lines to check for other // permissions this app might request } }
当系统要求用户授权时,用户告诉系统不要求该权限再次的选择。在这种情况下,任何时候一个App使用requestPermissions(),要求该权限的话系统都会立即拒绝该请求。该系统调用你的onRequestPermissionsResult()回调方法,并传递PERMISSION_DENIED,它会在用户已经明确地再次拒绝你的要求以同样的方式。这意味着,当你调用 requestPermissions(),你不能假设与用户进行任何直接的互动已经发生。
Permissions Best Practices (权限的最好实践)
在Android 6.0开始,以后所有的权限都需要用户的确认,以前时安装的时候就确定了权限,现在改变了,只有在App运行的时候,权限才会被确认。我们需要用 requestPermissions() 方法来申请权限,它会让系统弹出一个权限的确认框。我们也可以使用 intent 来处理一个权限,打个比方,如果你要进行拍照,我们可以通过 intent 来调用相机,这样就不需要权限了。但是缺点在于:我们不能控制用户界面,我们不能处理处理用户的各种需求。如果我们使用申请权限,就可以完全自由的控制用户界面,但是会弹出太多的权限申请框,建议以后不需要的权限就不要在写在Manifest中了,还有,在哪个地方需要用到权限的时候,在去申请,不要一股脑在App运行的时候全部申请了。
注意:只要你的安卓设备时6.0的话,都会要求权限申请的,不管你的App时 Android x.x的。
哔哔哔…程序员又得有的做了,破Google。
相关文章推荐
- POJ 2135 Farm Tour && HDU 2686 Matrix && HDU 3376 Matrix Again 费用流求来回最短路
- 彻底解决INSTALL_FAILED_UPDATE_INCOMPATIBLE的安装错误
- Installation error: INSTALL_FAILED_NO_MATCHING_ABIS
- RAID原理以及分类
- org.hibernate.AssertionFailure: null id in entry (don't flush the Session after an exception occurs)
- 理解cookie的path和domain属性
- 被误传的Cookie的Domain属性
- [leetcode] 11. Container With Most Water 解题报告
- no copy constructor available or copy constructor is declared 'explicit'
- Convolutional Neural Networks at Constrained Time Cost(精读)
- 人工智能节目主持人诞生
- 散列冲突处理 http://www.nowamagic.net/academy/detail/3008050
- UVA1450-Airport
- HDU 5009 Paint Pearls (动态规划)
- 第六届福建省大学生程序设计竞赛 Problem E The Longest Straight
- traincascade与AdaBoost的opencv实现框架
- 151217MainTest主函数详细介绍
- RAID技术学习小结
- 七.OC基础加强--1.内存管理 2.野指针,内存泄露 3.set方法的内存管理 4.@property参数 5.@class和循环retain的使用 6.NSString的内存管理
- 【翻译自mos文章】在12c中Create or Truncate Table时很慢,等待事件为 DFS Lock Handle wait