用户控制app访问设备位置
- 如果您在后台请求访问设备位置,则会影响您的应用
- 在后台授予应用访问设备位置后,用户可能会收到提醒
- 通过使用新权限在后台访问位置并在没有后台位置更新的情况下确保优雅降级来进行缓解
- Android Q上始终启用行为
在Android Q上运行的应用程序请求位置访问时,用户会看到授权弹窗
授权弹窗
对话框允许用户授予对两个不同范围的位置访问权限:在使用中(仅限前景)或始终(前景和后台)
Android Q引入了新的位置权限ACCESS_BACKGROUND_LOCATION
。与现有 权限ACCESS_FINE_LOCATION
和ACCESS_COARSE_LOCATION
权限不同
如果应用针对Android Q并且需要在后台运行时访问设备位置,则必须在应用的清单文件中声明新权限:
<manifest>
<uses-permission android:name =“android.permission.ACCESS_COARSE_LOCATION”/>
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
</manifest>
对于低版本的适配
- 如果应用程序声明了
<uses-permission>
对任一元素ACCESS_FINE_LOCATION
或ACCESS_COARSE_LOCATION
后,系统会自动添加一个<uses-permission>
元素ACCESS_BACKGROUND_LOCATION
在安装过程中。 - 如果应用程序请求
ACCESS_FINE_LOCATION
或ACCESS_COARSE_LOCATION
,系统会自动添加ACCESS_BACKGROUND_LOCATION
到请求中。
虽然应用可以请求和接收 ACCESS_BACKGROUND_LOCATION权限,但用户可以通过选择应用仅应在前台访问位置信息来撤消此权限
后台位置访问场景
Android q以上app需要在后台运行时访问位置信息,必需考虑需要此访问权限的场景:
- 设备位置的访问权限在前台。
- 应用在后台访问设备位置。
前台场景
要在此特定用例中保留对设备位置的访问权限,请启动在应用程序清单中声明
为具有前台服务类型的前台服务"location"
:
<service
android:name="MyNavigationService"
android:foregroundServiceType="location" >
//foregroundServiceType多个类型用|分隔
</service>
在开始前台服务之前,确保应用仍然可以访问设备的位置
boolean permissionAccessCoarseLocationApproved =
ActivityCompat.checkSelfPermission(this,
permission.ACCESS_COARSE_LOCATION) ==
PackageManager.PERMISSION_GRANTED;
if (permissionAccessCoarseLocationApproved) {
// App有权访问前台的位置。todo
//前台服务类型为“location”的前台服务。
} else {
//请求仅限前台的位置访问。
ActivityCompat.requestPermissions(this, new String[] {
Manifest.permission.ACCESS_COARSE_LOCATION},
your-permission-request-code);
}
后台场景
应用可能有一个场景,需要始终访问设备的位置。比如与朋友和家人进行地理围栏和位置共享。
在这种情况下,应用应向用户说明他们需要始终让应用访问设备位置才能正常运行,然后请求访问后台位置
只要用户授予应用对其所在位置的全天候访问权限,就可以继续请求位置更新而无需任何更改:
<!-- 没有必要为必须具有的服务包含前台服务类型
“始终”访问设备的位置,以便成功运行.-->
<service
android:name="MyFamilyLocationSharingService" >
</service>
每次用户选择允许应用一直访问设备位置时,系统会安排发送给用户的通知。此通知提醒用户他们已允许应用始终访问设备位置
位置授权提醒通知
虽然应用可以请求在后台访问位置,但用户可以选择减少应用对前台的访问权限或完全撤消访问权限。因此,每当应用启动服务时,请检查用户是否仍允许应用在后台访问位置信息。
如果用户仅请求应用访问位置位于前台,则最佳做法是让应用显示自定义对话框,提醒用户应用中的工作流无法正常运行而无法始终访问其位置。用户确认此对话框后,可以请求后台位置,此时会出现系统对话框
永久容许弹窗以下代码段中显示了此权限检查逻辑的示例:
boolean permissionAccessCoarseLocationApproved =
ActivityCompat.checkSelfPermission(this, permission.ACCESS_COARSE_LOCATION)
== PackageManager.PERMISSION_GRANTED;
if (permissionAccessCoarseLocationApproved) {
boolean backgroundLocationPermissionApproved =
ActivityCompat.checkSelfPermission(this,
permission.ACCESS_BACKGROUND_LOCATION)
== PackageManager.PERMISSION_GRANTED;
if (backgroundLocationPermissionApproved) {
//应用程序可以访问前台和后台的位置。
//启动没有前台服务类型的服务
//定义。
} else {
//应用只能访问前台的位置。显示一个对话框
//警告用户您的应用必须具有全时访问权限
//位置以便正常运行。然后,请求背景
// location。
ActivityCompat.requestPermissions(this, new String[] {
Manifest.permission.ACCESS_BACKGROUND_LOCATION},
your-permission-request-code);
}
} else {
// App根本无法访问设备的位置。提出全面要求
//获取权限
ActivityCompat.requestPermissions(this, new String[] {
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_BACKGROUND_LOCATION
},
your-permission-request-code);
}
虽然Google官方对权限的使用有一套推推荐原则,但是所有国内开发者一直都执行没有原则,不关注也罢
反正以后的权限google都会收敛到用户手中,真好
网友评论