今天我在写百度地图 API 定位功能的时候遇到了这样一个问题,需要在打开 APP 首页的时候动态获取定位权限,然后我的代码是这样写的(在 Fragment 中)
@Nullable
public View onCreateView(@NonNull LayoutInflater inflater,
@Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
view = inflater.inflate(R.layout.fragment_home,container,false);
Request();
return view;
}
void Request() { // 动态获取权限方法
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (ContextCompat.checkSelfPermission(getContext(),Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, 200); // 200 是回调识别码
}else {
//开始定位
initLocation();
}
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode){
case 200: // 刚才的识别码
if(grantResults[0] == PackageManager.PERMISSION_GRANTED){ // 用户同意权限,执行我们的操作
initLocation(); // 开始定位
}else{ // 用户拒绝之后,当然我们也可以弹出一个窗口,直接跳转到系统设置页面
Toast.makeText(getActivity(),"未开启定位权限,请手动到设置去开启权限",Toast.LENGTH_LONG).show();
}
break;
default:break;
}
}
然而 onRequestPermissionsResult 方法并没有回调,没有回调的话,我就不能执行定位方法,原因是
在Fragment中我们不能通过ActivityCompat.requestPermissions去请求,因为这样请求Fragment不能收到onRequestPermissionsResult。所以我们应该直接用XXXFragment.this.requestPermissions去请求权限
如果你写了 ActivityCompat.requestPermissions 那么你的回调方法就要写到 Activity 中,我自己不信,就把 onRequestPermissionsResult 放到了 fragment 的父 Activity 中,果然,在 Activity 中回调了。
多谢博主指点:https://blog.csdn.net/z302766296/article/details/73549807