当应用程序在后台 xamarin 形式 android 应用程序升级目标 api 到 29 时,后台位置不工作
background location not working when app in background xamarin forms android app when upgrade target api to 29
我有 xamarin 表单应用程序,当设置 android 目标 api 级别 28 时,它具有跟踪和用于后台跟踪的前台服务工作正常,但升级后它的目标 api 级别 29 到将应用上传到 Play 商店 没有为应用设置后台位置权限,因此当应用在后台时无法获取位置。
和此清单权限:
<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_MOCK_LOCATION" />
和主 运行 时间请求 activity:
private static string[] _initialPerms ={
Manifest.Permission.AccessFineLocation,
Manifest.Permission.AccessCoarseLocation
};
if (ContextCompat.CheckSelfPermission(this, Manifest.Permission.AccessFineLocation) == Permission.Denied || ContextCompat.CheckSelfPermission(this, Manifest.Permission.Camera) == Permission.Denied)
{
RequestPermissions(_initialPerms, 1337);
}
谢谢。
从Android10开始,后台位置作为一个独立的资源出现。除前台权限外,应用程序必须明确请求此权限。
@TargetApi(29)
private fun Context.checkLocationPermissionAPI29(locationRequestCode : Int) {
if (checkSinglePermission(Manifest.permission.ACCESS_FINE_LOCATION) &&
checkSinglePermission(Manifest.permission.ACCESS_COARSE_LOCATION) &&
checkSinglePermission(Manifest.permission.ACCESS_BACKGROUND_LOCATION)) return
val permList = arrayOf(Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_BACKGROUND_LOCATION)
requestPermissions(permList, locationRequestCode)
}
private fun Context.checkSinglePermission(permission: String) : Boolean {
return ContextCompat.checkSelfPermission(this, permission) == PackageManager.PERMISSION_GRANTED
}
权限 ACCESS_BACKGROUND_LOCATION 是 Android 10.0 之后的新权限。即使你设置了目标版本为 Api 29 ,但是 Xamarin.Android 中支持的 SDK 版本仍然是 v28.x.x.x (Android 9.0) 。所以这个枚举仍然不可用在 Xamarin.Android 现在。您只需要等待支持SDK的更新即可。
在您的情况下,ACCESS_BACKGROUND_LOCATION 将与旧版本兼容。
如果应用申请了ACCESS_FINE_LOCATION或者ACCESS_COARSE_LOCATION,系统会自动添加一个权限ACCESS_BACKGROUND_LOCATION 正在建设中。
===========================更新================= ==============
在 Android 10(API 级别 29)及更高版本上,您必须在应用的清单中声明 ACCESS_BACKGROUND_LOCATION 权限,以便在运行时请求后台位置访问。在 Android 的早期版本中,当您的应用接收前台位置访问权限时,它也会自动接收后台位置访问权限。
<manifest ... >
<!-- Required only when requesting background location access on
Android 10 (API level 29) and higher. -->
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
</manifest>
更多信息请参阅 android 文档 here。
我有 xamarin 表单应用程序,当设置 android 目标 api 级别 28 时,它具有跟踪和用于后台跟踪的前台服务工作正常,但升级后它的目标 api 级别 29 到将应用上传到 Play 商店 没有为应用设置后台位置权限,因此当应用在后台时无法获取位置。
和此清单权限:
<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_MOCK_LOCATION" />
和主 运行 时间请求 activity:
private static string[] _initialPerms ={
Manifest.Permission.AccessFineLocation,
Manifest.Permission.AccessCoarseLocation
};
if (ContextCompat.CheckSelfPermission(this, Manifest.Permission.AccessFineLocation) == Permission.Denied || ContextCompat.CheckSelfPermission(this, Manifest.Permission.Camera) == Permission.Denied)
{
RequestPermissions(_initialPerms, 1337);
}
谢谢。
从Android10开始,后台位置作为一个独立的资源出现。除前台权限外,应用程序必须明确请求此权限。
@TargetApi(29)
private fun Context.checkLocationPermissionAPI29(locationRequestCode : Int) {
if (checkSinglePermission(Manifest.permission.ACCESS_FINE_LOCATION) &&
checkSinglePermission(Manifest.permission.ACCESS_COARSE_LOCATION) &&
checkSinglePermission(Manifest.permission.ACCESS_BACKGROUND_LOCATION)) return
val permList = arrayOf(Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_BACKGROUND_LOCATION)
requestPermissions(permList, locationRequestCode)
}
private fun Context.checkSinglePermission(permission: String) : Boolean {
return ContextCompat.checkSelfPermission(this, permission) == PackageManager.PERMISSION_GRANTED
}
权限 ACCESS_BACKGROUND_LOCATION 是 Android 10.0 之后的新权限。即使你设置了目标版本为 Api 29 ,但是 Xamarin.Android 中支持的 SDK 版本仍然是 v28.x.x.x (Android 9.0) 。所以这个枚举仍然不可用在 Xamarin.Android 现在。您只需要等待支持SDK的更新即可。
在您的情况下,ACCESS_BACKGROUND_LOCATION 将与旧版本兼容。 如果应用申请了ACCESS_FINE_LOCATION或者ACCESS_COARSE_LOCATION,系统会自动添加一个权限ACCESS_BACKGROUND_LOCATION 正在建设中。
===========================更新================= ==============
在 Android 10(API 级别 29)及更高版本上,您必须在应用的清单中声明 ACCESS_BACKGROUND_LOCATION 权限,以便在运行时请求后台位置访问。在 Android 的早期版本中,当您的应用接收前台位置访问权限时,它也会自动接收后台位置访问权限。
<manifest ... >
<!-- Required only when requesting background location access on
Android 10 (API level 29) and higher. -->
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
</manifest>
更多信息请参阅 android 文档 here。