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