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

Android 6.0动态获取权限,根据官方总结的最简单有效解决方法

2017-06-13 17:08 701 查看
Android 6.0官方提供的正常权限和危险权限描述

系统权限分为几个保护级别。需要了解的两个最重要保护级别是正常权限和危险权限:
正常权限涵盖应用需要访问其沙盒外部数据或资源,但对用户隐私或其他应用操作风险很小的区域。例如,设置时区的权限就是正常权限。如果应用声明其需要正常权限,系统会自动向应用授予该权限。如需当前正常权限的完整列表,请参阅正常权限
危险权限涵盖应用需要涉及用户隐私信息的数据或资源,或者可能对用户存储的数据或其他应用的操作产生影响的区域。例如,能够读取用户的联系人属于危险权限。如果应用声明其需要危险权限,则用户必须明确向应用授予该权限。

权限组

所有危险的 Android 系统权限都属于权限组。如果设备运行的是 Android 6.0(API 级别 23),并且应用的
targetSdkVersion
 是
23 或更高版本,则当用户请求危险权限时系统会发生以下行为:


如果应用请求其清单中列出的危险权限,而应用目前在权限组中没有任何权限,则系统会向用户显示一个对话框,描述应用要访问的权限组。对话框不描述该组内的具体权限。例如,如果应用请求
READ_CONTACTS
 权限,系统对话框只说明该应用需要访问设备的联系信息。如果用户批准,系统将向应用授予其请求的权限。
如果应用请求其清单中列出的危险权限,而应用在同一权限组中已有另一项危险权限,则系统会立即授予该权限,而无需与用户进行任何交互。例如,如果某应用已经请求并且被授予了 
READ_CONTACTS
 权限,然后它又请求 
WRITE_CONTACTS
,系统将立即授予该权限。

任何权限都可属于一个权限组,包括正常权限和应用定义的权限。但权限组仅当权限危险时才影响用户体验。可以忽略正常权限的权限组。

如果设备运行的是 Android 5.1(API 级别 22)或更低版本,并且应用的 
targetSdkVersion
 是
22 或更低版本,则系统会在安装时要求用户授予权限。再次强调,系统只告诉用户应用需要的权限组,而不告知具体权限。

表 1. 危险权限和权限组。
权限组权限
CALENDAR   

(日历数据)
READ_CALENDAR   
             读取日程提醒

WRITE_CALENDAR 
              写入日程提醒

CAMERA     

(相机)
CAMERA                 
      拍照权限

CONTACTS   

(联系人)
READ_CONTACTS 
               读取联系人

WRITE_CONTACTS 
              写入联系人

GET_ACCOUNTS     
            访问账户Gmail列表

LOCATION   

(位置)
ACCESS_FINE_LOCATION 
        获取精确位置

ACCESS_COARSE_LOCATION 
      获取错略位置

MICROPHONE  (麦克风)
RECORD_AUDIO     
            录音

PHONE       (电话)
READ_PHONE_STATE 
            读取电话状态

CALL_PHONE 
                  拨打电话

READ_CALL_LOG 
               读取通话记录

WRITE_CALL_LOG 
              允许程序写入用户的联系人数据

ADD_VOICEMAIL 
               允许应用程序添加系统中的语音邮件

USE_SIP     
                 使用SIP视频

PROCESS_OUTGOING_CALLS 
      处理拨出电话

SENSORS    (传感器)
BODY_SENSORS     
            

SMS       

(短信)
SEND_SMS   
                  发送短信

RECEIVE_SMS 
                 接收短信

READ_SMS   
                  读取短信内容

RECEIVE_WAP_PUSH 
            接收Wap Push

RECEIVE_MMS       
           接收彩信

STORAGE    (存储)
READ_EXTERNAL_STORAGE 
         
读取SD卡文件

WRITE_EXTERNAL_STORAGE 
         写入文件到SD卡


我的获取权限方式:

public class MainActivity extends AppCompatActivity {
String[] mPermissionList = new String[]{Manifest.permission.CAMERA};

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (Build.VERSION.SDK_INT > 22) {
ActivityCompat.requestPermissions(this, mPermissionList, 0);
}
}

@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
switch (requestCode) {
case 0: {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Toast.makeText(getApplicationContext(), "同意此权限 " + grantResults[0], Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(getApplicationContext(), "拒绝此权限 " + grantResults[0] + permissions, Toast.LENGTH_SHORT).show();
showMissingPermissionDialog(permissions);
}
return;
}
}
}

/**
* 显示提示信息
*
* @param s
* @since 2.5.0
*/
public void showMissingPermissionDialog(final String[] s) {
new AlertDialog.Builder(this)
.setTitle("权限申请")
.setMessage("拒绝此权限功能将无法正常使用")
.setCancelable(false)
.setNegativeButton("退出",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//  拒绝, 退出应用
dialog.dismiss();
finish();
}
})

.setPositiveButton("去设置",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
ActivityCompat.requestPermissions(MainActivity.this, s, 0);
}
}).show();
}


获取权限官方提供:

public class MainActivity extends AppCompatActivity {
private static final int PERMISSIONS_CODE = 111; // 请求码

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/**
* 检查是否拥有某权限
*
* 如果应用具有此权限,方法将返回 PackageManager.PERMISSION_GRANTED,并且应用可以继续操作。
* 如果应用不具有此权限,方法将返回 PERMISSION_DENIED,且应用必须明确向用户要求权限。
*/
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
!= PackageManager.PERMISSION_GRANTED) {
Toast.makeText(getApplicationContext(), "没有此权限", Toast.LENGTH_SHORT).show();
/**
* 如果应用之前请求过此权限但用户拒绝了请求,此方法将返回 true。
*/
if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)) {
Toast.makeText(getApplicationContext(), "拒绝过此权限", Toast.LENGTH_SHORT).show();
// 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 {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}
, PERMISSIONS_CODE);
}
} else {
Toast.makeText(getApplicationContext(), "拥有此权限", Toast.LENGTH_SHORT).show();
}

}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == PERMISSIONS_CODE) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Toast.makeText(getApplicationContext(), "同意权限", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(getApplicationContext(), "拒绝权限", Toast.LENGTH_SHORT).show();
showMissingPermissionDialog();
}
}
}

/**
* 显示提示信息
*
* @since 2.5.0
*/
public void showMissingPermissionDialog() {
new AlertDialog.Builder(this)
.setTitle("权限申请")
.setMessage("拒绝此权限功能将无法正常使用")
.setCancelable(false)
.setNegativeButton("退出",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//  拒绝, 退出应用
dialog.dismiss();
finish();
}
})
.setPositiveButton("去授权",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CAMERA}, 0);
}
}).show();
}


就这么简单明了,弹窗自己加的,希望对大家有帮助!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息