Android API 级别 >=23 中获得的权限事件处理

Permissions obtained Event Handling in Android API level >=23

我已经在运行时实现了请求权限,但我不确定何时可以调用需要权限的方法。

我无法立即调用该方法,因为用户需要时间在权限对话框中按下 "Yes" 按钮。

处理 onPermissionsObtained 事件非常有用,但我找不到任何类似的东西。

如何处理?

例如查看我的代码

private void startBuildInCameraActivity(View v) {

    if ((ContextCompat.checkSelfPermission(getActivity(), 
            Manifest.permission.CAMERA)
            != PackageManager.PERMISSION_GRANTED) ||
            (ContextCompat.checkSelfPermission(getActivity(), 
                    Manifest.permission.WRITE_EXTERNAL_STORAGE)
                    != PackageManager.PERMISSION_GRANTED)) {
        requestPermissions();


        //TODO init onPermissionObtained event handler here instead "return"
        return;
    }

    startCamera();
}

问题是如果用户没有权限,他需要调用 startBuildInCameraActivity 两次。否则 startCamera() 将永远不会被调用。

谢谢,@Drez 21。 解决方案是让 class 实现 FragmentCompat.OnRequestPermissionsResultCallback 然后:

private void startBuildInCameraActivity(View v) {

    if ((ContextCompat.checkSelfPermission(getActivity(),
            Manifest.permission.WRITE_EXTERNAL_STORAGE)
            != PackageManager.PERMISSION_GRANTED)) {
        requestPermissions();
    } else {
        startCamera();
    }
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
                                       @NonNull int[] grantResults) {

    if (grantResults.length != 1 || grantResults[0] != PackageManager.PERMISSION_GRANTED) {
        ErrorDialog.newInstance(getString(R.string.permissions_needs))
                .show(getChildFragmentManager(), FRAGMENT_DIALOG);
    } else {
        startCamera();
    }
}

This class 已经实现了这个行为 - 例如使用它。