如何获取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 本身有 requestPermissions
和 onRequestPermissionsResult
methods/functions。您可以根据自己的原因使用它。
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();
}
}
你在 Fragment 中也有 onRequestPermissionsResult
。
如果您仍然希望 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
}
}
注意:还有其他方法可以与来自 Activity
的 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 本身有 requestPermissions
和 onRequestPermissionsResult
methods/functions。您可以根据自己的原因使用它。
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();
}
}
你在 Fragment 中也有
onRequestPermissionsResult
。如果您仍然希望
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 } }
注意:还有其他方法可以与来自 Activity
的 Fragment
互动。