Android 6.0+:方法onRequestPermissionsResult没有调用

时间:2017-11-09 11:51:46

标签: android

这是我的地图片段:

public class MapFragmentTab extends Fragment implements OnMapReadyCallback {
    private GoogleMap googleMap;
    private GoogleApiClient mGoogleApiClient;
    private static final int MY_PERMISSION_LOCATION = 1;   

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        rootView = inflater.inflate(R.layout.map_fragment_tab, container, false);
        init();
        return rootView;
    }

    private void init() {
        if (mGoogleApiClient == null) {
            mGoogleApiClient = new GoogleApiClient.Builder(getActivity())
                    .addApi(LocationServices.API)
                    .build();
        }
    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) 
        mapView = rootView.findViewById(R.id.mapView);
        if (mapView != null) {
            mapView.onCreate(null);
            mapView.onResume();
            mapView.getMapAsync(this);
        }
    }

    @Override
    public void onMapReady(GoogleMap map) {
        googleMap = map;       
        int permissionCheck = ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION);
        if (permissionCheck != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, MY_PERMISSION_LOCATION);
        } else {                
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
         // some code here
        }
    }          

Android 4.3 上一切正常。

但是,当我第一次在 Android 6.0 + 上开始时,请显示提示对话框以获取权限。像这样:

Allow My application to access this device's location?

Deny Allow

我点击允许,但方法onRequestPermissionsResult未调用。 我的代码出了什么问题?

2 个答案:

答案 0 :(得分:1)

而不是打电话

ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, MY_PERMISSION_LOCATION)

像这样打电话

requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, MY_PERMISSION_LOCATION, PERMISSIONS_CODE)

当您使用android.support.v4.app.Fragment时,您必须致电requestPermissions

AppCompatActivity时,您应该使用ActivityCompat.requestPermissions;

答案 1 :(得分:0)

不会在片段中触发权限结果回调。为此,您应该在活动中实现 onRequestPermissionsResult 并将回调转移到片段。

@Override
 public void onRequestPermissionsResult(int requestCode, @NonNull String[] 
permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
List<Fragment> fragments = getSupportFragmentManager().getFragments();
if (fragments != null) {
    for (Fragment fragment : fragments) {
        fragment.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }
}
 }