在一个Activity中调用工具类去申请权限(注意:mReqCod和callBack最好用Map的形式装起来,key为mReqCod,value为allBack,防止两次请求的时候值被覆盖)
public class PermissionUtils {
private Activity mActivity;
private int mReqCod;
private CallBacks callBack;
//回调接口,已授权和已拒绝
public static interface CallBacks {
void grantAll();
void denied();
}
public PermissionUtils(Activity mActivity) {
this.mActivity = mActivity;
}
//权限数组: needPermissions
public void request(List<String> needPermissions, int reqCod, CallBacks callBacks) {
if (Build.VERSION.SDK_INT < 23) {
callBacks.grantAll();
return;
}
if (mActivity == null) {
throw new IllegalArgumentException("activity is null!");
}
mReqCod = reqCod;
callBack = callBacks;
//把未申请的权限放入reqPermissions
List<String> reqPermissions = new ArrayList<>();
for (String permissions : needPermissions) {
if (mActivity.checkSelfPermission(permissions) != PackageManager.PERMISSION_GRANTED) {
reqPermissions.add(permissions);
}
}
if (reqPermissions.isEmpty()) {
callBacks.grantAll();
return;
}
mActivity.requestPermissions(reqPermissions.toArray(new String[]{}), mReqCod);
}
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if (requestCode == mReqCod) {
boolean grantAll = true;
for (int i = 0; i < grantResults.length; i++) {
if (grantResults[i] != PackageManager.PERMISSION_GRANTED) {
grantAll=false;
Toast.makeText(mActivity,permissions[i]+"未授权",Toast.LENGTH_SHORT).show();
break;
}
}
if (grantAll){
callBack.grantAll();
}else {
callBack.denied();
}
}
}
}
===============================================================
public class SplashActivity extends AppCompatActivity {
private static List<String> sNeedReqPermissions = new ArrayList<>();
static {
sNeedReqPermissions.add(Manifest.permission.READ_PHONE_STATE);
sNeedReqPermissions.add(Manifest.permission.ACCESS_COARSE_LOCATION);
sNeedReqPermissions.add(Manifest.permission.ACCESS_FINE_LOCATION);
sNeedReqPermissions.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
}
private PermissionUtils utils;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash);
utils = new PermissionUtils(this);
utils.request(sNeedReqPermissions, 100, new PermissionUtils.CallBacks() {
@Override
public void grantAll() {
toMainActivity();
finish();
}
@Override
public void denied() {
finish();
}
});
}
private void toMainActivity() {
startActivity(new Intent(this,MainActivity.class));
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
utils.onRequestPermissionsResult(requestCode,permissions,grantResults);
}
}