簡體   English   中英

“始終允許”位置提示未出現 Android SDK 29

[英]“Allow all the time” location prompt not coming in Android SDK 29

我無法在 SDK 29 中獲得“始終允許”提示。我已經在清單中設置了這些權限:

<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

並請求用戶在運行時允許這些權限。 但它只返回“當應用程序打開時”和“拒絕”選項。

關於如何在 SDK 29 中顯示它的任何想法。

在清單和權限數組中添加“ACCESS_BACKGROUND_LOCATION”。 如果您只在清單中添加權限,則不會顯示“始終允許”選項。 您需要添加數組以要求用戶在運行時授予。

在清單中:

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />

在您的活動中:

if (ContextCompat.checkSelfPermission( this.applicationContext, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this@MainActivity, arrayOf(Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_BACKGROUND_LOCATION), MY_PERMISSIONS_REQUEST_LOCATION)
} else {
  // permission granted            
}

為了在運行 Android 10(API 級別 29)或更高版本的設備上訪問后台位置,您還需要在清單文件中使用以下權限

 <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />

請參閱以下鏈接以獲取更多信息

https://developer.android.com/training/location/permissions?hl=fr

在清單中添加權限ACCESS_BACKGROUND_LOCATION 在 android 10 及更高版本上需要顯示始終允許選項。

請參閱https://developer.android.com/training/location/background#evaluate中的第二點

我發現僅在清單中添加權限是不夠的。 我必須為用戶提供一個在啟動時授予它的選項,就像我需要為 ACCESS_FINE_LOCATION 做的一樣。 有趣的是,當我檢查應用程序中是否已授予后台權限時,它永遠不會給出錯誤。 但如果我不檢查,我不會得到“始終允許”選項。 這是在 Android Pixel 2 版本 10 上

僅在 Android 的 10+ 版本中需要。 請求這兩個權限可以讓用戶在對話框中進行選擇......當然,用戶可能不會 select 'All the time'。 對此無能為力!

要在具有 android API 級別 29 或更高級別的設備上訪問后台位置,您還需要在清單文件中添加以下權限。

    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION"/>

您可以保留所有三個,也可以刪除 ACCESS_FINE_LOCATION 或 ACCESS_COARSE_LOCATION 但其中一個必須在 Manifest 文件中。

添加這些后,如果我們可以通過下面的代碼塊訪問所有這些權限,則需要在某個地方簽入代碼。 如果沒有,您需要通過構建所有這些數組並使用基於 integer 的請求代碼來請求權限:

if (requireContext().checkSelfPermission(PERMISSION_NAME_1) != PackageManager.PERMISSION_DENIED && requireContext().checkSelfPermission(PERMISSION_NAME_2) != PackageManager.PERMISSION_DENIED ...) {
    requestPermissions(@NonNull String[] permissions, int requestCode)

正如@Brian Reinhold 在其回答中所說,將ACCESS_BACKGROUND_LOCATION放在清單中不足以使“始終允許”。 權限彈出窗口中顯示的選項。 您必須在代碼中明確要求ACCESS_BACKGROUND_LOCATION權限,例如:

使用EasyPermissions庫:

if (!EasyPermissions.hasPermissions(requireContext(), *perms)) {
  val builder = PermissionRequest
                .Builder(this, REQUEST_LOCATION_PERMISSION, *perms)
                .setRationale(getString(R.string.location_disclaimer))
                
                EasyPermissions.requestPermissions(builder.build())
}

companion object {
   var perms = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
                arrayOf(
                Manifest.permission.ACCESS_FINE_LOCATION,
                Manifest.permission.ACCESS_BACKGROUND_LOCATION)
   } else {
       arrayOf(Manifest.permission.ACCESS_FINE_LOCATION)
   }
}

正如其他答案所說,你必須使用

 <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION"/>

但您也必須手動請求用戶允許此權限。 在離子 cordova 你可以這樣做:

const accessFineLocationPermission = await this.permissions.checkPermission(this.permissions.PERMISSION.ACCESS_FINE_LOCATION)
if (accessFineLocationPermission && !accessFineLocationPermission.hasPermission) {
  await this.permissions.requestPermission(this.permissions.PERMISSION.ACCESS_FINE_LOCATION)
}

使用 android 權限 cordova 插件: https://ionicframework.com/docs/native/android-permissions

您必須請求 ACCESS_FINE_LOCATION、ACCESS_COARSE_LOCATION 和 ACCESS_BACKGROUND_LOCATION。

位置訪問需要兩種類型的 Android 權限:

  1. 前台位置權限(僅在使用應用程序時允許)
  2. 后台位置的后台權限(始終允許)

如果您的應用請求后台權限,請求應如下所示:

  • 首先,請求前台位置訪問。
  • 然后您可以請求后台位置訪問。

注意:建議禁用用戶對后台位置的訪問,直到您的應用具有前台位置訪問權限。

那么如何訪問后台權限:

第 1 步:在清單上聲明這些權限。

<manifest>
  <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
  <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
</manifest>

Step2:檢查運行時權限

   if (ActivityCompat.checkSelfPermission(
            this,
            Manifest.permission.ACCESS_FINE_LOCATION
        ) != PackageManager.PERMISSION_GRANTED
    ) {
        // Request for Foreground permission
        ActivityCompat.requestPermissions(
            this@YourActivity,
            arrayOf(Manifest.permission.ACCESS_FINE_LOCATION),
            FINE_LOCATION_REQUEST_CODE
        )
    } else {

        // Request for Background permission
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
            ActivityCompat.requestPermissions(
                this@MainActivity,
                arrayOf(Manifest.permission.ACCESS_BACKGROUND_LOCATION),
                BACKGROUND_REQUEST_CODE
            )
        }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM