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
Log.d(TAG, "onPermissionsGranted:" + requestCode + ":" + perms.size());
}
@Override
public void onPermissionsDenied(int requestCode, List
// 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();
}
}
}
发表评论