年後項目升級到了安卓10 (Api29), 這幾天在寫定位遇到了的定位權限以及回調問題,記錄下
隨着Android 對用戶隱私和安全問題逐漸重視, 版本適配問題越來越多,對於開發者來說也是一件很頭痛的事
Android Q (29) 新增後臺定位權限: ACCESS_BACKGROUND_LOCATION
,
如果項目編譯版本>=29 且想要使用前臺定位則需要在AndroidManifest.xml 添加下面這句權限
<!--定位權限 安卓9.0及以下用下-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!--定位權限,Android Q 新增後臺定位權限-->
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
申請權限需要判斷編譯版本了
//Android10以下申請定位權限
String[] permissionsO = new String[]{
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_FINE_LOCATION};
//Android 10及以上申請定位權限
String[] permissionsQ = new String[]{
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_BACKGROUND_LOCATION};
String[] permissions = permissionsO;
// 判斷編譯版本,如果大於等於29,就用permissionsQ
if (Build.VERSION.SDK_INT >= 29) {
permissions = permissionsQ;
}
本以爲這就完事了, 結果自測的時候在Android10上發現一個問題: 在申請權限的時候如果點擊了 僅使用期間允許 的話會執行拒絕的回調, 正常的情況下, 我們一般會有這幾種回調(允許, 拒絕,拒絕後不在詢問)
//這是我基於RXpermission 自行封裝的
PermissionUtil.requestLocation(new PermissionUtil.RequestPermission() {
@Override
public void onRequestPermissionSuccess() {
//全部授權,開始定位
}
@Override
public void onRequestPermissionFailure(List<String> permissions) {
//拒絕,給個提示
}
@Override
public void onRequestPermissionFailureWithAskNeverAgain(List<String> permissions) {
//拒絕後不在詢問,給個彈窗,是否去設置界面
}
}, new RxPermissions(this));
經過Debug 發現, 在Android10手機上如果點擊僅使用期間執行的話,android.permission.ACCESS_BACKGROUND_LOCATION 這個權限返回的值是 -1 , 說明這個權限是沒有申請成功的
所以,我的思路就是在onRequestPermissionFailure 這回調判斷下,未授權的權限集合長度等於1,並且這個權限還是 "android.permission.ACCESS_BACKGROUND_LOCATION" , 說明另外兩個定位已經授權了,
//基於RXpermission 自行封裝的
PermissionUtil.requestLocation(new PermissionUtil.RequestPermission() {
@Override
public void onRequestPermissionSuccess() {
//全部授權,開始定位
}
@Override
public void onRequestPermissionFailure(List<String> permissions) {
if (null != permissions && permissions.size()==1 && permissions.contains("android.permission.ACCESS_BACKGROUND_LOCATION")){
//僅在運行期間允許,這個也是可以去定位的,就是無法使用後臺定位,如果要使用後臺定位,可以在這裏做個提示
}else {
//拒絕授權,給個提示
}
}
@Override
public void onRequestPermissionFailureWithAskNeverAgain(List<String> permissions) {
if (null != permissions && permissions.size()==1 && permissions.contains("android.permission.ACCESS_BACKGROUND_LOCATION")){
//僅在運行期間允許且不再詢問
}else {
//拒絕後不在詢問,給個彈窗,是否去設置界面
}
}
}, new RxPermissions(this));
以上就是我遇到的問題和思路, 如果有更好的想法和意見,可以一起討論哦
Android 10 定位權限問題