权限组网址
http://blog.csdn.net/u013277740/article/details/51647791
请求权限的API
ContextCompat.checkSelfPermission
ActivityCompat.requestPermissions
只有当勾选了不要在询问之,这个值返回flase;
ActivityCompat.shouldShowRequestPermissionRationale
6.0动态权限代码流程(以点击相机为例)
(1)点击事件里面只检查权限,如果没有就请求权限,如果有打开相机,别的什么都不做,而且也不要加别的限制,而且是不会影响用户体验的,每次都去请求就行,即使用户勾选了不再提醒也没关系,直接请求权限就行,原因看第4条
(2)在结果会调中如果权限没有被允许,就去判断用户是否勾选了不再询问,根据
shouldShowRequestPermissionRationale的返回值判断,返回false就是勾选了
根据不同的返回值,弹不同的提示框,有两种弹窗, 解释权限弹窗和是否跳转设置页面弹窗。 其中解释权限弹窗用户点确定后就跳转到是否跳转设置页面弹窗
if(没勾选不再询问){
是否跳转设置页面的弹窗弹出 -->点击确定后-->跳转到系统设置页面
}else{
解释权限弹窗弹出 -->点击确定后 -->是否跳转设置页面的弹窗弹出- ->点击确定后-->跳转到系统设置页面
}
(3)用户从设置页面返回之后,无论是否授权返回码都不是ok,所以直接在这里面再次根据请求吗,检查对应的权限是否授权,授权就做操作,没授权就不做任何操作了
6、用户是否勾选不再询问之后,可以有很多方案去做,
1、可以是上面的方案
2、可以不管他是否勾选每次都弹出设置页面的弹窗
3、也可以只有用户没勾选的时候弹设置页面的弹窗,勾选了就不再弹任何东西,但是这样用户再点击按钮会没有任何弹窗出现,给用户的感觉是点击没反应,用户的体验也不是特别的好,其实到底如何就看产品的需求了。默认用最上面的那种就行了
4、还有一种解决方案是,
如果shouldShowRequestPermissionRationale返回true
直接解释权限弹窗弹出 -->点击确定后 -->是否跳转设置页面的弹窗弹出- ->点击确定后-->跳转到系统设置页面
如果shouldShowRequestPermissionRationale返回false
直接Toast告诉用户缺乏那些权限,因为用户可能不想再看到弹窗了,这是从产品角度考虑的。
代码如下
package com.example.permissiondemotwo;
import android.Manifest;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.provider.Settings;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
private Button open;
//相机权限
public String CAMERA_PERMISSION = Manifest.permission.CAMERA;
private static final int CAMERA_REQUEST_CODE = 100;
private static final int CAMERA_SETTING_CODE = 10;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
setonClick();
}
private void setonClick() {
open.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//检测是否有相机权限,如果有权限的话直接打开相机,没有权限去申请权限
//ContextCompat.checkSelfPermission(MainActivity.this,CAMERA_PERMISSION)返回的是个int类型的
//直接打开相机
if (ContextCompat.checkSelfPermission(MainActivity.this,CAMERA_PERMISSION) == PackageManager.PERMISSION_GRANTED){
gotoCamera();
}else {
//去申请权限
ActivityCompat.requestPermissions(MainActivity.this,new String[]{CAMERA_PERMISSION},CAMERA_REQUEST_CODE);
}
}
});
}
private void gotoCamera() {
//跳转到相机
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivity(intent);
}
private void initView() {
open = (Button) findViewById(R.id.open);
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
//如果是相机的权限请求码,就做相机的逻辑操作
case CAMERA_REQUEST_CODE:
//遍历所有的权限
for (int i = 0; i < permissions.length; i++) {
//如果是相机权限的
if (permissions[i].equalsIgnoreCase(CAMERA_PERMISSION)) {
//如果相机权限被用户同意
if (grantResults[i] == PackageManager.PERMISSION_GRANTED) {
gotoCamera();
} else {
//如果用户选择了不再提示,这个返回值是false ,, 这个返回值是true,需要我们自己提示
if (ActivityCompat.shouldShowRequestPermissionRationale(this, CAMERA_PERMISSION)) {
//用户没有勾选
showSetPermissionPathTip();
} else {
//用户勾选了不再提示
showRationalePermissionTip();
}
}
}
}
break;
}
}
//解释一下相机权限的用处
private void showRationalePermissionTip() {
new AlertDialog.Builder(this)
.setTitle("说明")
.setMessage("拍照需要相机权限是否打开")
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
showSetPermissionPathTip();
dialog.dismiss();
}
})
.setNegativeButton("取消", null)
.show();
}
//给用户一个打开权限的教程
private void showSetPermissionPathTip() {
new AlertDialog.Builder(this)
.setTitle("提示")
.setMessage("请于设置页面-permission-相机")
.setPositiveButton("立即开启", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
gotoSetting();
dialog.dismiss();
}
})
.setNegativeButton("取消", null)
.show();
}
private void gotoSetting() {
Intent intent = new Intent();
intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", getPackageName(), null);
intent.setData(uri);
startActivityForResult(intent, CAMERA_SETTING_CODE);
}
//当用户从设置页面返回应用的时候,会回调onActivityResult方法
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case CAMERA_SETTING_CODE:
//再次检查一下用户是否打开了相机权限
if (ContextCompat.checkSelfPermission(this, CAMERA_PERMISSION) == PackageManager.PERMISSION_GRANTED) {
gotoCamera();
}
break;
}
}
}
XML
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:id="@+id/open"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:textSize="40dp"
android:text="打开相机"/>
</LinearLayout>