随着Android6.0的发布,也带来了一些变革,这里主要说的就是在Android6.0里面运行时权限的处理。
新博客
关于运行时权限
在旧的权限管理系统中,权限仅仅在App安装时询问用户一次,用户同意了这些权限App才能被安装(某些深度定制系统另说),App一旦安装后就可以偷偷的做一些不为人知的事情了。
在Android6.0开始,App可以直接安装,App在运行时一个一个询问用户授予权限,系统会弹出一个对话框让用户选择是否授权某个权限给App(这个Dialog不能由开发者定制),当App需要用户授予不恰当的权限的时候,用户可以拒绝,用户也可以在设置页面对每个App的权限进行管理。
特别注意
:这个对话框不是开发者调用某个权限的功能时由系统自动弹出,而是需要开发者手动调用,如果你直接调用而没有去申请权限的话,将会导致App崩溃。
需要运行时申请的权限
CALENDAR(日历)
READ_CALENDAR
WRITE_CALENDAR
CAMERA(相机)
CAMERA
CONTACTS(联系人)
READ_CONTACTS
WRITE_CONTACTS
GET_ACCOUNTS
LOCATION(位置)
ACCESS_FINE_LOCATION
ACCESS_COARSE_LOCATION
MICROPHONE(麦克风)
RECORD_AUDIO
PHONE(手机)
READ_PHONE_STATE
CALL_PHONE
READ_CALL_LOG
WRITE_CALL_LOG
ADD_VOICEMAIL
USE_SIP
PROCESS_OUTGOING_CALLS
SENSORS(传感器)
BODY_SENSORS
SMS(短信)
SEND_SMS
RECEIVE_SMS
READ_SMS
RECEIVE_WAP_PUSH
RECEIVE_MMS
STORAGE(存储卡)
READ_EXTERNAL_STORAGE
WRITE_EXTERNAL_STORAGE
具体适配操作代码:
public interface PermissionListener {
void granted();
void denied(List<String> deniedList);
}
public class BaseActivity extends Activity {
private static PermissionListener mListener;
private static Activity activity ;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
activity = this ;
}
/**
* 申请权限
*/
public static void requestRuntimePermissions(
String[] permissions, PermissionListener listener) {
mListener = listener;
List<String> permissionList = new ArrayList<>();
// 遍历每一个申请的权限,把没有通过的权限放在集合中
for (String permission : permissions) {
if (ContextCompat.checkSelfPermission(activity, permission) !=
PackageManager.PERMISSION_GRANTED) {
permissionList.add(permission);
} else {
mListener.granted();
}
}
// 申请权限
if (!permissionList.isEmpty()) {
ActivityCompat.requestPermissions(activity,
permissionList.toArray(new String[permissionList.size()]), 1);
}
}
/**
* 申请后的处理
*/
@Override
public void onRequestPermissionsResult(
int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (grantResults.length > 0) {
List<String> deniedList = new ArrayList<>();
// 遍历所有申请的权限,把被拒绝的权限放入集合
for (int i = 0; i < grantResults.length; i++) {
int grantResult = grantResults[i];
if (grantResult == PackageManager.PERMISSION_GRANTED) {
mListener.granted();
} else {
deniedList.add(permissions[i]);
}
}
if (!deniedList.isEmpty()) {
mListener.denied(deniedList);
}
}
}
}
具体使用如下:
private static String[] PERMISSIONS_STORAGE = {
"android.permission.READ_EXTERNAL_STORAGE",
"android.permission.WRITE_EXTERNAL_STORAGE",
"android.permission.ACCESS_FINE_LOCATION"};
if (Build.VERSION.SDK_INT >= 23) {//判断当前系统是不是Android6.0
requestRuntimePermissions(PERMISSIONS_STORAGE, new PermissionListener() {
@Override
public void granted() {
//权限申请通过
}
@Override
public void denied(List<String> deniedList) {
//权限申请未通过
for (String denied : deniedList) {
if (denied.equals("android.permission.ACCESS_FINE_LOCATION")) {
CustomToast.INSTANCE.showToast(SDK_WebApp.this, "定位失败,请检查是否打开定位权限!");
} else {
CustomToast.INSTANCE.showToast(SDK_WebApp.this, "没有文件读写权限,请检 查是否打开!");
}
}
}
});
}
版权声明:本文为zouzhigang96原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。