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.
Nội dung chính của bài viết
#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.
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.
Rồi các bạn nhấn vào Credentials.
Và 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.
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()
và 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:
Bình luận. Cùng nhau thảo luận nhé!