您的位置:首页 > 移动开发 > Android开发

Android6.0动态权限,你的项目关注到了吗?

2016-12-30 09:33 417 查看
一、引言

Android 6.0 变更

运行时权限

此版本引入了一种新的权限模式,如今,用户可直接在运行时管理应用权限。这种模式让用户能够更好地了解和控制权限,同时为应用开发者精简了安装和自动更新过程。用户可为所安装的各个应用分别授予或撤销权限。

对于以 Android 6.0(API 级别 23)或更高版本为目标平台的应用,请务必在运行时检查和请求权限。要确定您的应用是否已被授予权限,请调用新增的 checkSelfPermission() 方法。要请求权限,请调用新增的requestPermissions() 方法。即使您的应用并不以 Android 6.0(API 级别 23)为目标平台,您也应该在新权限模式下测试您的应用。

二、示例



说明:以访问系统日历为例,在Android6.0上申请系统权限。

三、说明

我们都知道,在Android5.0(包括5.0)以下我们的权限是在Manifest文件中申请即可。但是到了Android6.0就不是这样了。google对于权限问题要求更为严格了。将权限进行了如下划分:


正常权限和危险权限

系统权限分为几个保护级别。需要了解的两个最重要保护级别是正常权限和危险权限:

正常权限涵盖应用需要访问其沙盒外部数据或资源,但对用户隐私或其他应用操作风险很小的区域。例如,设置时区的权限就是正常权限。如果应用声明其需要正常权限,系统会自动向应用授予该权限。如需当前正常权限的完整列表,请参阅正常权限。

危险权限涵盖应用需要涉及用户隐私信息的数据或资源,或者可能对用户存储的数据或其他应用的操作产生影响的区域。例如,能够读取用户的联系人属于危险权限。如果应用声明其需要危险权限,则用户必须明确向应用授予该权限。

权限划分



四、步骤

了解完权限,开始我们上面给出效果的步骤:


1,检查权限

要检查您是否具有某项权限,请调用 ContextCompat.checkSelfPermission() 方法。

2,申请权限

如果应用尚无所需的权限,则应用必须调用一个 requestPermissions() 方法,以请求适当的权限。应用将传递其所需的权限,以及您指定用于识别此权限请求的整型请求代码。此方法异步运行:它会立即返回,并且在用户响应对话框之后,系统会使用结果调用应用的回调方法,将应用传递的相同请求代码传递到 requestPermissions()。

3,处理权限请求响应

当应用请求权限时,系统将向用户显示一个对话框。当用户响应时,系统将调用应用的 onRequestPermissionsResult() 方法,向其传递用户响应。您的应用必须替换该方法,以了解是否已获得相应权限。回调会将您传递的相同请求代码传递给 requestPermissions()。

4、注意点:不要忘了同样需要在Manifest文件中申明相关权限;代码中的Manifest是系统中的类,不是我们项目的。

完整代码如下:

package com.example.code.android60authority;

import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

/**
* Description:Android6.0动态申请权限
* <p>
* Created by code小生 on 2016/12/30.
*/

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

private Button btn1;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

initView();
}

private void initView() {
setContentView(R.layout.activity_main);
btn1 = (Button) findViewById(R.id.btn1);

btn1.setOnClickListener(this);
}

@Override
public void onClick(View view) {
int id = view.getId();
switch (id) {
case R.id.btn1:
checkperm();
break;
}
}

// 检查在日历中是否有读写权限
private void checkperm() {
/**
* 方法返回值为PackageManager.PERMISSION_DENIED
* 或者PackageManager.PERMISSION_GRANTED。
* 当返回DENIED就需要进行申请授权了
*/
int permissionCheck = ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_CALENDAR);

if (permissionCheck == PackageManager.PERMISSION_GRANTED) {
Toast.makeText(MainActivity.this, "已被授予权限,continue", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(MainActivity.this, "未权限,try request", Toast.LENGTH_SHORT).show();

if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this,
Manifest.permission.CAMERA)) {
// 在这里做需要权限的说明,根据需要来做
Toast.makeText(MainActivity.this, "需要此权限才可在6.0及以上系统拍照", Toast.LENGTH_SHORT).show();
} else {
// 申请权限
ActivityCompat.requestPermissions(MainActivity.this,
new String[]{Manifest.permission.WRITE_CALENDAR, Manifest.permission.READ_CALENDAR},
1001);
}
}
}

/**
* 申请权限回调
*
* @param requestCode
* @param permissions
* @param grantResults
*/
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults) {
switch (requestCode) {
case 1001: {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED
&& grantResults[1] == PackageManager.PERMISSION_GRANTED) {
Toast.makeText(MainActivity.this, "权限,apply sucess", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(MainActivity.this, "权限,apply fail", Toast.LENGTH_SHORT).show();
}
return;
}
}
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
}


说明:核心代码都在这里了,布局就一个Button没啥值得贴的。注释很详细。

源码已上传至github,链接在公众号,关注查看更多。



QQ交流群:481794398
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息