Android Q適配攻略(二)(後臺定位適配)

Android Q之提前適配攻略(一)(圖標適配)

Android Q之提前適配攻略(二)(後臺定位適配)

Android Q之提前適配攻略(三)(唯一標識符更改)

Android Q之提前適配攻略(四)(後臺Activity啓動限制)

Android Q之提前適配攻略(五)(讀取權限變更)

 

前言

本來是準備第二篇直接寫AndroidQ的存儲權限等方面的修改和適配的,但是可能是由於我學藝不精,在實踐中發現AndroidQ表現的跟Google官方文檔描述出入較大,所以目前還在摸索中,那麼第二篇文章就先寫AndroidQ關於定位權限的修改了。本文分爲2個部分,改動解決方案和實踐代碼。

改動

AndroidQ新引入了後臺定位權限,是危險權限需要代碼動態申請

<!--允許App在後臺獲得位置信息-->
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION"/>

這個權限必須配合下面兩個權限使用,單獨寫沒有任何效果

<!--允許獲得精確的GPS定位-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<!--允許獲得粗略的基站網絡定位-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>

Google加入這個權限,意在將App是否能定位的權利分爲前臺和後臺分別交給用戶決定,減少App在後臺靜默定位的可能性,減少用戶的個人信息的泄露。

此項改動將會針對所有版本編譯的App生效,所以你無法通過修改targetSdkVersion來回避這個問題,由於老版本sdk沒有對應的後臺定位權限,如果不對AndroidQ進行適配,那麼反而會造成無法正常運行的問題。

適配

1、權限申請

首先根據自己app的實際需求設置對應的權限,如果不是地圖導航軟件,運動計步軟件這種需要持續進行定位的情況,其實大多數應用根本就不用申請後臺定位這個權限,請工程師不要濫用權限。

首先要在AndroidManifest.xml文件中寫入對應的權限。

<manifest>
    <!--允許獲得精確的GPS定位-->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <!--允許獲得粗略的基站網絡定位-->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
    <!--允許App在後臺獲得位置信息-->
    <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION"/>
</manifest>

在申請後臺定位權限以前,用戶必須先同意定位權限,否則後臺定位權限將會被自動拒絕,所以如果你是一條一條申請權限的邏輯的話,需要先申請定位權限。

//android.permission.ACCESS_FINE_LOCATION或android.permission.ACCESS_COARSE_LOCATION
//任選其一申請定位權限
ActivityCompat.requestPermissions(this, 
new String[] {Manifest.permission.ACCESS_COARSE_LOCATION},
your-permission-request-code);

你會看到這樣的申請界面

 

在確保用戶同意了此權限以後,再申請後臺權限

//申請後臺權限
ActivityCompat.requestPermissions(this, 
new String[] {Manifest.permission.ACCESS_BACKGROUND_LOCATION},
your-permission-request-code);

你會看到後臺請求的說明

得到這兩個權限以後,既可以像老版本一樣完成完全得到定位相關的權限了

當然你可以直接申請多個權限,AndroidQ對多個相同的權限組申請會合併成一個申請,所以我們也可以這麼寫

//同時申請所有定位權限,順序不分先後
ActivityCompat.requestPermissions(this, 
new String[] {Manifest.permission.ACCESS_BACKGROUND_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION},
your-permission-request-code);

這樣就會得到3個選項的權限請求

這裏需要注意的是,如果是老版本的app,點擊僅在使用該應用期間允許,系統會認爲你擁有全部定位權限,回調會提示得到所有權限,但是事實上你並不能後臺定位,也不可以再次申請這個權限。

如果是AndroidQ適配以後,點擊僅在使用該應用期間允許,系統會認爲你允許了前臺定位權限,但是拒絕了後臺定位權限,所以這次請求回調會提示失敗,有權限未通過。下次再執行這個申請時,系統會只申請後臺定位權限。

到這一步適配權限就全部講完了,那麼下一步咱們就來淺談一下具體的情景適配方法

應用場景

1、前臺定位,不需要後臺定位權限

2、後臺定位,需要對應權限

總體來說跟以前的方法是一樣的,所以這裏只討論由於後臺定位權限的加入,引發的一種新的應用場景----沒有後臺定位權限,依然進行類後臺定位。

看了上文,肯定有同學有疑問,就是如果我沒有申請後臺定位權限,是不是我就真的無法做到關掉界面得到定位信息呢?事實是,依然可以。或者我把這個需求換個說法,就是用戶選擇拒絕我的App後臺定位權限,我如何來繼續完成諸如導航,計步這種需要關掉界面後依然在持續定位的需求呢。答案顯而易見:foregroundService(前臺服務)

前臺服務就算你把app放到後臺了,當前沒有Activity可見,系統依然可以認爲你是在前臺狀態,所以不需要申請後臺定位權限,也可以繼續進行定位。具體做法改動如下

     <service
        android:name="MyNavigationService"
        android:foregroundServiceType="location" ... >
        ...
    </service>

首先在AndroidManifest.xml裏註冊service,AndroidQ新加入了foregroundServiceType這個屬性,請選擇"location"

在啓動前臺服務之前,請確保您的應用仍可訪問用戶的位置信息:

boolean permissionAccessCoarseLocationApproved =
        ActivityCompat.checkSelfPermission(this,
            permission.ACCESS_COARSE_LOCATION) ==
            PackageManager.PERMISSION_GRANTED;

    if (permissionAccessCoarseLocationApproved) {
        // App有前臺定位權限. 啓動你的有"location"的前臺服務
    } else {
       // 沒有權限,發起前臺定位權限申請
       ActivityCompat.requestPermissions(this, new String[] {
            Manifest.permission.ACCESS_COARSE_LOCATION},
           your-permission-request-code);
    }

打開對應的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) {
           // App可以訪問前臺和後臺定位權限
           // 啓動後臺Service或者帶“location”的前臺Service
       } else {
           // App只能使用前臺定位,顯示一個Dialog提醒用戶,你的App需要後臺定位權限。
           // 然後申請後臺定位權限
           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);
    }

總結

Android Q後臺定位權限的更改總而言之就是,如果項目中沒有用到後臺實時定位,則並無多大改動;如果涉及到後臺定位,那就需要同定位權限一同去申請授權即可。

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