您的位置:首页 > 大数据 > 人工智能

Develop--Training(六)Getting Started--Working with System Permissions

2016-01-03 20:32 316 查看
2016年开始了,这是第一篇博客。本来想在1号那天写的,无奈想打金币买个猴子,导致六连跪(哔了狗了),连首胜都没拿到,现在买到了,所以博客也得补上了。

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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: