Android 与ContextCompat.checkSelfPermission和GoogleSignIn.hasPermissions混淆

Android 与ContextCompat.checkSelfPermission和GoogleSignIn.hasPermissions混淆,android,google-fit,google-fit-api,Android,Google Fit,Google Fit Api,我仔细地遵循从Google Fit获得历史性步骤: 我已在清单中添加了权限: <uses-permission android:name="android.permission.ACTIVITY_RECOGNITION"/> 正如所料,我发现用户没有权限,因此我使用以下代码请求权限: ActivityCompat.requestPermissions(activity, { Manifest.permission.ACTIVITY_RECOGNITION },

我仔细地遵循从Google Fit获得历史性步骤:

我已在清单中添加了权限:

<uses-permission android:name="android.permission.ACTIVITY_RECOGNITION"/>
正如所料,我发现用户没有权限,因此我使用以下代码请求权限:

ActivityCompat.requestPermissions(activity, { Manifest.permission.ACTIVITY_RECOGNITION }, MY_PERMISSIONS_REQUEST_ACTIVITY_RECOGNITION)
这将导致出现以下弹出窗口:

接下来,我想使用以下代码使用录制客户端进行订阅:

GoogleSignInAccount account = GoogleSignIn.getAccountForExtension(context, options)

Fitness.getRecordingClient(context, account).subscribe(DataType.TYPE_STEP_COUNT_DELTA);
但调用它会引发此异常:

java.util.concurrent.ExecutionException: com.google.android.gms.common.api.ApiException: 4: The user must be signed in to make this API call.
为了解决这个问题,我不得不打电话:

FitnessOptions options = FitnessOptions.builder()
                .addDataType(DataType.TYPE_STEP_COUNT_DELTA, FitnessOptions.ACCESS_READ)
                .addDataType(DataType.AGGREGATE_STEP_COUNT_DELTA, FitnessOptions.ACCESS_READ)
                .build();

    GoogleSignIn.requestPermissions(activity, GOOGLE_FIT_PERMISSIONS_REQUEST_CODE, account, options);
将显示此弹出窗口:

直到那时,我才成功地从API获得了这些步骤

我的问题是为什么我必须调用GoogleSignIn.requestPermissions()?文件中没有提到这一点。我记得它在早期版本的文档中提到过,然后用ActivityCompat.requestPermissions()替换。所以我现在似乎必须调用两个函数,而不仅仅是ActivityCompat?也许文档需要更新


对此问题的任何帮助都将非常有用?

ActivityCompat.requestPermission()
中,您正在请求应用程序权限以访问用户设备上的一组操作或数据(联系人、消息等)

GoogleSignIn.requestPermissions()
则要求用户允许您的应用程序访问/使用其Google帐户中的一组数据(照片、帖子等)


简单的回答是,它们没有任何相似或相关之处,每一个都要求一个完全不同的东西。

好的,我明白了,所以文档不完整。两个电话都需要。如果您遵循以前版本的文档,您就有了完整的解决方案。请求fit权限的单个调用将显示一个pop以使用google帐户登录,然后立即显示一个pop以授权访问google fit。顺便说一句,这个弹出窗口不再显示。您链接的文档页面只提到请求健身权限,而不是说这是访问健身数据所需的全部。While解释说您需要全部3个步骤
FitnessOptions options = FitnessOptions.builder()
                .addDataType(DataType.TYPE_STEP_COUNT_DELTA, FitnessOptions.ACCESS_READ)
                .addDataType(DataType.AGGREGATE_STEP_COUNT_DELTA, FitnessOptions.ACCESS_READ)
                .build();

    GoogleSignIn.requestPermissions(activity, GOOGLE_FIT_PERMISSIONS_REQUEST_CODE, account, options);