您的位置:首页 > 移动开发 > Android开发

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() {
//无权限
}
}


需要授权的权限组列表:        同一组的任何一个权限被授权了,其他权限也自动被授权。

Permission GroupPermissions
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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android