说明
Android6.0新特性中增加了对危险权限的动态获取。如果SDK>=23的安卓系统在对危险权限操作时没有进行权限动态获取,系统将停止运行。
对任意一项危险权限的动态获取都包含权限的检查、权限获取及权限返回响应三部分,如果不进行封装,会导致代码冗余严重,不方便使用。
所以可以通过对Activity进行封装,增加对权限的动态获取即可。
危险权限
封装类代码
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import com.example.h.sdustcamp.Constans;
/**
* Created by Chook_lxk on 18/12/27
* @function Activity基类 添加6.0权限的动态获取
*/
public class BaseActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
/**
* 权限判断方法
* @param permissions
* @return
*/
public boolean hasPermission(String... permissions) {
for(String permission : permissions) {
if(ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {
return false;
}
}
return true;
}
/**
* 权限请求方法
* @param code
* @param permissions
*/
public void requestPermission(int code, String... permissions) {
ActivityCompat.requestPermissions(this, permissions, code);
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode) {
case Constans.CALENDAR_CODE:
doCalendarPermission();
break;
case Constans.CALL_PHONE_CODE:
doCallPhonePermission();
break;
case Constans.CAMERA_CODE:
doCameraPermission();
break;
case Constans.LOCATION_CODE:
doLocationPermission();
break;
case Constans.MICROPHONE_CODE:
doMicrophonePermission();
break;
case Constans.READ_EXTERNAL_CODE:
doReadExternalPermission();
break;
case Constans.SMS_CODE:
doSmsPermission();
break;
case Constans.WRITE_EXTERNAL_CODE:
doWriteExternalPermission();
break;
}
}
/**
* 默认的日历权限处理
*/
public void doCalendarPermission(){}
/**
* 默认的打电话权限处理
*/
public void doCallPhonePermission(){}
/**
* 默认的相册权限处理
*/
public void doCameraPermission(){}
/**
* 默认的位置获取权限处理
*/
public void doLocationPermission(){}
/**
* 默认的麦克风权限处理
*/
public void doMicrophonePermission(){}
/**
* 默认的读SD权限处理
*/
public void doReadExternalPermission(){}
/**
* 默认的写SD权限处理
*/
public void doWriteExternalPermission(){}
/**
* 默认的短信权限处理
*/
public void doSmsPermission(){}
}
package com.example.h.sdustcamp;
/**
* Created by Chook_lxk on 18/12/27
*
* @function 工程的全局变量
*/
public class Constans {
/**
* 权限常量相关
*/
public static final int WRITE_EXTERNAL_CODE = 0x01;
public static final int READ_EXTERNAL_CODE = 0x02;
public static final int CALL_PHONE_CODE = 0x03;
public static final int CALENDAR_CODE = 0x04;
public static final int CAMERA_CODE = 0x05;
public static final int LOCATION_CODE = 0x06;
public static final int MICROPHONE_CODE = 0x07;
public static final int SMS_CODE = 0x08;
}
使用方法
在清单中添加对应权限,然后需要获取权限的Activity类继承自BaseActivity,使用对应方法,然后复写对应do方法即可。