1

AndroidでGoogle Fit APIから歩数にアクセスしたい。次のコードがありtryToAccessStepsFromGoogleFit()、ボタンがクリックされたときに実行します。

val FITNESS_OPTIONS: FitnessOptions = FitnessOptions.builder()
        .addDataType(DataType.TYPE_STEP_COUNT_DELTA, FitnessOptions.ACCESS_READ)
        .addDataType(DataType.AGGREGATE_STEP_COUNT_DELTA, FitnessOptions.ACCESS_READ)
        .build()

private fun tryToAccessStepsFromGoogleFit() {
    val account = GoogleSignIn.getAccountForExtension(requireContext(), FITNESS_OPTIONS)
    // all fields of account are empty

    if (!GoogleSignIn.hasPermissions(account, FITNESS_OPTIONS)) {
        Log.i(TAG, "Asking for permission")
        GoogleSignIn.requestPermissions(
            this,
            GOOGLE_FIT_STEPS_PERMISSIONS_REQUEST_CODE,
            account,
            FITNESS_OPTIONS
        )
    } else { // this branch is executed which is weird
        Log.i(TAG, "Already has permissions")
        accessStepsFromGoogleFit()
    }
}

private fun accessStepsFromGoogleFit() {
    Log.i(TAG, "Accessing steps from Google Fit")

    val account = GoogleSignIn.getAccountForExtension(requireContext(), FITNESS_OPTIONS)

    Fitness.getHistoryClient(this.activity!!, account)
        .readDailyTotal(DataType.TYPE_STEP_COUNT_DELTA)
        .addOnSuccessListener { result ->
            // do whatever with the result
        }
        .addOnFailureListener { e ->
            Log.i(TAG, "There was a problem getting steps: " + e.localizedMessage)
            Toast.makeText(context, R.string.permission_not_granted, Toast.LENGTH_LONG).show()
            // this branch is executed and error happens "4: The user must be signed in to make this API call."
        }
}

これは、Google Fit android API ドキュメントのものと多かれ少なかれ似ています。

問題は、getAccountForExtension適切なアカウント データが返されないように見えたり、ユーザーにアカウントを選択して Google Fit データへのアクセスを許可するよう促したりする意図を示していないように見えることです。それを達成するために私は何をすべきですか?


また、SO で、アカウントを選択するためのダイアログを表示するコードを見つけました。

private fun startSignInIntent() {
    val signInClient: GoogleSignInClient = GoogleSignIn.getClient(
        this.activity!!,
        GoogleSignInOptions.DEFAULT_SIGN_IN
    )
    val intent = signInClient.signInIntent
    startActivityForResult(intent, GOOGLE_ACCOUNT_CHOSEN)
}

上記のダイアログを表示してから使用GoogleSignIn.getAccountForExtensionすると、Fitness API からデータを取得できますが、ドキュメントにはそれについて何も記載されていません。


おそらく役立つ情報:

  • SDK ターゲット バージョン: 29
  • 人造人間 9
  • MIUI Global 11.0.4でテスト済み
  • 私はすでに Google Developers Console でプロジェクトを作成し、SHA1 を提供し、このプロジェクトの Fitness を有効にしました。
4

0 に答える 0