6.0动态添加权限

权限组网址

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>




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值