我自己的片段位置权限实用功能。这可以吗? (JAVA)

问题描述 投票:0回答:1

我尝试编写一个最小化的实用函数来获取片段的位置权限,如下所示:

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

你推荐这个递归代码吗?

这真的有用吗?如果答案是否定的,请告诉我如何更正代码?

java android android-permissions
1个回答
0
投票

您不应该在无限循环中请求用户许可。您的对话框提供了为什么您需要此权限的信息,应该解释哪些功能需要它。如果用户拒绝授予此权限,那么您应该禁用此功能。在您的应用程序中,最好添加某种打开功能的方式,一旦用户明确打开它(例如按下按钮),您将再次请求许可 - 如果未授予许可。

这就是谷歌在请求权限的工作流程中实际期望的应用程序

如果用户拒绝了该权限,请优雅地降级您的应用程序 体验,以便它向用户提供功能,而无需 受该权限保护的信息。

但是,更重要的是,在用户两次拒绝您的请求后,系统将停止再次显示它,因此一次又一次地显示它是没有意义的,因为只会显示带有请求原因的对话框 - 而不会显示系统对话框将显示。供参考

从 Android 11(API 级别 30)开始,如果用户点击“拒绝” 在您的应用程序的生命周期内多次获得特定权限 安装在设备上,用户看不到系统权限 如果您的应用程序再次请求该权限,则会出现对话框。用户的操作 意思是“不要再问了”。在以前的版本中,用户看到的系统 每次您的应用程序请求权限时都会出现权限对话框,除非 他们之前选择了“不再询问”复选框或选项。

回到你的问题:

如果答案是否定的,请告诉我如何更正代码?

您应该删除此行:

//is not granted
requestLocationPermission(fragment);

并将其替换为会降低应用程序功能的逻辑。

© www.soinside.com 2019 - 2024. All rights reserved.