import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Build;
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 com.mgdroid.manager.KLog;
import com.mgdroid.widget.base.Toaster;
import com.weiqitong.yiyemall.base.BaseActivity;
import java.util.ArrayList;
import java.util.List;
/**
* Created by zhangbo on 2017/7/17.
*
* @todo android6.0+(target sdk 23+)权限管理
* 涉及到用户权限的页面继承该Activity
* API是支持多项权限一起申请,但是对于用户可以逐个授权或拒绝
* 也就是需要整合申请 单一处理,这样做逻辑过于复杂且并不可靠
* 该类处理逻辑为对于一起提交的一组权限申请,全部授权才认定为成功,否则做授权失败处理,但不会重复申请用户已授权的权限
*/
public class PermissionMgrActivity extends BaseActivity {
private int PERMISSION_REQ_CODE;
private PermissionCallBack mCallBack;
/**
* 请求权限
*
* @param permissions 请求的权限
* @param requestCode 请求权限的请求码
*/
public void requestPermission(final String[] permissions, int requestCode,@NonNull PermissionCallBack cb) {
this.PERMISSION_REQ_CODE = requestCode;
this.mCallBack = cb;
if (checkPermissions(permissions)) {
KLog.d("权限已有授权=="+PERMISSION_REQ_CODE);
mCallBack.onPermissionSuccess(PERMISSION_REQ_CODE);
}
// 当用户已经拒绝过该权限时给出解释并在用户点击确认后再次申请
/*else if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)) {
new android.app.AlertDialog.Builder(this)
.setTitle("提示")
.setMessage("授权啊,再不授权打屎你~~")
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
})
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
ActivityCompat.requestPermissions(PermissionMgrActivity.this, permissions, PERMISSION_REQ_CODE);
}
}).show();
}*/else{
List<String> needPermissions = getDeniedPermissions(permissions);
ActivityCompat.requestPermissions(this, needPermissions.toArray(new String[needPermissions.size()]), PERMISSION_REQ_CODE);
}
}
/**
* 检测所有的权限是否都已授权
* @param permissions
* @return
*/
private boolean checkPermissions(String[] permissions) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { //6.0以下系统不走该权限流程
return true;
}
for (String permission : permissions) {
if (ContextCompat.checkSelfPermission(this, permission) !=PackageManager.PERMISSION_GRANTED) {
KLog.d(permission+"未授权");
return false;
}
}
return true;
}
/**
* 获取权限集中需要申请权限的列表
*
* @param permissions
* @return
*/
private List<String> getDeniedPermissions(String[] permissions) {
List<String> needRequestPermissionList = new ArrayList<>();
for (String permission : permissions) {
if (ContextCompat.checkSelfPermission(this, permission) !=
PackageManager.PERMISSION_GRANTED ||
ActivityCompat.shouldShowRequestPermissionRationale(this, permission)) {
needRequestPermissionList.add(permission);
}
}
return needRequestPermissionList;
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == PERMISSION_REQ_CODE) {
if (verifyPermissions(grantResults)) { //所申请的权限列表全部同意后才认定为授权成功
KLog.d("权限授权成功=="+PERMISSION_REQ_CODE);
mCallBack.onPermissionSuccess(PERMISSION_REQ_CODE);
} else {
KLog.d("权限授权失败=="+PERMISSION_REQ_CODE);
mCallBack.onPermissionFail(PERMISSION_REQ_CODE);
//showTipsDialog();
Toaster.show(mBaseContext,"当前应用缺少必要权限,该功能暂时无法使用");
}
}
}
/**
* 确认所有的权限是否都已授权
* @param grantResults
* @return
*/
private boolean verifyPermissions(int[] grantResults) {
for (int grantResult : grantResults) {
//KLog.d("权限授权结果==》grantResult=="+grantResult);
if (grantResult != PackageManager.PERMISSION_GRANTED) {
return false;
}
}
return true;
}
/**
* 显示提示对话框
*/
private void showTipsDialog() {
new AlertDialog.Builder(this)
.setTitle("提示信息")
.setMessage("当前应用缺少必要权限,该功能暂时无法使用。如若需要,请单击【确定】按钮前往设置中心进行权限授权。")
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
})
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
startAppSettings();
}
}).show();
}
/**
* 启动当前应用设置页面
*/
private void startAppSettings() {
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
intent.setData(Uri.parse("package:" + getPackageName()));
startActivity(intent);
}
public interface PermissionCallBack{
void onPermissionSuccess(int requestCode);
void onPermissionFail(int requestCode);
}
}
Android6.0权限管理封装
最新推荐文章于 2024-05-15 23:02:00 发布