用戶控制app訪問設(shè)備位置
- 如果您在后臺(tái)請(qǐng)求訪問設(shè)備位置,則會(huì)影響您的應(yīng)用
- 在后臺(tái)授予應(yīng)用訪問設(shè)備位置后,用戶可能會(huì)收到提醒
- 通過使用新權(quán)限在后臺(tái)訪問位置并在沒有后臺(tái)位置更新的情況下確保優(yōu)雅降級(jí)來(lái)進(jìn)行緩解
- Android Q上始終啟用行為
在Android Q上運(yùn)行的應(yīng)用程序請(qǐng)求位置訪問時(shí),用戶會(huì)看到授權(quán)彈窗

對(duì)話框允許用戶授予對(duì)兩個(gè)不同范圍的位置訪問權(quán)限:在使用中(僅限前景)或始終(前景和后臺(tái))
Android Q引入了新的位置權(quán)限ACCESS_BACKGROUND_LOCATION。與現(xiàn)有 權(quán)限ACCESS_FINE_LOCATION 和ACCESS_COARSE_LOCATION權(quán)限不同
如果應(yīng)用針對(duì)Android Q并且需要在后臺(tái)運(yùn)行時(shí)訪問設(shè)備位置,則必須在應(yīng)用的清單文件中聲明新權(quán)限:
<manifest>
<uses-permission android:name =“android.permission.ACCESS_COARSE_LOCATION”/>
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
</manifest>
對(duì)于低版本的適配
- 如果應(yīng)用程序聲明了
<uses-permission>對(duì)任一元素ACCESS_FINE_LOCATION或ACCESS_COARSE_LOCATION后,系統(tǒng)會(huì)自動(dòng)添加一個(gè)<uses-permission>元素ACCESS_BACKGROUND_LOCATION在安裝過程中。 - 如果應(yīng)用程序請(qǐng)求
ACCESS_FINE_LOCATION或ACCESS_COARSE_LOCATION,系統(tǒng)會(huì)自動(dòng)添加ACCESS_BACKGROUND_LOCATION到請(qǐng)求中。
雖然應(yīng)用可以請(qǐng)求和接收 ACCESS_BACKGROUND_LOCATION權(quán)限,但用戶可以通過選擇應(yīng)用僅應(yīng)在前臺(tái)訪問位置信息來(lái)撤消此權(quán)限
后臺(tái)位置訪問場(chǎng)景
Android q以上app需要在后臺(tái)運(yùn)行時(shí)訪問位置信息,必需考慮需要此訪問權(quán)限的場(chǎng)景:
- 設(shè)備位置的訪問權(quán)限在前臺(tái)。
- 應(yīng)用在后臺(tái)訪問設(shè)備位置。
前臺(tái)場(chǎng)景
要在此特定用例中保留對(duì)設(shè)備位置的訪問權(quán)限,請(qǐng)啟動(dòng)在應(yīng)用程序清單中聲明
為具有前臺(tái)服務(wù)類型的前臺(tái)服務(wù)"location":
<service
android:name="MyNavigationService"
android:foregroundServiceType="location" >
//foregroundServiceType多個(gè)類型用|分隔
</service>
在開始前臺(tái)服務(wù)之前,確保應(yīng)用仍然可以訪問設(shè)備的位置
boolean permissionAccessCoarseLocationApproved =
ActivityCompat.checkSelfPermission(this,
permission.ACCESS_COARSE_LOCATION) ==
PackageManager.PERMISSION_GRANTED;
if (permissionAccessCoarseLocationApproved) {
// App有權(quán)訪問前臺(tái)的位置。todo
//前臺(tái)服務(wù)類型為“l(fā)ocation”的前臺(tái)服務(wù)。
} else {
//請(qǐng)求僅限前臺(tái)的位置訪問。
ActivityCompat.requestPermissions(this, new String[] {
Manifest.permission.ACCESS_COARSE_LOCATION},
your-permission-request-code);
}
后臺(tái)場(chǎng)景
應(yīng)用可能有一個(gè)場(chǎng)景,需要始終訪問設(shè)備的位置。比如與朋友和家人進(jìn)行地理圍欄和位置共享。
在這種情況下,應(yīng)用應(yīng)向用戶說明他們需要始終讓應(yīng)用訪問設(shè)備位置才能正常運(yùn)行,然后請(qǐng)求訪問后臺(tái)位置
只要用戶授予應(yīng)用對(duì)其所在位置的全天候訪問權(quán)限,就可以繼續(xù)請(qǐng)求位置更新而無(wú)需任何更改:
<!-- 沒有必要為必須具有的服務(wù)包含前臺(tái)服務(wù)類型
“始終”訪問設(shè)備的位置,以便成功運(yùn)行.-->
<service
android:name="MyFamilyLocationSharingService" >
</service>
每次用戶選擇允許應(yīng)用一直訪問設(shè)備位置時(shí),系統(tǒng)會(huì)安排發(fā)送給用戶的通知。此通知提醒用戶他們已允許應(yīng)用始終訪問設(shè)備位置

雖然應(yīng)用可以請(qǐng)求在后臺(tái)訪問位置,但用戶可以選擇減少應(yīng)用對(duì)前臺(tái)的訪問權(quán)限或完全撤消訪問權(quán)限。因此,每當(dāng)應(yīng)用啟動(dòng)服務(wù)時(shí),請(qǐng)檢查用戶是否仍允許應(yīng)用在后臺(tái)訪問位置信息。
如果用戶僅請(qǐng)求應(yīng)用訪問位置位于前臺(tái),則最佳做法是讓應(yīng)用顯示自定義對(duì)話框,提醒用戶應(yīng)用中的工作流無(wú)法正常運(yùn)行而無(wú)法始終訪問其位置。用戶確認(rèn)此對(duì)話框后,可以請(qǐng)求后臺(tái)位置,此時(shí)會(huì)出現(xiàn)系統(tǒng)對(duì)話框

以下代碼段中顯示了此權(quán)限檢查邏輯的示例:
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) {
//應(yīng)用程序可以訪問前臺(tái)和后臺(tái)的位置。
//啟動(dòng)沒有前臺(tái)服務(wù)類型的服務(wù)
//定義。
} else {
//應(yīng)用只能訪問前臺(tái)的位置。顯示一個(gè)對(duì)話框
//警告用戶您的應(yīng)用必須具有全時(shí)訪問權(quán)限
//位置以便正常運(yùn)行。然后,請(qǐng)求背景
// location。
ActivityCompat.requestPermissions(this, new String[] {
Manifest.permission.ACCESS_BACKGROUND_LOCATION},
your-permission-request-code);
}
} else {
// App根本無(wú)法訪問設(shè)備的位置。提出全面要求
//獲取權(quán)限
ActivityCompat.requestPermissions(this, new String[] {
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_BACKGROUND_LOCATION
},
your-permission-request-code);
}
雖然Google官方對(duì)權(quán)限的使用有一套推推薦原則,但是所有國(guó)內(nèi)開發(fā)者一直都執(zhí)行沒有原則,不關(guān)注也罷
反正以后的權(quán)限google都會(huì)收斂到用戶手中,真好