我尝试编写一个最小化的实用函数来获取片段的位置权限,如下所示:
public class LocationPermissionUtils {
private static final String LOCATION_PERMISSION = Manifest.permission.ACCESS_FINE_LOCATION;
private static final String LOCATION_COARSE_PERMISSION = Manifest.permission.ACCESS_COARSE_LOCATION;
public static boolean requestLocationPermission(Fragment fragment) {
if (checkSelfPermission(fragment.requireContext(), LOCATION_PERMISSION) == PackageManager.PERMISSION_GRANTED)
return true;
if (ActivityCompat.shouldShowRequestPermissionRationale(fragment.requireActivity(), LOCATION_PERMISSION)) {
showDialog();
} else {
LocationUtils.permissionLauncherUtils(fragment).launch(LOCATION_PERMISSION); // <-- this
}
return false;
}
public static ActivityResultLauncher<String> permissionLauncherUtils(Fragment fragment) {
return fragment
.registerForActivityResult(new ActivityResultContracts.RequestPermission(), new ActivityResultCallback<Boolean>() {
@Override
public void onActivityResult(Boolean result) {
if (result) {
//is granted
// one can use a callback to send result
} else {
//is not granted
requestLocationPermission(fragment);
}
}
});
}
// codes of showDialog() ..
}
你推荐这个递归代码吗?
这真的有用吗?如果答案是否定的,请告诉我如何更正代码?
您不应该在无限循环中请求用户许可。您的对话框提供了为什么您需要此权限的信息,应该解释哪些功能需要它。如果用户拒绝授予此权限,那么您应该禁用此功能。在您的应用程序中,最好添加某种打开功能的方式,一旦用户明确打开它(例如按下按钮),您将再次请求许可 - 如果未授予许可。
这就是谷歌在请求权限的工作流程中实际期望的应用程序:
如果用户拒绝了该权限,请优雅地降级您的应用程序 体验,以便它向用户提供功能,而无需 受该权限保护的信息。
但是,更重要的是,在用户两次拒绝您的请求后,系统将停止再次显示它,因此一次又一次地显示它是没有意义的,因为只会显示带有请求原因的对话框 - 而不会显示系统对话框将显示。供参考
从 Android 11(API 级别 30)开始,如果用户点击“拒绝” 在您的应用程序的生命周期内多次获得特定权限 安装在设备上,用户看不到系统权限 如果您的应用程序再次请求该权限,则会出现对话框。用户的操作 意思是“不要再问了”。在以前的版本中,用户看到的系统 每次您的应用程序请求权限时都会出现权限对话框,除非 他们之前选择了“不再询问”复选框或选项。
回到你的问题:
如果答案是否定的,请告诉我如何更正代码?
您应该删除此行:
//is not granted
requestLocationPermission(fragment);
并将其替换为会降低应用程序功能的逻辑。