&引用;允许所有时间”;Android SDK 29中没有位置提示

&引用;允许所有时间”;Android SDK 29中没有位置提示,android,android-permissions,android-location,Android,Android Permissions,Android Location,在SDK 29中,我无法获得位置的“始终允许”提示。我已在清单中设置了以下权限: <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <us

在SDK 29中,我无法获得位置的“始终允许”提示。我已在清单中设置了以下权限:

<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />

并请求用户在运行时允许这些权限。但它只返回“应用程序打开时”和“拒绝”选项


关于如何在SDK 29中显示它的任何想法。

在清单中添加权限
访问\u后台\u位置
。在android 10及更高版本上,需要显示始终允许选项


请参阅

中的第二点,要在运行Android 10(API级别29)或更高版本的设备上访问后台位置,您还需要在清单文件中使用以下权限

 <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />

有关更多信息,请参阅下面的链接


我发现仅在清单中添加权限是不够的。我必须为用户提供一个选项,以便在启动时授予它,就像我需要为ACCESS\u FINE\u位置所做的那样。有趣的是,当我检查应用程序中是否已经授予了后台权限时,它从不给出false。但是如果我不检查,我不会得到“允许所有时间”选项。这是在Android Pixel 2 10版上


它仅在10+版本的Android中才是必需的。请求这两个权限将使用户在对话框中进行选择。。。当然,用户可能不会选择“始终”。对此,我们无能为力

正如@Brian Reinhold在其回答中所说,将
访问背景位置
放在清单中不足以使“允许所有时间”。权限弹出窗口中显示的选项。 您必须在代码中明确要求
访问\u后台\u位置
权限,例如:

使用EasyPermissions库:

if(!EasyPermissions.hasPermissions(requireContext(),*perms)){
val builder=许可请求
.Builder(此,请求位置权限,*perms)
.setrational(getString(R.string.location_免责声明))
EasyPermissions.requestPermissions(builder.build())
}
伴星{
var perms=if(Build.VERSION.SDK\u INT>=Build.VERSION\u code.Q){
排列(
Manifest.permission.ACCESS\u FINE\u位置,
清单.权限.访问(后台位置)
}否则{
阵列(清单、权限、访问位置)
}
}

要在android API级别为29或更高的设备上访问后台位置,您还需要在清单文件中添加以下权限

    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION"/>
在清单和中添加“访问背景位置”。如果仅在清单中添加权限,则不会显示“始终允许”选项。您需要添加一个数组来请求用户在运行时授予

在舱单中:

<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />

正如另一个答案所说,你必须使用

 <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION"/>
使用android许可cordova插件:


您必须请求访问精细位置、访问粗略位置和访问背景位置。

位置访问需要两种类型的Android权限:

  • 前台位置的前台权限(仅在使用应用程序时允许)
  • 后台位置的后台权限(始终允许)
  • 如果您的应用程序请求后台权限,则请求应如下所示:

    • 首先,请求前台位置访问
    • 然后您可以请求后台位置访问
    注意:建议禁用用户对后台的访问 位置,直到您的应用程序具有前台位置访问权限

    那么如何访问后台权限:

    步骤1:在清单上声明这些权限

    <manifest>
      <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
      <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
    </manifest>
    

    我已经在清单中添加了该权限请求,但我仍然没有得到“始终允许”选项,只有“仅在使用应用程序时允许”选项。我有另一个应用程序具有相同的权限集,而这一个可以同时获得这两个权限!我是否也需要向用户请求后台位置?是,@BrianReinhold。调用ActivityCompat.requestPermissions()@BrianReinhold Yes时,只需将Manifest.permission.ACCESS_BACKGROUND_位置添加到权限数组中。您需要请求权限在Manifest中添加行,我请求权限。没有什么!是的,我们应该这样做以向用户显示要授予的权限。如果没有这一点,您如何询问运行时权限?注意:这是一个硬限制权限,在记录中的安装程序未列出该权限之前,应用程序无法持有该权限。有关更多详细信息,请参阅PackageInstaller.SessionParams.setWhitelistedRestrictedPermissions(Set)。此答案应视为已接受的答案。它详细说明了如何在“权限”对话框中显示“后台位置”选项。
    <manifest>
      <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
      <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
    </manifest>
    
       if (ActivityCompat.checkSelfPermission(
                this,
                Manifest.permission.ACCESS_FINE_LOCATION
            ) != PackageManager.PERMISSION_GRANTED
        ) {
            // Request for Foreground permission
            ActivityCompat.requestPermissions(
                this@YourActivity,
                arrayOf(Manifest.permission.ACCESS_FINE_LOCATION),
                FINE_LOCATION_REQUEST_CODE
            )
        } else {
    
            // Request for Background permission
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
                ActivityCompat.requestPermissions(
                    this@MainActivity,
                    arrayOf(Manifest.permission.ACCESS_BACKGROUND_LOCATION),
                    BACKGROUND_REQUEST_CODE
                )
            }
        }