Google Fit là gì? Xây dựng app theo dõi sức khỏe cho Android cực dễ

Dịch vụ dạy kèm gia sư lập trình

Gần đây, các bạn có nghe về xu hướng ứng dụng mobile vào chăm sóc sức khỏe không? Google cũng đã cho ra mắt nền tảng Google Fit để hỗ trợ developer tự xây dựng ứng dụng sức khỏe mà không cần phải là chuyên gia y tế. Vậy Google Fit là gì? Cách sử dụng như thế nào?

Bài viết này, chúng ta sẽ cùng nhau tìm hiểu xem Google Fit là gì? Sau đó là một ví dụ xây dựng ứng dụng theo dõi bước chân bằng cách sử dụng Google Fit.

#Google Fit là gì?

Google Fit là một phần trong gói Google Play Services, cho phép chúng ta có thể theo dõi được sức khoẻ của người dùng. Các dữ liệu có thể lấy được theo ngày và tuần tháng năm tuỳ nhu cầu sử dụng.

Ngoài ra, các dữ liệu người dùng hoàn toàn được lưu trữ trực tuyến và đảm bảo uy tín, an toàn.

Các ông lớn trong làng công nghệ đều đã tham gia và coi đó là chiến lược phát triển quan trọng.

Một số ứng dụng sức khỏe trùm sò mà mọi người đã biết như: Samsung Health, Apple Health…

#Các loại API của Google Fit

Google Fit cho Android bao gồm nhiều loại API khác nhau, cho phép developer thực hiện các công việc cụ thể.

Có thể phân loại các loại API của Google Fit như sau:

  • Sensors(Cảm biến): Cho phép truy cập dữ liệu từ cảm biến trên thiết bị.
  • Recording: cho phép người dùng đăng ký vào phần dữ liệu cụ thể và tự động lưu trữ chúng.
  • History: Dùng để truy cập vào các lịch sử các dữ liệu đã đẩy lên server.
  • Sessions: Thực hiện việc ghi chéplại dữ liệu trong một khoảng thời gian để tổng hợp thông tin.
  • Bluetooth Low Energy: cho phép ứng dụng của bạn truy cập vào dữ liệu cảm biến từ các thiết bị đeo hỗ trợ Google Fit

Qua phần giới thiệu trên hẳn là bạn đã hiểu được phần nào Google Fit là gì. Bài viết này mình sẽ hướng dẫn các bạn xây dựng một ứng dụng theo dõi số bước chân người dùng theo ngày. Ứng dụng này rất phù hợp với các Running man, chịu khó tập thể dục nâng cao sức khỏe.

#Thiết lập dự án theo dõi bước chân

1. Đăng ký tài khoản Google Fit

Trước khi người dùng sử dụng thì bạn cần phải đăng ký thông qua Google develop console.

Các bạn hãy đăng ký với google developes console tại đây.

Và các bạn cần phải tạo ra một client ID OAuth 2.0.

Hướng dẫn sử dụng Google Fit

Nếu bạn nào chưa có project nào thì tạo mới, còn có rồi thì các bạn chọn vào project mình muốn thiết lập.

Sau đó các bạn hãy search với từ khóa “fit” rồi enable google fit.
Hướng dẫn sử dụng Google Fit Rồi các bạn nhấn vào Credentials.

xay-dung-ung-dung-suc-khoe-su-dung-google-fit-3

tạo project trong android studio như bình thường rồi add tên gói và sha1 vào để cài đặt.

Cuối cùng các bạn lấy API key tại đây.

💥 Có ích cho bạn: Đăng nhập không cần mật khẩu với Account Kit Android

2. Thêm thư viện Google Fit vào dự án

Đầu tiên các bạn hãy mở tập tin build.gradle để thêm các dependencies cần thiết(Nhớ nhấn nút sync sau khi thay đổi)

compile 'com.google.android.gms:play-services-fitness:11.6.0'
compile 'com.google.android.gms:play-services-auth:11.6.0'

Bây giờ là bạn đã có đầy đủ các lớp và phương thức đầy đủ của google fit.

3. Tạo giao diện ứng dụng

Mình sẽ thiết kế layout đầy đủ như sau đây.

Hướng dẫn sử dụng Google Fit
Giao diện ứng dụng theo dõi bước chân

Mình thiết kế cả spinner để các bạn lựa chọn các type mà google fit hỗ trợ:

  mDataTypeList.add(DataType.TYPE_STEP_COUNT_DELTA);
  mDataTypeList.add(DataType.TYPE_STEP_COUNT_CUMULATIVE);
  mDataTypeList.add(DataType.TYPE_STEP_COUNT_CADENCE);
  mDataTypeList.add(DataType.TYPE_ACTIVITY_SEGMENT);
  mDataTypeList.add(DataType.TYPE_CALORIES_EXPENDED);
  mDataTypeList.add(DataType.TYPE_BASAL_METABOLIC_RATE);
  mDataTypeList.add(DataType.TYPE_POWER_SAMPLE);
  mDataTypeList.add(DataType.TYPE_ACTIVITY_SAMPLE);
  mDataTypeList.add(DataType.TYPE_HEART_RATE_BPM);
  mDataTypeList.add(DataType.TYPE_LOCATION_SAMPLE);
  mDataTypeList.add(DataType.TYPE_LOCATION_TRACK);
  mDataTypeList.add(DataType.TYPE_DISTANCE_DELTA);
  mDataTypeList.add(DataType.TYPE_DISTANCE_CUMULATIVE);
  mDataTypeList.add(DataType.TYPE_SPEED);
  mDataTypeList.add(DataType.TYPE_CYCLING_WHEEL_REVOLUTION);
  mDataTypeList.add(DataType.TYPE_CYCLING_WHEEL_RPM);
  mDataTypeList.add(DataType.TYPE_CYCLING_PEDALING_CUMULATIVE);
  mDataTypeList.add(DataType.TYPE_CYCLING_PEDALING_CADENCE);
  mDataTypeList.add(DataType.TYPE_HEIGHT);
  mDataTypeList.add(DataType.TYPE_WEIGHT);
  mDataTypeList.add(DataType.TYPE_BODY_FAT_PERCENTAGE);
  mDataTypeList.add(DataType.TYPE_NUTRITION);
  mDataTypeList.add(DataType.TYPE_WORKOUT_EXERCISE);

  mDataTypeList.add(DataType.AGGREGATE_ACTIVITY_SUMMARY);
  mDataTypeList.add(DataType.AGGREGATE_BASAL_METABOLIC_RATE_SUMMARY);
  mDataTypeList.add(DataType.AGGREGATE_STEP_COUNT_DELTA);
  mDataTypeList.add(DataType.AGGREGATE_DISTANCE_DELTA);
  mDataTypeList.add(DataType.AGGREGATE_CALORIES_EXPENDED);
  mDataTypeList.add(DataType.AGGREGATE_HEART_RATE_SUMMARY);
  mDataTypeList.add(DataType.AGGREGATE_LOCATION_BOUNDING_BOX);
  mDataTypeList.add(DataType.AGGREGATE_POWER_SUMMARY);
  mDataTypeList.add(DataType.AGGREGATE_SPEED_SUMMARY);
  mDataTypeList.add(DataType.AGGREGATE_BODY_FAT_PERCENTAGE_SUMMARY);
  mDataTypeList.add(DataType.AGGREGATE_WEIGHT_SUMMARY);
  mDataTypeList.add(DataType.AGGREGATE_NUTRITION_SUMMARY);

4.Viết các phương thức trong activity

Trong hàm oncreate() các bạn hãy khởi tạo GoogleApiClient.

mClient = new GoogleApiClient.Builder(this)
        .addApi(Fitness.HISTORY_API)
        .addScope(new Scope(Scopes.FITNESS_ACTIVITY_READ))
        .addScope(new Scope(Scopes.FITNESS_BODY_READ))
        .addScope(new Scope(Scopes.FITNESS_LOCATION_READ))
        .addScope(new Scope(Scopes.FITNESS_NUTRITION_READ))
        .addConnectionCallbacks(this)
        .addOnConnectionFailedListener(this)
        .build();

Sau đó chúng ta sẽ cần tạo connect và disconnect trong hàm onStart()onDestroy()

@Override
protected void onStart() {
    super.onStart();
    mClient.connect();
}

@Override
protected void onStop() {
    super.onStop();
    if (mClient.isConnected()) {
        mClient.disconnect();
    }
}

Và các bạn hãy kế thừa 2 lớp này để lắng nghe sự kiện người dùng đồng ý hay chấp nhận xác thực:

  • GoogleApiClient.ConnectionCallbacks·
  • GoogleApiClient.OnConnectionFailedListener
public class HistoryActivity extends Activity implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener

Ở hàm onActivityResult các bạn hãy connect khi có thông tin người dùng.

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    if (requestCode == REQUEST_OAUTH && resultCode == RESULT_OK) {
        if (!mClient.isConnecting() && !mClient.isConnected()) {
            mClient.connect();
        }
    }
}

Và đây là hàm quan trọng nhất hãy sử dụng AsynTask vì nó sẽ update lại giao diện. Hàm này giúp đọc các lịch sử bước đi của chúng ta theo hàng tháng năm và ngày.

public class ReadFromHistoryTask extends AsyncTask<Void, Void, Void> {
        protected Void doInBackground(Void... params) {

            long endTime = mEndDateCalendar.getTimeInMillis();
            long startTime = mStartDateCalendar.getTimeInMillis();
            DataReadResult dataReadResult = null;
            if(isDataAggregated) {
                mAggregateDataTypeList.addAll(DataType.getAggregatesForInput(mSelectedDataType));
                if(mAggregateDataTypeList.size()>0) {
                    DataReadRequest readRequest = new DataReadRequest.Builder()
                            .aggregate(mSelectedDataType, mAggregateDataTypeList.get(0))
                            .bucketByTime(1, TimeUnit.DAYS)
                            .setTimeRange(startTime, endTime, TimeUnit.MILLISECONDS)
                            .build();
                    dataReadResult = Fitness.HistoryApi.readData(mClient,readRequest).await();
                } else {
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            mResultsText.setText("Aggregation of data not supported");
                            mListAdapter.notifyDataSetChanged();
                        }
                    });
                }
            } else {
                DataReadRequest readRequest = new DataReadRequest.Builder().read(mSelectedDataType)
                        .setTimeRange(startTime, endTime, TimeUnit.MILLISECONDS).build();
                dataReadResult = Fitness.HistoryApi.readData(mClient, readRequest).await();
            }
            if(isDataAggregated) {
                if(mAggregateDataTypeList.size()>0 && dataReadResult!=null) {
                    readBucketValues(dataReadResult);
                }
            } else {
                DataSet dataSet = dataReadResult.getDataSet(mSelectedDataType);
                readDataSetValues(dataSet, false);
            }
            return null;
        }
    }

Mình cũng sắp xếp lọc dữ liệu theo ngày và random các bạn chỉ cần check vào checkbox aggregate data by day.

Mình cũng sử dụng listview để get các sữ liệu lấy được để nhìn trực quan hơn.

👏 Xem cách sử dụng Listview ở đây: Sử dụng ListView/RecyclerView trong Android

public class ListAdapter extends BaseAdapter {

    private TextView mTextView1;
    private TextView mTextView2;
    private TextView mTextView3;

    @Override
    public int getCount() {

        return mDataPointList.size();
    }

    @Override
    public Object getItem(int position) {

        return mDataPointList.get(position);
    }

    @Override
    public long getItemId(int position) {

        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        if(convertView==null){

            convertView = getLayoutInflater().inflate(R.layout.list_rows, parent, false);
        }

        StringBuilder dataValue = new StringBuilder();
        for (Field field : mDataPointList.get(position).getDataType().getFields())
        {
            Value val = mDataPointList.get(position).getValue(field);
            dataValue.append("Name: " + field.getName() + "  Value: " + val.toString());

        }

        mTextView1 = (TextView)convertView.findViewById(R.id.text1);
        mTextView1.setText("Data Type: "+ mDataPointList.get(position).getDataType().getName());
        mTextView2 = (TextView)convertView.findViewById(R.id.text2);
        mTextView2.setText(dataValue.toString());
        mTextView3 = (TextView)convertView.findViewById(R.id.text3);
        mTextView3.setText("Start Time: " + mSimpleDateFormat.format(mDataPointList.get(position).getStartTime(TimeUnit.MILLISECONDS)) +
                "\nEnd Time: " + mSimpleDateFormat.format(mDataPointList.get(position).getEndTime(TimeUnit.MILLISECONDS)));

        return convertView;
    }
}

Đã xong! Hãy build và tận hưởng thành quả nhé.

#Tạm kết

Hy vọng bài viết này sẽ giúp bạn phần nào hiểu google fit là gì và tự viết được google fit của riêng mình.

Các bạn download toàn bộ source code của bài viết tại đây.

Nếu bài viết có ích thì chia sẻ để ủng hộ mình. Đừng quên để lại cảm nhận bên dưới phần bình luận nhé.

👏 Đọc thêm bài viết về lập trình Android:

Dịch vụ phát triển ứng dụng mobile giá rẻ - chất lượng
Bài trướcHeadless CMS là gì? Có nên quan tâm tới Headless CMS lúc này?
Bài tiếp theoNhững câu lệnh git quan trọng mà bạn dùng hằng ngày
Lương Văn Đông
Tất cả lập trình viên đều là những nhà viết kịch và tất cả máy tính đều là những diễn viên tồi.

Bình luận. Cùng nhau thảo luận nhé!

avatar
  Theo dõi bình luận  
Thông báo