android mvp获取权限,Android 6.0RunTime Permission完美解决方案

在6.0中需要动态获取权限,而在动态获取权限的时候,默认提示框包含不在提示按钮,一旦用户勾选了不在提示,那么默认的系统提示框就不会再出现,因此我们需要自定义系统提示框。

在Api 23中, 权限需要动态获取, 核心权限必须满足. 标准流程:

8d752d417b3c3fc6bfb64e4fa8873bd6.png

下面我们以读取文件权限为例,演示对动态权限获取的解决方案.

1 、 权限检测工具

public class PermissionHelper {

private Context mContext;

public static final String PACKAGE = "package:";

public PermissionHelper(Context context) {

this.mContext = context;

}

/**

* 判断权限集合

*

* @param permissions 检测权限的集合

* @return 权限已全部获取返回true,未全部获取返回false

*/

public boolean checkPermissions(String... permissions) {

for (String permission : permissions) {

if (!checkPermission(permission)) {

return false;

}

}

return true;

}

/**

* 判断权限是否获取

*

* @param permission 权限名称

* @return 已授权返回true,未授权返回false

*/

public boolean checkPermission(String permission) {

return ContextCompat.checkSelfPermission(mContext, permission) == PackageManager.PERMISSION_GRANTED;

}

/**

* 获取权限

*

* @param resultCode

* @return

*/

public void permissionsCheck(String permission, int resultCode) {

// 注意这里要使用shouldShowRequestPermissionRationale而不要使用requestPermission方法

// 因为requestPermissions方法会显示不在询问按钮

if (ActivityCompat.shouldShowRequestPermissionRationale((Activity) mContext, permission)) {

//如果用户以前拒绝过改权限申请,则给用户提示

showMissingPermissionDialog();

} else {

//进行权限请求

ActivityCompat.requestPermissions((Activity) mContext,

new String[]{permission},

resultCode);

}

// ActivityCompat.requestPermissions((Activity) mContext, new String[]{permission},resultCode);

}

// 显示缺失权限提示

private void showMissingPermissionDialog() {

AlertDialog.Builder builder = new AlertDialog.Builder(mContext);

final AlertDialog alertDialog = builder.create();

builder.setMessage("当前应用缺少必要权限。\n\n请点击\"设置\"-\"权限\"-打开所需权限。\n\n最后点击两次后退按钮,即可返回。");

// 拒绝, 退出应用

builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {

@Override public void onClick(DialogInterface dialog, int which) {

alertDialog.dismiss();

}

});

builder.setPositiveButton("设置", new DialogInterface.OnClickListener() {

@Override public void onClick(DialogInterface dialog, int which) {

startAppSettings();

}

});

builder.show();

}

// 启动应用的设置

public void startAppSettings() {

Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);

intent.setData(Uri.parse( PACKAGE + mContext.getPackageName()));

mContext.startActivity(intent);

}

}

2、主界面

假设进入主界面的时候需要获取到文件访问权限,获取成功的话,进入另一个Activity,在onResume()方法中判断获取权限状态。

public class MainActivity extends AppCompatActivity {

//返回值

private static final int WRITE_RESULT_CODE = 12;

//权限名称

private static final String WRITE_PERMISSION = Manifest.permission.WRITE_EXTERNAL_STORAGE;

//权限检测类

private PermissionHelper mPermissionHelper;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

mPermissionHelper = new PermissionHelper(this);

}

@Override

protected void onResume() {

super.onResume();

//判断权限授权状态

boolean b = mPermissionHelper.checkPermission(WRITE_PERMISSION);

//如果没有获取到权限,则尝试获取权限

if (!b){

mPermissionHelper.permissionsCheck(WRITE_PERMISSION,WRITE_RESULT_CODE);

}else{

//如果请求成功,则进行相应的操作,比如我们这里打开一个新的Activity

Intent intent = new Intent(MainActivity.this,PermissionActivity.class);

startActivity(intent);

}

}

@Override

public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {

super.onRequestPermissionsResult(requestCode, permissions, grantResults);

switch(requestCode){

case WRITE_RESULT_CODE:

if (grantResults.length > 0

&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {

//如果请求成功,则进行相应的操作,比如我们这里打开一个新的Activity

Intent intent = new Intent(MainActivity.this,PermissionActivity.class);

startActivity(intent);

} else {

//如果请求失败

mPermissionHelper.startAppSettings();

}

break;

}

}

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值