Android 6.0 运行时权限处理
2016-07-29 14:13
447 查看
工具类直接上:
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.provider.Settings;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
/**
* 权限获取工具类
*/
public class PermissionsRequest {
private static final int PERMISSION_REQUEST_CODE = 0;
Activity activity;
private boolean isRequireCheck = true; // 是否需要系统权限检测, 防止和系统提示框重叠
public PermissionsRequest(Activity activity) {
this.activity = activity;
}
// 判断是否缺少权限
private boolean lacksPermissions(String... permissions) {
for (String permission : permissions) {
if (ContextCompat.checkSelfPermission(activity.getApplicationContext(), permission) ==
PackageManager.PERMISSION_DENIED) {
return true;
}
}
return false;
}
public void requestPermissions(String... permissions) {
if (isRequireCheck) {
if (lacksPermissions(permissions)) {
// 请求权限兼容低版本
ActivityCompat.requestPermissions(activity, permissions, PERMISSION_REQUEST_CODE);
} else {
if (activity instanceof PermissionCallbacks) {// 全部权限都已获取
((PermissionCallbacks) activity).onPermissionsGranted();
}
}
} else {
isRequireCheck = true;
}
}
/**
* 用户权限处理,
* 如果全部获取, 则直接过.
* 如果权限缺失, 则提示Dialog.
*
* @param requestCode 请求码
* @param permissions 权限
* @param grantResults 结果
*/
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults) {
if (requestCode == PERMISSION_REQUEST_CODE && hasAllPermissionsGranted(grantResults)) {
isRequireCheck = true;
if (activity instanceof PermissionCallbacks) {
((PermissionCallbacks) activity).onPermissionsGranted();
}
} else {
isRequireCheck = false;
showMissingPermissionDialog();
}
}
// 含有全部的权限
private boolean hasAllPermissionsGranted(@NonNull int[] grantResults) {
for (int grantResult : grantResults) {
if (grantResult == PackageManager.PERMISSION_DENIED) {
return false;
}
}
return true;
}
// 显示缺失权限提示
private void showMissingPermissionDialog() {
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setTitle(R.string.help);
builder.setMessage(R.string.string_help_text);
// 拒绝, 退出应用
builder.setNegativeButton(R.string.quit, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (activity instanceof PermissionCallbacks) {
((PermissionCallbacks) activity).onPermissionsDenied();
}
}
});
builder.setPositiveButton(R.string.settings, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// 启动应用的设置
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
intent.setData(Uri.parse("package:" + activity.getPackageName()));
activity.startActivity(intent);
}
});
builder.setCancelable(false);
builder.show();
}
public interface PermissionCallbacks {
void onPermissionsGranted();
void onPermissionsDenied();
}
}
使用:
import android.Manifest;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import com.dsy.baseapplication.PermissionsRequest;
import com.dsy.baseapplication.R;
public class SplashActivity extends AppCompatActivity implements PermissionsRequest.PermissionCallbacks {
// 所需的全部权限
static final String[] PERMISSIONS = new String[]{
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_PHONE_STATE,
};
PermissionsRequest permissionsRequest;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash);
permissionsRequest = new PermissionsRequest(this);
}
@Override
protected void onResume() {
super.onResume();
permissionsRequest.requestPermissions(PERMISSIONS);
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
permissionsRequest.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
@Override
public void onPermissionsGranted() {
//有权限
}
@Override
public void onPermissionsDenied() {
//无权限
}
}
需要授权的权限组列表: 同一组的任何一个权限被授权了,其他权限也自动被授权。
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.provider.Settings;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
/**
* 权限获取工具类
*/
public class PermissionsRequest {
private static final int PERMISSION_REQUEST_CODE = 0;
Activity activity;
private boolean isRequireCheck = true; // 是否需要系统权限检测, 防止和系统提示框重叠
public PermissionsRequest(Activity activity) {
this.activity = activity;
}
// 判断是否缺少权限
private boolean lacksPermissions(String... permissions) {
for (String permission : permissions) {
if (ContextCompat.checkSelfPermission(activity.getApplicationContext(), permission) ==
PackageManager.PERMISSION_DENIED) {
return true;
}
}
return false;
}
public void requestPermissions(String... permissions) {
if (isRequireCheck) {
if (lacksPermissions(permissions)) {
// 请求权限兼容低版本
ActivityCompat.requestPermissions(activity, permissions, PERMISSION_REQUEST_CODE);
} else {
if (activity instanceof PermissionCallbacks) {// 全部权限都已获取
((PermissionCallbacks) activity).onPermissionsGranted();
}
}
} else {
isRequireCheck = true;
}
}
/**
* 用户权限处理,
* 如果全部获取, 则直接过.
* 如果权限缺失, 则提示Dialog.
*
* @param requestCode 请求码
* @param permissions 权限
* @param grantResults 结果
*/
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults) {
if (requestCode == PERMISSION_REQUEST_CODE && hasAllPermissionsGranted(grantResults)) {
isRequireCheck = true;
if (activity instanceof PermissionCallbacks) {
((PermissionCallbacks) activity).onPermissionsGranted();
}
} else {
isRequireCheck = false;
showMissingPermissionDialog();
}
}
// 含有全部的权限
private boolean hasAllPermissionsGranted(@NonNull int[] grantResults) {
for (int grantResult : grantResults) {
if (grantResult == PackageManager.PERMISSION_DENIED) {
return false;
}
}
return true;
}
// 显示缺失权限提示
private void showMissingPermissionDialog() {
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setTitle(R.string.help);
builder.setMessage(R.string.string_help_text);
// 拒绝, 退出应用
builder.setNegativeButton(R.string.quit, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (activity instanceof PermissionCallbacks) {
((PermissionCallbacks) activity).onPermissionsDenied();
}
}
});
builder.setPositiveButton(R.string.settings, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// 启动应用的设置
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
intent.setData(Uri.parse("package:" + activity.getPackageName()));
activity.startActivity(intent);
}
});
builder.setCancelable(false);
builder.show();
}
public interface PermissionCallbacks {
void onPermissionsGranted();
void onPermissionsDenied();
}
}
使用:
import android.Manifest;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import com.dsy.baseapplication.PermissionsRequest;
import com.dsy.baseapplication.R;
public class SplashActivity extends AppCompatActivity implements PermissionsRequest.PermissionCallbacks {
// 所需的全部权限
static final String[] PERMISSIONS = new String[]{
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_PHONE_STATE,
};
PermissionsRequest permissionsRequest;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash);
permissionsRequest = new PermissionsRequest(this);
}
@Override
protected void onResume() {
super.onResume();
permissionsRequest.requestPermissions(PERMISSIONS);
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
permissionsRequest.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
@Override
public void onPermissionsGranted() {
//有权限
}
@Override
public void onPermissionsDenied() {
//无权限
}
}
需要授权的权限组列表: 同一组的任何一个权限被授权了,其他权限也自动被授权。
Permission Group | Permissions |
---|---|
android.permission-group.CALENDAR | android.permission.READ_CALENDAR android.permission.WRITE_CALENDAR |
android.permission-group.CAMERA | android.permission.CAMERA |
android.permission-group.CONTACTS | android.permission.READ_CONTACTS android.permission.WRITE_CONTACTS android.permission.GET_ACCOUNTS |
android.permission-group.LOCATION | android.permission.ACCESS_FINE_LOCATION android.permission.ACCESS_COARSE_LOCATION |
android.permission-group.MICROPHONE | android.permission.RECORD_AUDIO |
android.permission-group.PHONE | android.permission.READ_PHONE_STATE android.permission.CALL_PHONE android.permission.READ_CALL_LOG android.permission.WRITE_CALL_LOG com.android.voicemail.permission.ADD_VOICEMAIL android.permission.USE_SIP android.permission.PROCESS_OUTGOING_CALLS |
android.permission-group.SENSORS | android.permission.BODY_SENSORS |
android.permission-group.SMS | android.permission.SEND_SMS android.permission.RECEIVE_SMS android.permission.READ_SMS android.permission.RECEIVE_WAP_PUSH android.permission.RECEIVE_MMS android.permission.READ_CELL_BROADCASTS |
android.permission-group.STORAGE | android.permission.READ_EXTERNAL_STORAGE android.permission.WRITE_EXTERNAL_STORAGE |
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories