一开始,我写的是,点击弹出需要的权限,允许后还需要再次点击才会执行我想要的操作,测试为此提出优化,应该是“权限获得后”就会继续前面的操作,而不是用户再操作一次,以此记录一下。
怎么知道我们是允许、还是拒绝权限呢?这时候就需要onRequestPermissionsResult或onActivityResult方法。
坑:在fragment里面获取权限,不会执行fragment里onRequestPermissionsResult
解决:在fragment的主activity里面添加如下代码:
// Fragment里申请权限不回调onRequestPermissionsResult
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
// 获取到Activity下的Fragment
List<Fragment> fragments = getSupportFragmentManager().getFragments();
if (fragments == null) {
return;
}
// 查找在Fragment中onRequestPermissionsResult方法并调用
for (Fragment fragment : fragments) {
if (fragment != null) {
// 这里就会调用我们Fragment中的onRequestPermissionsResult方法
fragment.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
}
}
1.在activity/fragment里面获取权限后,自动继续之前的权限,eg:相机权限
//点击按钮时判断是否有相机权限,没有就申请(允许后执行ZM()不需要再次点击)
if (Build.VERSION.SDK_INT >= 23) {//低于23也需要判断相机是否开启,先动态申请
int checkPermission = ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.CAMERA);
if (checkPermission != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.CAMERA}, 22);//打开相机权限,requestCode=22,后面用到
} else {
ZM();//有相机权限时,执行ZM方法
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
switch (requestCode) {
case 22://对应前面的22
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {//会报数组越界,要判断好grantResults[]
ZM();//有相机权限时,执行ZM方法
} else {
//没有允许
}
break;
}
}
2. 获取GPS、蓝牙时用到的是onActivityResult
坑:在fragment里面获取,onActivityResult需要写在主activity里面
2.1 没有权限时,申请打开GPS/蓝牙
//获取GPS
Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
activity.startActivityForResult(intent, 2020);
//获取蓝牙
Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
activity.startActivityForResult(intent, 2022);
2.2 onActivityResult必须是在activity里面,如是fragment里面需要打开GPS/蓝牙,那么可以在“成功”里面写个LiveDataBus,fragment接收后继续操作
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 2020 || requestCode == 2022) {
if (resultCode == RESULT_OK) {//RESULT_OK 成功,RESULT_CANCELED 取消,
//允许之后的操作,
}
}
}