[英]“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 步:在清單上聲明這些權限。
<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.