Android Q之提前適配攻略(四)(後臺Activity啓動限制)
前言
本來是準備第二篇直接寫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後臺定位權限的更改總而言之就是,如果項目中沒有用到後臺實時定位,則並無多大改動;如果涉及到後臺定位,那就需要同定位權限一同去申請授權即可。