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()



  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据引用\[1\]和引用\[2\]的内容,你提到使用AxInterop.NCTAUDIOEDITOR2Lib.dll和Interop.NCTAUDIOEDITOR2Lib.dll编写一个音频查看插件时遇到了问题。经过排查,发现缺少相关的动态依赖,并且这些依赖还未注册。为了解决这个问题,你可以按照以下步骤进行操作: 1. 首先,下载缺少的动态。你可以通过百度网盘链接和提取码8phf来获取这些文件。 2. 然后,以管理员身份运行cmd.exe命令行工具。 3. 在命令行中,使用cd命令将当前目录定位到你下载的文件所在的目录。例如,如果你的文件下载目录是C:\Users\Dexter\Desktop\NCTAUDIOEDITOR2Lib缺失动态,可以使用以下命令进行定位: ``` cd C:\Users\Dexter\Desktop\NCTAUDIOEDITOR2Lib缺失动态 ``` 4. 最后,运行注册动态.bat文件。这个批处理文件会自动执行注册指令,将缺少的动态注册到系统中。 请注意,以上步骤是基于Windows操作系统的。如果你使用的是其他操作系统,请根据相应的命令行工具和操作方式进行相应的调整。 #### 引用[.reference_title] - *1* *2* [AxInterop.NCTAUDIOEDITOR2Lib.dll,Interop.NCTAUD没有注册类 (异常来自 HRESULT:0x80040154 (REGDB_E_...](https://blog.csdn.net/qq_37959253/article/details/123069103)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值