Android ACTIVITY RECOGNITION权限缺失

3
我正在针对SDK 29进行开发,并且在运行Android 10的设备上使用activity transition API时可以完美地工作。根据文档,如果你的目标SDK是29,但在运行较低版本的SDK上,权限应该会自动授权。
我已经分别尝试了这两种情况,以及它们同时出现的情况。
<uses-permission android:name="android.permission.ACTIVITY_RECOGNITION"/>
<uses-permission android:name="com.google.android.gms.permission.ACTIVITY_REC‌​OGNITION"/>

在弹出窗口中,我无法请求权限(什么都不会发生)。当我尝试在Android 10及以下的手机上注册Transitions API时,会出现以下错误:

com.google.android.gms.common.api.b: 10: SecurityException: Activity detection usage requires the ACTIVITY_RECOGNITION permission

如果我将目标SDK设置为28,则所有手机上都可以完美运行,但出于其他原因,我需要将其设置为29。我感到非常苦恼。 明确一点,它在Android 10上可以完美运行,但在以下版本上无法正常运行。下面是更多代码以供澄清:
public void askForActivityPermission(View v) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
            Log.d(TAG, "askForActivityPermission: q or greater");
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACTIVITY_RECOGNITION}, PERMISSION_REQUEST_ACTIVITY_RECOGNITION);
        } else {
            Log.d(TAG, "askForActivityPermission: less than q");
            moveNextStep();
        }
    }

    @Override
    public void onRequestPermissionsResult(
            int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {

        String permissionResult = "Request code: " + requestCode + ", Permissions: " +
                Arrays.toString(permissions) + ", Results: " + Arrays.toString(grantResults);

        Log.d(TAG, "onRequestPermissionsResult(): " + permissionResult);

        if (requestCode == PERMISSION_REQUEST_ACTIVITY_RECOGNITION) {
            Log.d(TAG, "onRequestPermissionsResult: permission granted?");
            moveNextStep();

        }
3个回答

2
API Level 29有一些更新。
1. 在清单文件中添加权限。
<uses-permission android:name="android.permission.ACTIVITY_RECOGNITION"/>

2. 检查权限是否已被授予:
if (ContextCompat.checkSelfPermission(thisActivity, 
    Manifest.permission.ACTIVITY_RECOGNITION)
      != PackageManager.PERMISSION_GRANTED) {
  // Permission is not granted
}

3. 如果尚未获得许可,请请求许可:
ActivityCompat.requestPermissions(thisActivity,
arrayOf(Manifest.permission.ACTIVITY_RECOGNITION),
MY_PERMISSIONS_REQUEST_ACTIVITY_RECOGNITION);

这里有一些有用的文档。

https://developer.android.com/about/versions/10/privacy/changes#physical-activity-recognition

https://developers.google.com/fit/android/authorization


1

我已经尝试了所有建议的解决方案,但都没有奏效。我已经尝试了所有 com.google.android.gms.permission.ACTIVITY_REC‌​OGNITIONcom.google.android.gms.permission.ACTIVITY_RECOGNITION 的组合

使用 minSdkVersion 26targetSdkVersion 30

在 Android 9 (API 28) Wear OS 模拟器上运行。


这并没有真正回答问题。如果您有不同的问题,可以通过点击提问来提出。如果您想在此问题获得新的答案时得到通知,您可以关注此问题。一旦您拥有足够的声望,您还可以添加悬赏以吸引更多关注。- 来自审核 - Bruno Rohée

0

好的,我已经让它工作了,但是它根本没有任何意义,一点也不。

<uses-permission android:name="com.google.android.gms.permission.ACTIVITY_REC‌​OGNITION" />

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

上面那个不起作用,下面那个可以。有人能告诉我为什么吗?


如果您的应用程序针对Android 9(API级别28)或更低版本,则系统会根据需要自动授予android.permission.ACTIVITY_RECOGNITION权限,前提是您的应用程序满足以下每个条件:1.清单文件包括com.google.android.gms.permission.ACTIVITY_RECOGNITION权限。 2.清单文件不包括android.permission.ACTIVITY_RECOGNITION权限。 如果系统自动授予android.permission.ACTIVITY_RECOGNITION权限,则在将应用程序更新为针对Android 10时,您的应用程序将保留该权限。 - Mitch
我的应用程序针对29个版本。 它包含android.permission.ACTIVITY_RECOGNITION和com.google.android.gms.permission.ACTIVITY_REC‌​OGNITION。 奇怪的问题是,如果我注释掉上面的底部权限,则应用程序不起作用,如果我注释掉顶部权限,则它起作用,尽管它们看起来完全相同。我已经多次复制了这个问题。 这只是那些超级奇怪的Android问题之一,我浪费了一整天的时间在上面。一个字符串不工作,一个相同的字符串则可以。 - Geordie Wicks
另一个奇怪的发现...在顶部权限的"C"和"O"之间有两个不可见字符。这些字符在任何文本编辑器中都不会显示,但是当您通过箭头键移动光标时,它们就存在了。基本上,由于权限中的拼写错误是看不到的,所以它没有起作用。 - Geordie Wicks
听起来好像清单文件有问题。你可以尝试清理项目,方法是 Build -> Clean Project。 - Mitch
因为您正在使用目标API级别29,我建议放弃android:name="com.google.android.gms.permission.ACTIVITY_RECOGNITION"并改用android:name="android.permission.ACTIVITY_RECOGNITION"。 - Mitch
你需要同时拥有两个版本,以适配运行在 Android 9 以下的手机。经过更多的研究,我发现我的清单文件中出现了一些零宽空格字符,但我不知道是怎么回事。重新构建并不能解决问题,这些字符几乎无法找到。这对我来说是一个新问题。感谢 @this.mitch 的所有帮助。 - Geordie Wicks

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接