Android 6.0收紧了权限的控制,如果应用的targetSdkVersion>=23,那不仅仅要在清单文件中声明需要用到的权限,还需要在用户使用时让用户能同意部分权限。app权限被分为几个等级,具体的自己搜索了解下哈,这里重点在需要动态申请的权限。这些权限中被分了组,即:一旦组内某个权限被允许,该组的其他权限也是被允许的。
当然,避开这些是没问题的,将targetSdkVersion设在23以下就行了,即使在Android 6.0的手机上也是按照之前的方式处理权限:同意安装即视为同意所有权限。所以能短时间避开这种问题。
目前对于动态权限的解决方案主要是基于RxPermission的
而RxPermission基于RxJava1或者RxJava2
一:基于RxJava2实现的动态权限
1.1配置
在app的build.gradle
//Android6.0动态权限内库 https://github.com/tbruyelle/RxPermissions
implementation 'com.github.tbruyelle:rxpermissions:0.10.2'
//RxJava
implementation "io.reactivex.rxjava2:rxjava:2.2.3"
在项目下的build.gradle
allprojects {
repositories {
google()
jcenter()
maven { url 'https://jitpack.io' }
}
}
1.2动态权限工具类
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.Uri;
import android.provider.Settings;
import android.support.v4.app.FragmentActivity;
import android.support.v7.app.AlertDialog;
import com.tbruyelle.rxpermissions2.RxPermissions;
/**
* Created by Mengk on 2019/3/8
* Describe : 动态权限帮助类
*/
public class PermissionUtil {
/**
* 初始化Android6.0动态权限
* @param context
* @param tips
* @param listener
* @param permissions
*/
@SuppressLint("CheckResult")
public static void initPermission(FragmentActivity context, final String tips, final OnInitRxPermissionListener listener, String... permissions) {
RxPermissions rxPermissions = new RxPermissions(context);
rxPermissions
.request(
permissions
)
.subscribe(granted -> {
if (granted) { // Always true pre-M
listener.onSuccess();
} else {
// Oups permission denied
final AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle("提示");
builder.setMessage(tips);
builder.setCancelable(false);
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int which) {
dialogInterface.cancel();
dialogInterface.dismiss();
listener.onCancel();
Intent settingIntent = getAppDetailSettingIntent(context);
context.startActivity(settingIntent);
}
});
builder.create().show();
}
});
}
/**
* 调起系统设置界面
*
* @param context
* @return
*/
private static Intent getAppDetailSettingIntent(Activity context) {
try {
Intent localIntent = new Intent();
localIntent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", AppUtils.getPackageName(context), null);
localIntent.setData(uri);
localIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
return localIntent;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public interface OnInitRxPermissionListener {
void onSuccess();
void onCancel();
}
}
1.3 在onCreate()中调用
PermissionUtil.initPermission(this, "没有获得相关权限", new PermissionUtil.OnInitRxPermissionListener() {
@Override
public void onSuccess() {
Toast.makeText(SplashActivity.this, "允许了", Toast.LENGTH_SHORT).show();
}
@Override
public void onCancel() {
}
},
Manifest.permission.CAMERA,
Manifest.permission.CALL_PHONE);
1.4清单文件静态权限配置
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.CALL_PHONE" />
至此over
二:基于RxJava1实现的动态权限
1.1配置
在app的build.gradle下
implementation 'com.tbruyelle.rxpermissions:rxpermissions:0.9.4@aar'
1.2动态权限工具类
public class PermissionUtil {
/**
* 动态权限方法
*
* @param context
* @param tips
* @param listener
* @param permissions
*/
public static void initRxPermission(final Activity context, final String tips, final OnInitRxPermissionListener listener, String... permissions) {
RxPermissions rxPermissions = new RxPermissions(context);
rxPermissions.request(permissions)
.subscribe(new Action1<Boolean>() {
@Override
public void call(Boolean granted) {
if (granted) {
listener.onSuccess();
} else {
//不同意 给提示
final AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle("提示");
builder.setMessage(tips);
builder.setCancelable(false);
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int which) {
dialogInterface.cancel();
dialogInterface.dismiss();
listener.onCancel();
Intent settingIntent = getAppDetailSettingIntent(context);
context.startActivity(settingIntent);
}
});
builder.create().show();
}
}
});
}
/**
* 调起系统设置界面
*
* @param context
* @return
*/
private static Intent getAppDetailSettingIntent(Activity context) {
try {
Intent localIntent = new Intent();
localIntent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", AppUtils.getPackageName(context), null);
localIntent.setData(uri);
localIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
return localIntent;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public interface OnInitRxPermissionListener {
void onSuccess();
void onCancel();
}
}
1.3 在onCreate()中调用
PermissionUtil.initRxPermission(this, "没有获得相关的权限!,请在“权限管理中打开”", new PermissionUtil.OnInitRxPermissionListener() {
@Override
public void onSuccess() {
callContactUI();
}
@Override
public void onCancel() {
ToastUtils.showToast(ContactsNumActivity.this, "权限已经被拒绝!!", Toast.LENGTH_SHORT);
}
},
android.Manifest.permission.READ_CONTACTS,
android.Manifest.permission.WRITE_CONTACTS
);
1.4清单文件静态权限配置
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />







网友评论