如何从片段中的活动中获取权限结果



我有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中,我无法访问请求代码、授予结果等。

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

  1. 片段中也有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还有其他交互方式。

Fragment类本身具有requestPermissionsonRequestPermissionsResult方法/函数。你可以出于自己的原因使用它。

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();
}
}

最新更新