Android 敏感权限申请

动态权限管理是Android6.0(Build.VERSION_CODES.M = Api23)推出的,提醒用户当前APP所需要的权限,防止滥用。这些权限一般分为三种:(1)普通权限:直接manifest清单文件中写上注册就行了 (2)危险权限:需要动态申请 (3)特殊权限:此处暂不说明。

注意:这里我们就按照原生,和git上比较出名的第三方权限管理工具,EasyPermissions和RxPermissions

Android 权限管理(原生、EasyPermissions、RxPermissions)

https://www.jianshu.com/p/734ad53eb7b7

以下是EasyPermissions的代码样例:基本形成闭环,就是禁止后二次打开弹框太丑,谷歌代码的锅

package com.example.testperms;

import android.Manifest;

import android.content.DialogInterface;

import android.content.Intent;

import android.net.Uri;

import android.os.Build;

import android.provider.Settings;

import android.support.annotation.NonNull;

import android.support.v7.app.AlertDialog;

import android.support.v7.app.AppCompatActivity;

import android.os.Bundle;

import android.util.Log;

import java.util.List;

import pub.devrel.easypermissions.AfterPermissionGranted;

import pub.devrel.easypermissions.EasyPermissions;

import pub.devrel.easypermissions.PermissionRequest;

public class MainActivity extends AppCompatActivity implements EasyPermissions.PermissionCallbacks {

private String TAG = "MainActivity";

private static final int REQUEST_CODE_RUNTIME_PERMS = 0;

boolean isDenied = false;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

methodRequiresTwoPermission();

}

@AfterPermissionGranted(REQUEST_CODE_RUNTIME_PERMS)

private void methodRequiresTwoPermission() {

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {

String[] perms = {Manifest.permission.READ_EXTERNAL_STORAGE,

Manifest.permission.WRITE_EXTERNAL_STORAGE};

if (EasyPermissions.hasPermissions(this, perms)) {

// Already have permission, do the thing

// ...

} else {

// Do not have permissions, request them now

EasyPermissions.requestPermissions(this, "文件读写权限",

REQUEST_CODE_RUNTIME_PERMS, perms);

// EasyPermissions.requestPermissions(

// new PermissionRequest.Builder(this, REQUEST_CODE_RUNTIME_PERMS, perms)

// .setRationale(R.string.str_rw_perms)

// .setPositiveButtonText(R.string.rationale_ask_ok)

// .setNegativeButtonText(R.string.rationale_ask_cancel)

//// .setTheme(R.style.Theme_AppCompat)

// .build());

}

}

}

@Override

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

super.onRequestPermissionsResult(requestCode, permissions, grantResults);

// Forward results to EasyPermissions

EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);

if (requestCode == REQUEST_CODE_RUNTIME_PERMS) {

// 成功获取运行时授权

} else {

// 获取运行时权限失败

}

}

@Override

public void onPermissionsGranted(int requestCode, List perms) {

Log.d(TAG, "onPermissionsGranted:" + requestCode + ":" + perms.size());

}

@Override

public void onPermissionsDenied(int requestCode, List perms) {

// methodRequiresTwoPermission();

Log.d(TAG, "onPermissionsDenied:" + requestCode + ":" + perms.size());

// (Optional) Check whether the user denied any permissions and checked "NEVER ASK AGAIN."

// This will display a dialog directing them to enable the permission in app settings.

if (EasyPermissions.somePermissionPermanentlyDenied(this, perms)) {

new AlertDialog.Builder(this)

.setTitle("权限提示")

.setMessage("本项认证需要外置存储权限,点击确认后在新页面滑动到最下方,在权限管理处,开启外置存储权限")

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

@Override

public void onClick(DialogInterface dialog, int which) {

finish();

}

})

.setPositiveButton("确认", new DialogInterface.OnClickListener() {

@Override

public void onClick(DialogInterface dialog, int which) {

// 跳转到APP设置页面

Intent intent = new Intent();

intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);

Uri uri = Uri.fromParts("package", getPackageName(), null);

intent.setData(uri);

startActivity(intent);

}

})

.create().show();

}

}

}

查看原文