描述:適配6.0以下和6.0以上動(dòng)態(tài)權(quán)限,并可以解決6.0以上個(gè)別手機(jī)點(diǎn)拒絕權(quán)限后會(huì)返回權(quán)限允許的回調(diào)的問題,例如:OnePlus3T(一加) A3010 7.1.1系統(tǒng)
以撥打電話為例:(注:直接撥打電話需要?jiǎng)討B(tài)權(quán)限判斷,喚起撥打電話界面不需要)
一.在build.gradle中添加依賴:
//RxPermissions
compile 'com.tbruyelle.rxpermissions2:rxpermissions:0.9.3@aar'
//RxJava2
implementation "io.reactivex.rxjava2:rxjava:2.0.0"
另外用到了JDK1.8的新特性,也需要在build.gradle中android節(jié)點(diǎn)下配置
android {
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
二.工具類
/**
* Created by caoshiyao on 2018/9/6.
* Android6.0權(quán)限申請工具類
*/
public class PermissionUtil {
public interface IPermissionListener {
//權(quán)限被授權(quán)
void permissionGranted();
//權(quán)限被拒絕
void permissionDenied();
}
/**
* 申請獲取相關(guān)權(quán)限
*
* @param context
* @param iPermissionListener
* @param toastDetails
* @param permissions
*/
public static void requestPermission(@NonNull Context context, @NonNull IPermissionListener iPermissionListener, @NonNull String toastDetails, @NonNull String... permissions) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
iPermissionListener.permissionGranted();
} else {
new RxPermissions((Activity) context)
.request(permissions)
.subscribe(granted -> {
if (granted) {
if (hasOpsPermission(context, permissions)) {
iPermissionListener.permissionGranted();
} else {
iPermissionListener.permissionDenied();
ToastUtil.showToast(context, toastDetails);
}
} else {
iPermissionListener.permissionDenied();
ToastUtil.showToast(context, toastDetails);
}
});
}
}
/**
* Android6.0權(quán)限申請后再判斷原生的權(quán)限是否真的被授權(quán)--適配部分國產(chǎn)機(jī)型(小米方库、華為泣港、vivo谒臼、oppo等)
*
* @param context
* @param permissions
* @return
*/
private static boolean hasOpsPermission(@NonNull Context context, @NonNull String... permissions) {
for (String permission : permissions) {
String op = AppOpsManagerCompat.permissionToOp(permission);
int result = AppOpsManagerCompat.noteProxyOp(context, op, context.getPackageName());
if (result == AppOpsManagerCompat.MODE_ALLOWED) return true;
}
return false;
}
}
三.使用方法:
/**
* 檢查權(quán)限
*/
private void checkPermission() {
PermissionUtil.requestPermission(this, new PermissionUtil.IPermissionListener() {
@Override
public void permissionGranted() {
call();
}
@Override
public void permissionDenied() {
ToastUtil.showToast(PermissionActivity.this,"權(quán)限被拒絕");
}
},"權(quán)限被拒絕,請?jiān)O(shè)置應(yīng)用權(quán)限",Manifest.permission.CALL_PHONE);
}
/**
* 撥打電話,直接撥打出去
*/
private void call() {
try {
Intent intent = new Intent(Intent.ACTION_CALL);
Uri uri = Uri.parse("tel:" + "10086");
intent.setData(uri);
startActivity(intent);
} catch (SecurityException e) {
e.printStackTrace();
}
}