Google Fit là gì? Tạo app sức khỏe sử dụng Google Fit

0
134

Gần đây, các bạn nghe thấy rất nhiều xu hướng ứng dụng mobile vào chăm sóc sức khỏe đúng 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. 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ì? Và tự xây dựng một ứng dụng sử dụng Google fit.

Hướng dẫn 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 chúng ta có 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 hoàn toàn được lưu trữ trực tuyến và hoàn toàn uy tín và 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.

Có thể kể đến một số ứng dụng sức khỏe đình đám như: Samsung Health, Apple Health…

#Các loại 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 hôm nay mình sẽ hướng dẫn các bạn theo dõi số bước chân trong 1 ngày hoặc 1 tuần hoặc 1 tháng.

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

1. Google Fit là gì? Đăng ký Google Fit như thế nào?

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.

2. Thêm thư viện Google Fit

Đầ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.

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;
    }
}

Và đây là kết quả

#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é.

 

Bình luận. Đặt câu hỏi cũng là một cách học

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