android q以下的系统,按下home键(但是没有killApp),再点击图标是可以再呼出授权弹窗的。但是在android q以上,点击home键再点击app图标再打开欢迎页是不会弹窗出来。
修改为判断为Q系统或者以上结合使用系统原生授权
@Override
protected void onStart() {
super.onStart();
getPermissions();
}
private void getPermissions() {
rxPermissions = new RxPermissions(this);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
//使用原生请求权限 发送请求权限消息
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_PHONE_STATE,
Manifest.permission.ACCESS_BACKGROUND_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.BLUETOOTH_CONNECT,
Manifest.permission.BLUETOOTH_SCAN}, REQUEST_CODE);
return;
} else {
PermissionUtil.requestPermission(new PermissionUtil.RequestPermission() {
@Override
public void onRequestPermissionSuccess() {
//全部申请成功
}
@Override
public void onRequestPermissionFailure(List<String> permissions) {
permissionsResult();
}
@Override
public void onRequestPermissionFailureWithAskNeverAgain(List<String> permissions) {
permissionsResult();
}
}, rxPermissions, mPresenter.getmErrorHandler(),
Manifest.permission.READ_PHONE_STATE,
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_BACKGROUND_LOCATION);
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (null == permissions || permissions.length == 0 && null == grantResults || grantResults.length == 0) {
//权限调用失败
//未获得授权
return;
}
permissionsResult();
}
private void permissionsResult() {
boolean isPhoneState = rxPermissions.isGranted(Manifest.permission.READ_PHONE_STATE);
boolean isLocation = rxPermissions.isGranted(Manifest.permission.ACCESS_COARSE_LOCATION) ||
rxPermissions.isGranted(Manifest.permission.ACCESS_FINE_LOCATION) ||
rxPermissions.isGranted(Manifest.permission.ACCESS_BACKGROUND_LOCATION);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
boolean isBluetooth = rxPermissions.isGranted(Manifest.permission.BLUETOOTH_SCAN) ||
rxPermissions.isGranted(Manifest.permission.BLUETOOTH_CONNECT);
if (!isLocation || !isPhoneState || !isBluetooth) {
//权限调用失败
//未获得授权
}
} else {
if (!isLocation || !isPhoneState) {
//权限调用失败
//未获得授权
}
}
}
public class PermissionUtil {
public static final String TAG = "Permission";
private PermissionUtil() {
throw new IllegalStateException("you can't instantiate me!");
}
public interface RequestPermission {
/**
* 权限请求成功
*/
void onRequestPermissionSuccess();
/**
* 用户拒绝了权限请求, 权限请求失败, 但还可以继续请求该权限
*
* @param permissions 请求失败的权限名
*/
void onRequestPermissionFailure(List<String> permissions);
/**
* 用户拒绝了权限请求并且用户选择了以后不再询问, 权限请求失败, 这时将不能继续请求该权限, 需要提示用户进入设置页面打开该权限
*
* @param permissions 请求失败的权限名
*/
void onRequestPermissionFailureWithAskNeverAgain(List<String> permissions);
}
public static void requestPermission(final RequestPermission requestPermission, RxPermissions rxPermissions, RxErrorHandler errorHandler, String... permissions) {
if (permissions == null || permissions.length == 0) return;
List<String> needRequest = new ArrayList<>();
for (String permission : permissions) { //过滤调已经申请过的权限
if (!rxPermissions.isGranted(permission)) {
needRequest.add(permission);
}
}
if (needRequest.isEmpty()) {//全部权限都已经申请过,直接执行操作
requestPermission.onRequestPermissionSuccess();
} else {//没有申请过,则开始申请
rxPermissions
.requestEachCombined(needRequest.toArray(new String[needRequest.size()]))
.buffer(permissions.length)
.subscribe(new ErrorHandleSubscriber<List<Permission>>(errorHandler) {
@Override
public void onNext(@NonNull List<Permission> permissions) {
List<String> failurePermissions = new ArrayList<>();
List<String> askNeverAgainPermissions = new ArrayList<>();
for (Permission p : permissions) {
if (!p.granted) {
if (p.shouldShowRequestPermissionRationale) {
failurePermissions.add(p.name);
} else {
askNeverAgainPermissions.add(p.name);
}
}
}
if (failurePermissions.size() > 0) {
Timber.tag(TAG).d("Request permissions failure");
requestPermission.onRequestPermissionFailure(failurePermissions);
}
if (askNeverAgainPermissions.size() > 0){
Timber.tag(TAG).d("Request permissions failure with ask never again");
requestPermission.onRequestPermissionFailureWithAskNeverAgain(askNeverAgainPermissions);
}
if (failurePermissions.size() == 0 && askNeverAgainPermissions.size() == 0){
Timber.tag(TAG).d("Request permissions success");
requestPermission.onRequestPermissionSuccess();
}
}
});
}
}
/**
* 请求摄像头权限
*/
public static void launchCamera(RequestPermission requestPermission, RxPermissions rxPermissions, RxErrorHandler errorHandler) {
requestPermission(requestPermission, rxPermissions, errorHandler, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA);
}
/**
* 请求外部存储的权限
*/
public static void externalStorage(RequestPermission requestPermission, RxPermissions rxPermissions, RxErrorHandler errorHandler) {
requestPermission(requestPermission, rxPermissions, errorHandler, Manifest.permission.WRITE_EXTERNAL_STORAGE);
}
/**
* 请求发送短信权限
*/
public static void sendSms(RequestPermission requestPermission, RxPermissions rxPermissions, RxErrorHandler errorHandler) {
requestPermission(requestPermission, rxPermissions, errorHandler, Manifest.permission.SEND_SMS);
}
/**
* 请求打电话权限
*/
public static void callPhone(RequestPermission requestPermission, RxPermissions rxPermissions, RxErrorHandler errorHandler) {
requestPermission(requestPermission, rxPermissions, errorHandler, Manifest.permission.CALL_PHONE);
}
/**
* 请求获取手机状态的权限
*/
public static void readPhonestate(RequestPermission requestPermission, RxPermissions rxPermissions, RxErrorHandler errorHandler) {
requestPermission(requestPermission, rxPermissions, errorHandler, Manifest.permission.READ_PHONE_STATE);
}
}