&引用;允许所有时间”;Android SDK 29中没有位置提示
在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
<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权限:
- 首先,请求前台位置访问
- 然后您可以请求后台位置访问
<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
)
}
}