Android6.0之后,为了用户的安全,对于一些敏感的权限,不仅要在AndroidManifest文件声明这些权限,而且还要在代码中动态申请这些权限。
敏感权限:
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 class PermissionHelper {
// 默认申请权限请求码
public static final int DEFAULT_REQUEST_CODE = 888;
/**
* 申请权限
* @param activity
* @param permissions
* @param callback
*/
public static void requestPermission(Activity activity, String[] permissions, OnPermissionCallback callback) {
requestPermission(activity, DEFAULT_REQUEST_CODE, permissions, callback);
}
/**
* 申请权限
* @param activity
* @param requestCode
* @param permissions
* @param callback
*/
public static void requestPermission(Activity activity, int requestCode, String[] permissions, OnPermissionCallback callback) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
if (callback != null) {
callback.onPermissionAccept(requestCode, permissions);
}
}
String[] requestPermissions = checkPermissions(activity, permissions);
if (requestPermissions == null || requestPermissions.length == 0) {
if (callback != null) {
callback.onPermissionAccept(requestCode, permissions);
}
return;
}
ActivityCompat.requestPermissions(activity, requestPermissions, requestCode);
}
/**
* 处理申请权限结果
* @param requestCode
* @param permissions
* @param grantResults
* @param callback
*/
public static void handlePermissionResult(int requestCode, String permissions[], int[] grantResults, OnPermissionCallback callback) {
List<String> refusePermissionList = new ArrayList<>();
for (int i = 0; i < grantResults.length; i++) {
if (grantResults[i] != PackageManager.PERMISSION_GRANTED) {
refusePermissionList.add(permissions[i]);
}
}
if (refusePermissionList.size() == 0) {
if (callback != null) {
callback.onPermissionAccept(requestCode, permissions);
}
return;
}
if (callback != null) {
callback.onPermissionRefuse(requestCode, refusePermissionList.toArray(new String[refusePermissionList.size()]));
}
}
/**
* 检查权限
* @param activity
* @param permissions
* @return
*/
private static String[] checkPermissions(Activity activity, String... permissions) {
List<String> permissionList = new ArrayList<>();
for (String permission : permissions) {
if (ContextCompat.checkSelfPermission(activity, permission) != PackageManager.PERMISSION_GRANTED) {
permissionList.add(permission);
}
}
return permissionList.toArray(new String[permissionList.size()]);
}
/**
* 处理权限回调
*/
public interface OnPermissionCallback {
/**
* 接受
* @param requestCode
* @param permissions
*/
void onPermissionAccept(int requestCode, String... permissions);
/**
* 拒绝
* @param requestCode
* @param permission
*/
void onPermissionRefuse(int requestCode, String... permission);
}
}
使用实例:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
PermissionHelper.requestPermission(MainActivity.this, new String[]{Manifest.permission.CAMERA}, callback);
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
PermissionHelper.handlePermissionResult(requestCode, permissions, grantResults, callback);
}
private PermissionHelper.OnPermissionCallback callback = new PermissionHelper.OnPermissionCallback() {
@Override
public void onPermissionAccept(int requestCode, String... permissions) {
System.err.println("申请权限成功");
}
@Override
public void onPermissionRefuse(int requestCode, String... permission) {
System.err.println("申请权限失败");
}
};
}
使用起来比较简单!!
还有当用户不小心拒绝权限时,提醒用户到应用的设置页面打开权限,这里也做一下记录:
public class SettingHelper {
// 包名
private static final String SCHEME = "package";
// 调用系统InstalledAppDetails界面所需的Extra名称(用于Android 2.1及之前版本)
private static final String APP_PKG_NAME_21 = "com.android.settings.ApplicationPkgName";
// 调用系统InstalledAppDetails界面所需的Extra名称(用于Android 2.2)
private static final String APP_PKG_NAME_22 = "pkg";
// InstalledAppDetails所在包名
private static final String APP_DETAILS_PACKAGE_NAME = "com.android.settings";
// InstalledAppDetails类名
private static final String APP_DETAILS_CLASS_NAME = "com.android.settings.InstalledAppDetails";
/**
* 跳转到Setting页面
* @param activity
*/
public static void goSetting(Activity activity) {
Intent intent = new Intent();
final int apiLevel = Build.VERSION.SDK_INT;
if (apiLevel >= 9) {
// 2.3(ApiLevel 9)以上,使用SDK提供的接口
intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts(SCHEME, activity.getPackageName(), null);
intent.setData(uri);
} else {
// 2.3以下,使用非公开的接口(查看InstalledAppDetails源码)
// 2.2和2.1中,InstalledAppDetails使用的APP_PKG_NAME不同。
final String appPkgName = (apiLevel == 8 ? APP_PKG_NAME_22 : APP_PKG_NAME_21);
intent.setAction(Intent.ACTION_VIEW);
intent.setClassName(APP_DETAILS_PACKAGE_NAME, APP_DETAILS_CLASS_NAME);
intent.putExtra(appPkgName, activity.getPackageName());
}
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
activity.startActivity(intent);
}
}
最后提供下载地址:https://download.csdn.net/download/johanman/10324672