如何获取fragment中activity的权限结果?

How to get permission result from activity in fragment?

我有 MapFragment,我在 onViewCreated:

检查权限
  if (uiCommunicationListener.isLocationPermissionGranted()) {
        permission_button.visibility = View.GONE
        val mapFragment =
            childFragmentManager.findFragmentById(R.id.map) as SupportMapFragment?
        mapFragment?.getMapAsync(callback)
    } else {
        //Hide Map
    }

uiCommunicationListener是负责fragments-activity通信的接口。

isLocationPermissionGranted 位于 MainActivity,看起来像这样:

override fun isLocationPermissionGranted(): Boolean {
    if (ContextCompat.checkSelfPermission(
            this,
            android.Manifest.permission.ACCESS_FINE_LOCATION
        ) != PackageManager.PERMISSION_GRANTED) {
        //  Ask for permission
        ActivityCompat.requestPermissions(
            this,
            arrayOf(android.Manifest.permission.ACCESS_FINE_LOCATION),
            Constants.LOCATION_PREMMISION_CODE
        )
        return false
    } else {
        // Permission has already been granted
        return true
    }

基本上它正在检查是否授予权限,如果是 return true,如果不是请求权限和 return false。

问题是在我们向他请求权限后,我无法根据用户操作进行操作。

在我的例子中,我正在检查是否已授予权限,如果没有隐藏地图,则显示地图。

但是如果它 return 为 false,在弹出请求权限对话框并且用户授予我们权限之后,什么也没有发生,因为我们已经“通过”了 if 检查

现在通常在 onRequestPermissionsResult 方法中我可以根据用户操作进行操作(授予我们 permssion/Deny 请求)但是这里这个方法位于 MainActivity 中,我无法访问请求代码、授权结果等

如何根据请求权限对话框的结果在片段中进行操作?

片段 class 本身有 requestPermissionsonRequestPermissionsResult methods/functions。您可以根据自己的原因使用它。

Fragment.requestPermissions

Fragment.onRequestPermissionsResult

private void showContacts() {
     if (getActivity().checkSelfPermission(Manifest.permission.READ_CONTACTS)
             != PackageManager.PERMISSION_GRANTED) {
         requestPermissions(new String[]{Manifest.permission.READ_CONTACTS},
                 PERMISSIONS_REQUEST_READ_CONTACTS);
     } else {
         doShowContacts();
     }
 }

 @Override
 public void onRequestPermissionsResult(int requestCode, String[] permissions,
         int[] grantResults) {
     if (requestCode == PERMISSIONS_REQUEST_READ_CONTACTS
             && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
         doShowContacts();
     }
 }
  1. 你在 Fragment 中也有 onRequestPermissionsResult

  2. 如果您仍然希望 onRequestPermissionsResult 集中在您的 Activity 中,您需要调用 Fragment onRequestPermissionsResult 的方法 Activity

    @Override
     public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
         switch (requestCode) {
             case ACCESS_FINE_LOCATION_PERM: {
                 // If request is cancelled, the result arrays are empty.
                 if (grantResults.length > 0
                     && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                     // permission was granted, do your work....
    
                     YourFragmentClass fragment = 
                     (YourFragmentClass)fm.findFragmentById(R.id.your_fragment_id);
                     fragment.yourPublicMethod();
    
                 } else {
                     // permission denied
                     // Disable the functionality that depends on this permission.
                 }
                 return;
             }
    
             // other 'case' statements for other permssions
         }
     }
    

注意:还有其他方法可以与来自 ActivityFragment 互动。