Android 6.0权限问题之Dexter库的使用

Dexter的地址:https://github.com/Karumi/Dexter

1.build.gradle中添加

dependencies{
    compile 'com.karumi:dexter:2.2.2'
}

2.application中初始化

public MyApplication extends Application {

    @Override public void onCreate() {
        super.onCreate(); 
        Context context=getApplicationContext();
        Dexter.initialize(context);
    }
}


3.判断是否为6.0及其以上系统,是则先请求获取权限,不是则直接操作

Dexter.isRequestOngoing()   判断是否之前有权限请求的操作没被处理

Dexter.checkPermission(PermissionListener listener, String permission)   请求权限方法

PermissionListener listener为处理权限请求的回调接口,String permission为请求的权限

if(Build.VERSION.SDK_INT >= 23){
	if (Dexter.isRequestOngoing()) {
             return;
    	}
    	Dexter.checkPermission(ForumFragment.this, Manifest.permission.READ_EXTERNAL_STORAGE);
}else{
	startActivity(new Intent(getActivity(),SendPhotoActivity.class));
}

4.在需要请求权限操作的类中实现PermissionListener的接口,实现三个方法

 

用户允许权限

    @Override
    public void onPermissionGranted(PermissionGrantedResponse response) {
       
    }


用户不允许权限

    @Override
    public void onPermissionDenied(PermissionDeniedResponse response) {
        
    }
      

用户不允许权限,向用户解释权限左右

    @Override
    public void onPermissionRationaleShouldBeShown(PermissionRequest permission, PermissionToken token) {
    	
    }

完整代码:

import android.Manifest;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.v7.app.AlertDialog;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.example.administrator.myannotation.R;
import com.example.administrator.myannotation.activity.SendPhotoActivity;
import com.example.administrator.myannotation.base.BaseFragment;
import com.karumi.dexter.Dexter;
import com.karumi.dexter.PermissionToken;
import com.karumi.dexter.listener.PermissionDeniedResponse;
import com.karumi.dexter.listener.PermissionGrantedResponse;
import com.karumi.dexter.listener.PermissionRequest;
import com.karumi.dexter.listener.single.PermissionListener;

/**
 * Created by admin on 2016/6/22.
 */
public class ForumFragment extends BaseFragment implements PermissionListener{

    FloatingActionButton fab;


    public static ForumFragment getInstance(int s){
        ForumFragment fragment = new ForumFragment();
        return fragment;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_forum, container, false);
        setImmerseLayoutColor(view);
        initdata(view);
        return view;
    }

    private void initdata(View view){

        fab=(FloatingActionButton)view.findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
//                startActivity(new Intent(getActivity(),SendPhotoActivity.class));
                if(Build.VERSION.SDK_INT >= 23) {
                    //判断是否有权限请求没被处理
                    if (Dexter.isRequestOngoing()) {
                        return;
                    }
                    //请求权限
                    Dexter.checkPermission(ForumFragment.this, Manifest.permission.READ_EXTERNAL_STORAGE);
                }else{
                    startActivity(new Intent(getActivity(),SendPhotoActivity.class));
                }
            }
        });
    }

    @Override
    public void onPermissionGranted(PermissionGrantedResponse response) {
        startActivity(new Intent(getActivity(),SendPhotoActivity.class));
    }

    @Override
    public void onPermissionDenied(PermissionDeniedResponse response) {
        showDeniedDialog();
    }

    @Override
    public void onPermissionRationaleShouldBeShown(PermissionRequest permission, PermissionToken token) {
        showRationaleShouldBeShownDialog(token);
    }

    /**
     * 用户不允许权限,向用户说明权限的重要性,并支持用户去设置中开启权限
     */
    private void showDeniedDialog(){
        new AlertDialog.Builder(getActivity()).setTitle("请允许获取存储空间")
                .setMessage("无法获取此权限,不能正常工作")
                .setNegativeButton("拒绝", new DialogInterface.OnClickListener() {
                    @Override public void onClick(DialogInterface dialog, int which) {
                        dialog.dismiss();
                    }
                })
                .setPositiveButton("去设置", new DialogInterface.OnClickListener() {
                    @Override public void onClick(DialogInterface dialog, int which) {
                        Intent intent = new Intent();
                        intent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS");
                        intent.setData(Uri.parse("package:"+getActivity().getPackageName()));
                        intent.putExtra("cmp", "com.android.settings/.applications.InstalledAppDetails");
                        intent.addCategory("android.intent.category.DEFAULT");
                        getContext().startActivity(intent);
                        dialog.dismiss();
                    }
                })
                .show();
    }

    /**
     * 用户不允许权限,向用户说明权限的重要性
     * @param token
     */
    private void showRationaleShouldBeShownDialog(final PermissionToken token){
        new AlertDialog.Builder(getActivity()).setTitle("提示")
                .setMessage("获取相册需要存储空间的权限,不开启将无法正常工作!")
                .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                    @Override public void onClick(DialogInterface dialog, int which) {
                        dialog.dismiss();
                        token.cancelPermissionRequest();
                    }
                })
                .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                    @Override public void onClick(DialogInterface dialog, int which) {
                        dialog.dismiss();
                        token.continuePermissionRequest();
                    }
                })
                .setOnDismissListener(new DialogInterface.OnDismissListener() {
                    @Override public void onDismiss(DialogInterface dialog) {
                        token.cancelPermissionRequest();
                    }
                })
                .show();
    }
} }

在小米6.0上测试结果:

请求权限时,弹出系统的请求权限dialog

1.用户允许,进入方法onPermissionGranted()

2.用户不允许,进入方法onPermissionDenied()

   用户->拒绝,下次请求权限时直接进入方法onPermissionDenied()

   用户->去设置,进入该应用的应用信息,用户自己开启权限

3.用户允许,之后去应用信息中关闭权限,下次请求权限时进入方法onPermissionRationaleShouldBeShown()

   用户->确定,弹出系统的请求权限dialog

   用户->取消,进入方法onPermissionDenied()



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值