簡體   English   中英

Android ACTIVITY_RECOGNITION 權限 SDK 28 在 Android 10/Q(SDK 29)上運行

[英]Android ACTIVITY_RECOGNITION Permission SDK 28 running on Android 10/Q (SDK 29)

我的 Android 應用程序針對 SDK 28 並連接到 Google Fit 以上傳數據並讀取其他一些數據。 該應用程序使用 HistoryAPI 讀取 com.google.step_count.delta 數據。

This documentation claims that "com.google.android.gms.permission.ACTIVITY_RECOGNITION permission is converted into a pre-granted runtime permission" if the app targets SDK 28 but runs on SDK 29: https://developers.google.com/fit /android/authorization#android_permissions

我已經添加到應用程序的清單中,就像文檔說的那樣。

當此 Android 應用程序在運行 Android 10(SDK 29)的設備上並且用戶第一次連接到 Google Fit 時,我收到一條日志:

There was a problem subscribing.com.google.android.gms.common.api.ApiException: 10: SecurityException: com.google.step_count.delta requires android.permission.ACTIVITY_RECOGNITION

然而,文檔聲稱這將被轉換為預先授予的運行時權限。

團隊還沒有准備好將應用程序的目標 SDK 遷移到 29,那么我們如何繼續獲取 com.google.step_count.delta 數據而不出現此錯誤?

我假設這個日志意味着它實際上沒有連接,因為沒有日志語句說:

Successfully subscribed to com.google.step_count.delta

已解決:在應用程序中 Api 級別 28 +

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

應用程序應檢查是否已授予權限:

if (ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.ACTIVITY_RECOGNITION)
          != PackageManager.PERMISSION_GRANTED) {
      // Permission is not granted
}

要請求許可:

ActivityCompat.requestPermissions(thisActivity,
                  arrayOf(Manifest.permission.ACTIVITY_RECOGNITION),
                  MY_PERMISSIONS_REQUEST_ACTIVITY_RECOGNITION);

了解有關請求 Android 運行時權限的更多信息。

如果您的應用以 SDK 級別 28 或以下為目標,則必須在其清單文件中指定 com.google.android.gms.permission.ACTIVITY_RECOGNITION 權限。

看起來文檔已更新: https://developer.android.com/about/versions/10/privacy/changes#physical-activity-recognition

我能夠通過使用清單中的 API 28 權限(com.google.android.gms.permission.ACTIVITY_RECOGNITION)來解決這個問題。

如果應用程序安裝在運行 Android 10 (API 29) 的設備上,系統似乎正確地自動授予權限 android.permission.ACTIVITY_RECOGNITION。

因為用戶可以在設置中更改此設置(設置 > 應用程序和通知 > 權限管理器 > 體育鍛煉 > 指定應用程序 > 拒絕),如果應用程序安裝在運行 Android 10 的設備上,我能夠檢查 android.permission.ACTIVITY_RECOGNITION 權限(API 29)。

不確定它是否對您的問題有幫助,但它可以幫助我們解決類似的問題。 首先檢查您的應用程序/用戶是否允許進行體育活動 - 很可能沒有。 如果您允許,您的代碼應該毫無例外地運行。

Issue for us was how to detect that com.google.android.gms.permission.ACTIVITY_RECOGNITION is permitted (running in target sdk 28 on Android 10) - since call

PermissionCompat.isPermissionGranted(context,"com.google.android.gms.permission.ACTIVITY_RECOGNITION")

總是返回 true (即使權限被拒絕)

解決方法(對於您的應用程序目標 sdk 28 在 Android 10 上運行)是調用 requestPermission(而不是 isPermissionGranted),它在授予權限時不執行任何操作,如果沒有則顯示對話框

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
        PermissionCompat.requestPermission(activity, "com.google.android.gms.permission.ACTIVITY_RECOGNITION", requestCode)
}

如果您正在運行活動不可用的后台代碼,您有兩個選擇:

  1. 遷移到目標 SDK 29(並在清單和檢查/請求中使用 android.permission.ACTIVITY_RECOGNITION) - 我們對其進行了測試並且它有效
  2. 在主要活動或任何合適的活動開始時運行上面的調用,這將要求用戶許可

暫無
暫無

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

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