Android Q 新特性(一) 位置訪問權(quán)限

用戶控制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)彈窗


授權(quán)彈窗

對(duì)話框允許用戶授予對(duì)兩個(gè)不同范圍的位置訪問權(quán)限:在使用中(僅限前景)或始終(前景和后臺(tái))

Android Q引入了新的位置權(quán)限ACCESS_BACKGROUND_LOCATION。與現(xiàn)有 權(quán)限ACCESS_FINE_LOCATIONACCESS_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_LOCATIONACCESS_COARSE_LOCATION后,系統(tǒng)會(huì)自動(dòng)添加一個(gè)<uses-permission>元素 ACCESS_BACKGROUND_LOCATION在安裝過程中。
  • 如果應(yīng)用程序請(qǐng)求ACCESS_FINE_LOCATIONACCESS_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ú)需任何更改:

Demo

<!-- 沒有必要為必須具有的服務(wù)包含前臺(tái)服務(wù)類型
     “始終”訪問設(shè)備的位置,以便成功運(yùn)行.-->
<service
    android:name="MyFamilyLocationSharingService"  >
   
</service>

每次用戶選擇允許應(yīng)用一直訪問設(shè)備位置時(shí),系統(tǒng)會(huì)安排發(fā)送給用戶的通知。此通知提醒用戶他們已允許應(yīng)用始終訪問設(shè)備位置


位置授權(quán)提醒通知

雖然應(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ì)收斂到用戶手中,真好

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容