Android 10 定位權限問題

年後項目升級到了安卓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上發現一個問題: 在申請權限的時候如果點擊了 僅使用期間允許 的話會執行拒絕的回調, 正常的情況下, 我們一般會有這幾種回調(允許, 拒絕,拒絕後不在詢問)
image

//這是我基於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 , 說明這個權限是沒有申請成功的
image
image
所以,我的思路就是在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 定位權限問題

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章