Android 12未显示正确的权限请求屏幕 [英] Android 12 not showing correct permissions request screen

查看:19
本文介绍了Android 12未显示正确的权限请求屏幕的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的应用程序需要精确的用户位置,因为它要求用户在特定位置执行任务。我已按照documentation的正确方式同时请求ACCESS_FINE_LOCATIONACCESS_COARSE_LOCATION

class LocationChooserFragment : BottomSheetDialogFragment() {
    // only relevant parts shown

    /**
     * A utility class that holds all the code for requesting location updates,
     * so that we can re-use it in multiple fragments.
     */
    private var locationTracker: LocationTracker? = null

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        // all the other initialization for viewbinding

        tryToGetLocationUpdates()
    }

    private fun tryToGetLocationUpdates() {
        val request = registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) { permissions ->
            if (permissions[Manifest.permission.ACCESS_FINE_LOCATION] == true && permissions[Manifest.permission.ACCESS_FINE_LOCATION] == true) {
                requestLocationUpdates()
            }
        }

        when {
            ContextCompat.checkSelfPermission(requireContext(), Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED &&
            ContextCompat.checkSelfPermission(requireContext(), Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED -> {
                Timber.i("Already have required permissions")
                requestLocationUpdates()
            }
            shouldShowRequestPermissionRationale(Manifest.permission.ACCESS_FINE_LOCATION) ||
            shouldShowRequestPermissionRationale(Manifest.permission.ACCESS_COARSE_LOCATION) -> {
                Timber.i("Showing permission rationale dialog")
                // A wrapper to show a dialog that explains what we need permissions for
                alertDialog(
                    title = getString(R.string.permissions),
                    msg = getString(R.string.why_we_need_location),
                    onClick = { yes ->
                        if (yes) {
                            request.launch(arrayOf(
                                Manifest.permission.ACCESS_FINE_LOCATION,
                                Manifest.permission.ACCESS_COARSE_LOCATION
                            ))
                        }
                    }
                )
            }
            else -> {
                Timber.i("Prompting for location permissions")
                request.launch(arrayOf(
                    Manifest.permission.ACCESS_FINE_LOCATION,
                    Manifest.permission.ACCESS_COARSE_LOCATION
                ))
            }
        }
    }

    private fun requestLocationUpdates() {
        if (locationProvider == null) {
            locationProvider = LocationProvider(requireContext())
        }
        locationProvider?.requestLocationUpdates()
    }
}

我遇到的问题是没有提示我的用户允许精确位置。

我希望在文档中看到图3中的提示:

图3.当您的应用在单个运行时请求中同时请求ACCESS_FINE_LOCATIONACCESS_COARSE_LOCATION时出现的系统权限对话框。

相反,我在文档中看到了图2中的提示:

图2.仅当您的应用请求ACCESS_COARSE_LOCATION时显示的系统权限对话框。

此外,我预计当我已经拥有COARSE权限并再次请求FINECOARSE权限时,我应该会看到"升级到精确权限&"对话框,但我根本看不到任何提示。

我已经在Pixel 3a(物理设备和模拟器)上进行了测试,并在运行Android 12的各种Pixel和三星Galaxy设备上收到了其他用户的报告。

当我们在build.gradle中使用compileSdk 30targetSdkVersion 30时,问题不存在,但我们需要能够支持Android的新功能和新版本(并且能够升级到仅支持使用更新的SDK版本构建的依赖项。

为什么权限对话框未正确显示?

推荐答案

将我的AndroidManifest.xml与构建的应用程序中生成的文件(使用Android Studio中的分析APK&q;功能)进行比较,我发现生成的apk文件包含以下条目:

<uses-permission
    android:name="android.permission.ACCESS_FINE_LOCATION"
    android:maxSdkVersion="30" />

显然,maxSdkVersion阻止操作系统授予我所需的权限。

appuild目录上使用grep,我找到了appuildintermediatesmanifest_merge_blame_fileappnameDebugmanifest-merger-blame-appname-debug-report.txt,其中包含以下行:

17    <uses-permission
17-->C:path	omyappnameappsrcmainAndroidManifest.xml:12:2-76
18        android:name="android.permission.ACCESS_FINE_LOCATION"
18-->C:path	omyappnameappsrcmainAndroidManifest.xml:12:19-73
19        android:maxSdkVersion="30" />
19-->[com.github.50ButtonsEach:flic2lib-android:1.3.1] C:Usersmoshe.gradlecaches	ransforms-3dced3886509296f1029e8245af379a07	ransformedjetified-flic2lib-android-1.3.1AndroidManifest.xml:17:9-35

原来this library的开发者最初使用ACCESS_FINE_LOCATION连接到附近的蓝牙设备,由于Android 12对此有单独的权限,所以他们不再需要它,所以他们添加了最高SDK版本。

我向ACCESS_FINE_LOCATION<uses-permission />元素添加了tools:remove="android:maxSdkVersion"属性,现在我的权限可以正常工作了。

这篇关于Android 12未显示正确的权限请求屏幕的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆