简体   繁体   English

如何使用适用于 Android 的 Google Fit API 查找步骤?

[英]How to find steps with Google Fit API for Android?

I have done a couple of days of research regarding this.我已经对此进行了几天的研究。 All I need is a Simple TextView area in my application to display today's steps.我所需要的只是我的应用程序中的一个 Simple TextView 区域来显示今天的步骤。

I have managed to get the Authentication working with the code below.我已经设法使用下面的代码进行身份验证。 It pops up asks for permission and think I have the right one selected.它弹出请求许可,并认为我选择了正确的一个。

But I can not figure out how to simple gain the Step Count information.但我无法弄清楚如何简单地获取步数信息。 I hope this is only a couple of lines of code.我希望这只是几行代码。 Any help would be appreciated.任何帮助,将不胜感激。 Thanks谢谢

EDIT 1: I just need to get the Step count number.编辑 1:我只需要获取步数。 I can figure out how to display it later.我可以弄清楚以后如何显示它。 I also have Toasts in just to help me figure out what is going on.我也有 Toasts 来帮助我弄清楚发生了什么。

private void buildFitnessClient() {
    if (mClient == null) {
        mClient = new GoogleApiClient.Builder(this)
                .addApi(Fitness.SENSORS_API)
                .addScope(new Scope(Scopes.FITNESS_ACTIVITY_READ))
                .addConnectionCallbacks(
                        new GoogleApiClient.ConnectionCallbacks() {
                            @Override
                            public void onConnected(Bundle bundle) {
                                Log.i(TAG, "Connected!!!");
                                // Now you can make calls to the Fitness APIs.
                                Toast.makeText(getBaseContext(), "Connected!", Toast.LENGTH_LONG).show();


                            }

                            @Override
                            public void onConnectionSuspended(int i) {
                                // If your connection to the sensor gets lost at some point,
                                // you'll be able to determine the reason and react to it here.
                                if (i == GoogleApiClient.ConnectionCallbacks.CAUSE_NETWORK_LOST) {
                                    Log.i(TAG, "Connection lost.  Cause: Network Lost.");
                                    Toast.makeText(getBaseContext(), "Connection lost.  Cause: Network Lost.", Toast.LENGTH_LONG).show();

                                } else if (i
                                        == GoogleApiClient.ConnectionCallbacks.CAUSE_SERVICE_DISCONNECTED) {
                                    Log.i(TAG,
                                            "Connection lost.  Reason: Service Disconnected");
                                }
                            }
                        }
                )
                .enableAutoManage(this, 0, new GoogleApiClient.OnConnectionFailedListener() {
                    @Override
                    public void onConnectionFailed(ConnectionResult result) {
                        Log.i(TAG, "Google Play services connection failed. Cause: " +
                                result.toString());
                        Toast.makeText(getBaseContext(), "Google Play services connection failed. Cause: " +
                                result.toString(), Toast.LENGTH_LONG).show();

                    }
                })
                .build();
    }
}

GoogleApiClient is deprecated according to the new updates.根据新的更新,GoogleApiClient 已被弃用。 As well as the HistoryApi is also deprecated.以及 HistoryApi 也已弃用。 So first have to use the GoogleSignInAccount instead of GoogleApiClient and also use HistoryClient of Google Fit instead of HistoryApi.所以首先必须使用 GoogleSignInAccount 而不是 GoogleApiClient 并且还要使用 Google Fit 的 HistoryClient 而不是 HistoryApi。

Setting Fitness Options设置健身选项

 val fitnessOptions: GoogleSignInOptionsExtension = FitnessOptions.builder()
        .addDataType(TYPE_STEP_COUNT_DELTA, FitnessOptions.ACCESS_READ).build()

Setting Google SignIn Option设置 Google 登录选项

val googleSignInOptions =
        GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .addExtension(fitnessOptions).requestEmail().build()
    val googleSignInClient = GoogleSignIn.getClient(requireActivity(), googleSignInOptions)
    val signIntent = googleSignInClient.signInIntent
    startActivityForResult(signIntent, 0)

Getting Account获取帐号

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    if (requestCode == 0 && resultCode == Activity.RESULT_OK) {
        val task = GoogleSignIn.getSignedInAccountFromIntent(data)
        val account = task.getResult(ApiException::class.java)
        if (account != null) {
            getGoogleFitData(account)
        }
    }
}

Now for getting step data现在获取步骤数据

val response: Task<DataReadResponse> =
            Fitness.getHistoryClient(mContext, mSignInAccount)
                .readData(
                    DataReadRequest.Builder()
                        .read(TYPE_STEP_COUNT_DELTA)
                        .setTimeRange(
                            startTime,
                            endTime,
                            TimeUnit.MILLISECONDS
                        )
                        .build()
                )

        val readDataResult: DataReadResponse? = Tasks.await(response)
        val dataSet: DataSet = readDataResult!!.getDataSet(TYPE_STEP_COUNT_DELTA)

        var total = 0
        if (!dataSet.isEmpty) {
            val dataPoints = dataSet.dataPoints
            if (dataPoints.size > 0) {
                for (i in 0 until dataPoints.size) {
                    total += dataSet.dataPoints[i].getValue(Field.FIELD_STEPS).asInt()
                }
                Log.e(TAG, "Total Steps : $total")
            }
        }
  • Here startTime and endTime are timemills of any date and time.这里的 startTime 和 endTime 是任何日期和时间的 timemills。

Thank You.谢谢你。

Check out this official documentation from Google on how to read the data from Fit:查看 Google 的官方文档,了解如何从 Fit 读取数据:

// Setting a start and end date using a range of 1 week before this moment.
Calendar cal = Calendar.getInstance();
Date now = new Date();
cal.setTime(now);
long endTime = cal.getTimeInMillis();
cal.add(Calendar.WEEK_OF_YEAR, -1);
long startTime = cal.getTimeInMillis();

java.text.DateFormat dateFormat = getDateInstance();
Log.i(TAG, "Range Start: " + dateFormat.format(startTime));
Log.i(TAG, "Range End: " + dateFormat.format(endTime));

DataReadRequest readRequest = new DataReadRequest.Builder()
        // The data request can specify multiple data types to return, effectively
        // combining multiple data queries into one call.
        // In this example, it's very unlikely that the request is for several hundred
        // datapoints each consisting of a few steps and a timestamp.  The more likely
        // scenario is wanting to see how many steps were walked per day, for 7 days.
        .aggregate(DataType.TYPE_STEP_COUNT_DELTA, DataType.AGGREGATE_STEP_COUNT_DELTA)
        // Analogous to a "Group By" in SQL, defines how data should be aggregated.
        // bucketByTime allows for a time span, whereas bucketBySession would allow
        // bucketing by "sessions", which would need to be defined in code.
        .bucketByTime(1, TimeUnit.DAYS)
        .setTimeRange(startTime, endTime, TimeUnit.MILLISECONDS)
        .build();

History API Sample app on GitHub: GitHub 上的历史 API 示例应用程序:

Check the sample project on GitHub here .此处查看 GitHub 上的示例项目。

Direct link to MainActivity.java (in the above sample project) containing the required code: Link直接链接到包含所需代码的MainActivity.java (在上面的示例项目中): 链接

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM