注意:调用权限的位置一定要放在使用权限的功能之前。比如首页需要定位权限,你需要在启动页或者开始定位之前的位置,进行权限配置。
基于PermissionsDispatcher
当用户勾选不再提示并且拒绝的时候调用的方法,则引导用户去设置
package com.ycz.at_cdm_station;
import android.Manifest;
import android.annotation.SuppressLint;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.provider.Settings;
import android.util.Log;
import android.view.Window;
import android.view.WindowManager;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.core.app.ActivityCompat;
import com.alibaba.android.arouter.facade.annotation.Route;
import com.lljjcoder.style.citylist.Toast.ToastUtils;
import com.transformers.common.mvp.BaseActivity;
import com.transformers.common.provider.IMainProvider;
import com.transformers.common.util.SystemUtil;
import com.transformers.common.util.ToastUtil;
import com.transformers.common.util.log.KLogUtil;
import com.transformers.main.MainActivity;
import permissions.dispatcher.NeedsPermission;
import permissions.dispatcher.OnNeverAskAgain;
import permissions.dispatcher.OnPermissionDenied;
import permissions.dispatcher.OnShowRationale;
import permissions.dispatcher.PermissionRequest;
import permissions.dispatcher.RuntimePermissions;
/**
* author: jiaxufei(<a href="mailto:jiaxufei@danlu.com">jiaxufei@danlu.com</a>)<br>
* version: 1.0.0<br>
* since: 2020-03-27 16:54<br>
*
* <p>
* 内容描述区域
* </p>
*/
@RuntimePermissions
public class SplashActivity extends BaseActivity {
private TextView tv_phone;
//是否已经授权
private boolean isAllowPermissions = false;
@Override
public int onBindLayout() {
return R.layout.activity_main_splash;
}
@Override
public void initView() {
tv_phone = findViewById(R.id.tv_phone);
SplashActivityPermissionsDispatcher.requestPermissionWithPermissionCheck(this);
tv_phone.setOnClickListener(v -> {
//拨号方法]
if (!isAllowPermissions) {
SplashActivityPermissionsDispatcher.callPhoneWithPermissionCheck(SplashActivity.this);
} else {
callPhone();
}
});
//全屏
Window window = getWindow();
window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
startMainActivity();
}
@Override
public boolean enableToolbar() {
return false;
}
@Override
public void initData() {
}
public void startMainActivity() {
// startActivity(new Intent(this, MainActivity.class));
// finish();
}
/**
* 2,拨打电话需要CALL_PHONE权限,在对应的方法是标明
*/
@NeedsPermission(Manifest.permission.CALL_PHONE)
void callPhone() {
isAllowPermissions = true;
Intent intent = new Intent(Intent.ACTION_CALL);
Uri data = Uri.parse("tel:10086");
intent.setData(data);
startActivity(intent);
}
/**
* ,3,对需要该权限的解释
*/
@OnShowRationale(Manifest.permission.CALL_PHONE)
void showWhy(final PermissionRequest request) {
new AlertDialog.Builder(this)
.setMessage("是否授权手机权限?")
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
request.proceed();
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
request.cancel();
}
})
.show();
}
/**
* ,4,当用户拒绝获取权限的提示
*/
@OnPermissionDenied(Manifest.permission.CALL_PHONE)
void showDenied() {
Toast.makeText(SplashActivity.this, "无法获得权限", Toast.LENGTH_SHORT).show();
}
/**
* ,5,当用户勾选不再提示并且拒绝的时候调用的方法
*/
@OnNeverAskAgain(Manifest.permission.CALL_PHONE)
void showNeverAskAgain() {
new AlertDialog.Builder(this)
.setMessage("应用权限被拒绝,为了不影响您的正常使用,请在 权限 中开启对应权限?")
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//引导用户至设置页手动授权
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", SplashActivity.this.getPackageName(), null);
intent.setData(uri);
startActivity(intent);
dialog.dismiss();
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
})
.show();
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
SplashActivityPermissionsDispatcher.onRequestPermissionsResult( SplashActivity.this, requestCode, grantResults);
}
}