//第一个 (第三方)方式:
//第一步 第三方库依赖:
compile 'com.lovedise:permissiongen:0.0.6'
//第二步 在Activity里使用:
private void permissiongen() {
//处理需要动态申请的权限
PermissionGen.with(MainActivity.this)
.addRequestCode(200)
.permissions(Manifest.permission.CALL_PHONE, Manifest.permission.WRITE_EXTERNAL_STORAGE,)
.request();
}
//申请权限结果的返回
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
PermissionGen.onRequestPermissionsResult(this, requestCode, permissions, grantResults);
}
//权限申请成功
@PermissionSuccess(requestCode = 200)
public void doSomething() {
//在这个方法中做一些权限申请成功的事情
Toast.makeText(this, "成功", Toast.LENGTH_SHORT).show();
}
//申请失败
@PermissionFail(requestCode = 200)
public void doFailSomething() {
Toast.makeText(this, "失败", Toast.LENGTH_SHORT).show();
}
//第二个(第三方)方式:
//第一步 第三方库依赖:
implementation 'com.github.dfqin:grantor:2.5'
//第二步 在Activity里使用:
private void permissiongen() { PermissionsUtil.requestPermission(this, new PermissionListener() { @Override public void permissionGranted(@NonNull String[] permissions) { Toast.makeText(Main4Activity.this, "访问权限", Toast.LENGTH_LONG).show(); Log.e("MainActivity","权限打开"); } @Override public void permissionDenied(@NonNull String[] permissions) { Toast.makeText(Main4Activity.this, "用户拒绝了权限", Toast.LENGTH_LONG).show(); Log.e("MainActivity","权限拒绝"); } }, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.RECORD_AUDIO}, false, null); }
//别忘了在AndroidManifest.xml也写上权限。
//第三个 动态权限封装:
//第一步首先写个接口类:PermissionInterface
public interface PermissionInterface {
/**
* 可设置请求权限请求码
*/
int getPermissionsRequestCode();
/**
* 设置需要请求的权限
*/
String[] getPermissions();
/**
* 请求权限成功回调
*/
void requestPermissionsSuccess();
/**
* 请求权限失败回调
*/
void requestPermissionsFail();
}
//第二步 写个工具类:PermissionUtil
public class PermissionUtil {
/**
* 判断是否有某个权限
* @param context
* @param permission
* @return
*/
public static boolean hasPermission(Context context, String permission){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if(context.checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED){
return false;
}
}
return true;
}
/**
* 弹出对话框请求权限
* @param activity
* @param permissions
* @param requestCode
*/
public static void requestPermissions(Activity activity, String[] permissions, int requestCode){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
activity.requestPermissions(permissions, requestCode);
}
}
/**
* 返回缺失的权限
* @param context
* @param permissions
* @return 返回缺少的权限,null 意味着没有缺少权限
*/
public static String[] getDeniedPermissions(Context context, String[] permissions){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
ArrayList<String> deniedPermissionList = new ArrayList<>();
for(String permission : permissions){
if(context.checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED){
deniedPermissionList.add(permission);
}
}
int size = deniedPermissionList.size();
if(size > 0){
return deniedPermissionList.toArray(new String[deniedPermissionList.size()]);
}
}
return null;
}
}
//第三步 写个权限操作帮助的类:PermissionHelper
public class PermissionHelper {
private Activity mActivity;
private PermissionInterface mPermissionInterface;
public PermissionHelper(@NonNull Activity activity, @NonNull PermissionInterface permissionInterface) {
mActivity = activity;
mPermissionInterface = permissionInterface;
}
/**
* 开始请求权限。
* 方法内部已经对Android M 或以上版本进行了判断,外部使用不再需要重复判断。
* 如果设备还不是M或以上版本,则也会回调到requestPermissionsSuccess方法。
*/
public void requestPermissions(){
String[] deniedPermissions = PermissionUtil.getDeniedPermissions(mActivity, mPermissionInterface.getPermissions());
if(deniedPermissions != null && deniedPermissions.length > 0){
PermissionUtil.requestPermissions(mActivity, deniedPermissions, mPermissionInterface.getPermissionsRequestCode());
}else{
mPermissionInterface.requestPermissionsSuccess();
}
}
/**
* 在Activity中的onRequestPermissionsResult中调用
* @param requestCode
* @param permissions
* @param grantResults
* @return true 代表对该requestCode感兴趣,并已经处理掉了。false 对该requestCode不感兴趣,不处理。
*/
public boolean requestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults){
if(requestCode == mPermissionInterface.getPermissionsRequestCode()){
boolean isAllGranted = true;//是否全部权限已授权
for(int result : grantResults){
if(result == PackageManager.PERMISSION_DENIED){
isAllGranted = false;
break;
}
}
if(isAllGranted){
//已全部授权
mPermissionInterface.requestPermissionsSuccess();
}else{
//权限有缺失
mPermissionInterface.requestPermissionsFail();
}
return true;
}
return false;
}
}
//第四步 在Activity里使用:
//需要在哪申请权限就在哪初始化,比如在onCreate()方法里:
//初始化并发起权限申请
mPermissionHelper = new PermissionHelper(LoginActivity.this,LoginActivity.this);
mPermissionHelper.requestPermissions();
//然后Activity实现这个接口,重写方法:
//登录页面,实现接口
public class LoginActivity extends BaseActivity implements PermissionInterface {
//重写方法:
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if(mPermissionHelper.requestPermissionsResult(requestCode, permissions, grantResults)){
//权限请求结果,并已经处理了该回调
return;
}
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
@Override
public int getPermissionsRequestCode() {
//设置权限请求requestCode,只有不跟onRequestPermissionsResult方法中的其他请求码冲突即可。
return 10000;
}
@Override
public String[] getPermissions() {
//设置该界面所需的全部权限
return new String[]{
Manifest.permission.READ_PHONE_STATE,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.RECORD_AUDIO,
Manifest.permission.CALL_PHONE,
Manifest.permission.READ_CALL_LOG,
Manifest.permission.READ_CONTACTS
};
}
@Override
public void requestPermissionsSuccess() {
//权限请求用户已经全部允许
initViews();
}
@Override
public void requestPermissionsFail() {
//权限请求不被用户允许。可以提示并退出或者提示权限的用途并重新发起权限申请。
finish();
}
private void initViews(){
//已经拥有所需权限,可以放心操作任何东西了
}
//——————————————————————–完—————————————————————————
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/118305.html