如何从片段中的活动获取许可结果?

问题描述

我有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是负责片段活动通信的接口。

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类本身具有requestPermissionsonRequestPermissionsResult方法/函数。您可以出于自己的理由使用它。

Fragment.requestPermissions

Fragment.onRequestPermissionsResult

,
  1. 您在片段中也有onRequestPermissionsResult

  2. 如果您仍然想在onRequestPermissionsResult的中央放置Activity,则需要调用FragmentonRequestPermissionsResult 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
         }
     }
    

注意:还有其他与Fragment中的Activity进行交互的方式。

,
public <T> void Send(T message)
{
    ReceiverWrapper<T> receiverInstance = new ReceiverWrapper<>();

// do something with the receiver...
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...