【问题标题】:How to get permission result from activity in fragment?如何从片段中的活动获得许可结果?
【发布时间】:2020-08-19 09:36:55
【问题描述】:

我有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
    }

基本上它是检查是否授予权限,如果是返回true,如果不是请求权限并返回false。

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

在我的情况下,我正在检查是否已授予权限,如果不隐藏地图则显示地图。

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

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

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

【问题讨论】:

    标签: android kotlin android-fragments android-permissions android-fragmentactivity


    【解决方案1】:
    1. 您在 Fragment 中也有 onRequestPermissionsResult

    2. 如果你还想把onRequestPermissionsResult放在你的Activity中,你需要调用ActivityFragmentonRequestPermissionsResult的方法

      @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 进行交互。

    【讨论】:

    • 片段不推荐使用此方法
    【解决方案2】:

    Fragment 类本身具有 requestPermissionsonRequestPermissionsResult 方法/函数。您可以根据自己的原因使用它。

    Fragment.requestPermissions

    Fragment.onRequestPermissionsResult

    【讨论】:

    • 实际上我尝试在MainActivity 中请求权限并在片段中使用onRequestPermissionsResult ,但它似乎没有做任何事情。我知道我可以轻松地请求和获取片段内的权限,但是权限处理不应该是一个全局的地方吗?
    • 不,没有必要,最好说,它不应该是全球性的。如果您需要在一个地方获得许可,最好在该特定地方本身请求和处理。
    • 如果你想在你的活动中全局管理它,那么你应该在你的片段中定义一个公共方法来执行权限请求后的操作,然后在你的活动中调用它授予权限后。在片段中定义和使用接口来处理此问题并在活动中实现该侦听器将是一种更好的方法。
    【解决方案3】:
    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();
         }
     }
    

    【讨论】:

    • 您在这里有什么疑问或问题?
    猜你喜欢
    • 2015-07-21
    • 1970-01-01
    • 1970-01-01
    • 2013-09-27
    • 2023-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多