Advertisement
  1. Code
  2. Android SDK

Google Fit cho Android: Đọc dữ liệu từ cảm biến

Scroll to top
This post is part of a series called Google Fit for Android.
Google Fit for Android: An Overview
Google Fit for Android: Recording API

Vietnamese (Tiếng Việt) translation by Dai Phong (you can also view the original English article)

Giới thiệu

Google Fit là một nền tảng cho phép các nhà phát triển xây dựng các ứng dụng tập trung vào dữ liệu sức khẻo của người dùng. Một trong những công cụ mà Google đã cung cấp là Google Fit cho Android, trong đó tồn tại như là một gói nằm trong Google Play Services.

Mặc dù có rất nhiều các API khác nhau có sẵn cho Google Fit, như đã thảo luận trong bài viết tổng quan này trên Envato Tuts+, nhưng hướng dẫn này tập trung vào việc thiết lập và sử dụng Google Fit để đọc dữ liệu cảm biến trên một thiết bị Android. Một dự án mẫu cho hướng dẫn này có thể được tìm thấy trên GitHub.

1. Thiết lập Developer Console

Để sử dụng Google Fit cho Android, bạn cần phải:

  • kích hoạt Fitness API trong Google Developers Console
  • tạo một client ID OAuth 2.0
  • kết nối với Fitness API trong ứng dụng Android của bạn

Phần này hướng dẫn bạn cách làm thế nào để thiết lập ứng dụng Android của bạn và Fitness API. Bạn có thể bắt đầu bằng cách truy cập Google Developers Console. Nếu bạn đã làm việc với một dự án, bạn có thể bỏ qua bước tiếp theo. Nếu không, hãy làm theo chúng và tạo ra một dự án mới cho ứng dụng Google Fit của bạn.

Bước 1: Tạo một dự án

Để tạo một dự án mới, nhấp vào nút Create Project màu xanh ở góc trên bên trái của màn hình.

Create Project Button on the Google Cloud PlatformCreate Project Button on the Google Cloud PlatformCreate Project Button on the Google Cloud Platform

Điều này trình bày cho bạn một hộp thoại yêu cầu nhập tên dự án. Đối với hướng dẫn này, tôi đã tạo ra một dự án và đặt tên nó là TutsPlusGoogleFit. Có một số giới hạn về cách đặt tên cho dự án của bạn. Chỉ có chữ cái, số, dấu ngoặc kép, dấu gạch ngang, khoảng trắng, và dấu chấm than là được phép.

New Project Naming Field on the Google Cloud PlatformNew Project Naming Field on the Google Cloud PlatformNew Project Naming Field on the Google Cloud Platform

Khi bạn nhấn Create, một hộp thoại xuất hiện ở góc dưới bên phải của trang, cho thấy dự án đang được tạo ra.

Creating New Project Dialog on Google Cloud PlatformCreating New Project Dialog on Google Cloud PlatformCreating New Project Dialog on Google Cloud Platform

Bước 2: Kích hoạt Google Fit API

Với dự án đã được thiết lập, bạn sẽ được dẫn đến trang Tổng quan của dự án. Cách dễ nhất để tìm Google Fit API là bằng cách tìm kiếm từ khóa "fit". Chọn Fitness API từ kết quả hiện ra.

Search Box for Fitness APISearch Box for Fitness APISearch Box for Fitness API

Bấm vào Enable API để kích hoạt Fitness API.

Enable API Button for Fitness APIEnable API Button for Fitness APIEnable API Button for Fitness API

Sau khi kích hoạt Fitness API, bạn nhận được một cảnh báo cho bạn biết rằng bạn cũng cần tạo ra các chứng chỉ để sử dụng Fitness API. May mắn thay, cảnh báo bao gồm một nút đưa chúng ta đến trang Credentials.

Go to Credentials Button After Enabling the Fitness APIGo to Credentials Button After Enabling the Fitness APIGo to Credentials Button After Enabling the Fitness API

Bước 3: Tạo chứng chỉ

Trên trang Credentials, bạn cần cung cấp một số thông tin chung về ứng dụng của bạn trong Credentials Wizard. Xác định rằng bạn đang sử dụng Fitness API, rằng API được gọi từ một ứng dụng Android, và ứng dụng cần truy cập vào dữ liệu người dùng.

Credentials Configuration ScreenCredentials Configuration ScreenCredentials Configuration Screen

Tiếp theo, nhấp vào What credentials do I need? ở phía dưới để tiếp tục và tạo ra một client ID OAuth 2.0 cho ứng dụng Android của bạn. Bạn cần hai mẫu thông tin quan trọng cho bước này:

  • signing-certificate fingerprint
  • Tên gói cho ứng dụng

Bạn có thể nhận được signing-certificate fingerprint bằng cách mở một Terminal hoặc giao diện dòng lệnh, và điều hướng đến vị trí signing-certificate của ứng dụng. Đây có thể là khoá phát hành của bạn hoặc chứng chỉ debug.keystore mặc định mà Android Studio sử dụng. Một khi bạn đã chuyển đến keystore của bạn, bạn có thể tạo ra SHA1 cần thiết với lệnh sau, trong đó debug.keystore là tên của signing-certificate.

1
keytool -list -v -keystore debug.keystore
Keystore Data Output From TerminalKeystore Data Output From TerminalKeystore Data Output From Terminal

Dán khoá SHA1 vào trường SHA1 và nhập com.tutsplus.googlefit vào trường Package name.

Creating an OAuth 20 Client IDCreating an OAuth 20 Client IDCreating an OAuth 20 Client ID

Cuối cùng, bạn cần phải cấu hình màn hình thoả thuận OAuth 2.0. Đây là màn hình được hiển thị cho người dùng để họ có thể cấp quyền cho ứng dụng của bạn để sử dụng dữ liệu sức khoẻ của họ. Bước này đòi hỏi email và tên sản phẩm để hiển thị cho người dùng. Đối với hướng dẫn này, tôi đã nhập Tuts+ Google Fit.

Configuring the Fitness API Consent ScreenConfiguring the Fitness API Consent ScreenConfiguring the Fitness API Consent Screen

Nhấp vào Continue và, trên trang tiếp theo, nhấp Done để kết thúc quá trình thiết lập.

Bước 4: Thiết lập dự án Android

Với dự án của bạn đã được thiết lập và cấu hình trên Google Developer Console, bạn có thể bắt đầu tạo một dự án Android mới. Hãy chắc chắn rằng tên gói trùng với cái mà bạn đã nhập trong Google Developer Console và thiết lập ứng dụng sử dụng các nền tảng Phone and Tablet với một phiên bản SDK tối thiểu là 14. Level API tối thiểu cho Google Fit là 9. Tạo một Activity rỗng để giữ cho dự án cơ bản sạch sẽ để bạn có thể tập trung vào Google Fit API trong hướng dẫn này.

Sau khi thiết lập dự án, mở tập tin build.gradle của dự án và nhập gói fitness từ Google Play Services bằng cách thêm dòng sau vào dependencies.

1
compile 'com.google.android.gms:play-services-fitness:8.4.0'

Tiếp theo, mở MainActivity.java và thêm các giao diện sau:

  • OnDataPointListener
  • GoogleApiClient.ConnectionCallback
  • GoogleApiClient.OnConnectionFailedListener

Một khi bạn đã thêm các phương thức cần thiết cho các giao diện này, lớp của bạn sẽ trông giống như sau:

1
public class MainActivity extends AppCompatActivity implements OnDataPointListener,
2
        GoogleApiClient.ConnectionCallbacks,
3
        GoogleApiClient.OnConnectionFailedListener {
4
5
    @Override
6
    protected void onCreate(Bundle savedInstanceState) {
7
        super.onCreate(savedInstanceState);
8
        setContentView(R.layout.activity_main);
9
    }
10
11
    @Override
12
    public void onConnected(Bundle bundle) {
13
14
    }
15
16
    @Override
17
    public void onConnectionSuspended(int i) {
18
19
    }
20
21
    @Override
22
    public void onConnectionFailed(ConnectionResult connectionResult) {
23
24
    }
25
26
    @Override
27
    public void onDataPoint(DataPoint dataPoint) {
28
29
    }
30
}

Cuối cùng nhưng không kém phần quan trọng, tạo ra các biến thành viên mà bạn sẽ sử dụng cho hướng dẫn này. Bạn có thể sao chép những dòng sau vào trên cùng của lớp:

1
private static final int REQUEST_OAUTH = 1;
2
private static final String AUTH_PENDING = "auth_state_pending";
3
private boolean authInProgress = false;
4
private GoogleApiClient mApiClient;

Trong bước tiếp theo, bạn sẽ kết nối đến Google Play Services và học cách truy cập dữ liệu sức khoẻ của người dùng trong ứng dụng của bạn.

2. Sử dụng Fitness API

Bước 1: Kết nối đến Google Play Services

Với dự án đã được thiết lập trong Android Studio và Google Developer Console, đã đến lúc để đi sâu vào Fitness API. Trong phương thức onCreate(), bạn hãy kiểm tra xem ứng dụng của bạn đã cố gắng để được cấp phép Fitness API hay chưa. Sau đó bạn khởi tạo đối tượng GoogleApiClient bằng cách thêm Fitness Sensors API, xác định phạm vi và đăng ký các hàm callback trong ứng dụng. Nếu bạn không yêu cầu một phạm vi, ứng dụng của bạn sẽ không được cấp quyền đối với Fitness Sensors API.

1
@Override
2
protected void onCreate(Bundle savedInstanceState) {
3
    super.onCreate(savedInstanceState);
4
    setContentView(R.layout.activity_main);
5
6
    if (savedInstanceState != null) {
7
        authInProgress = savedInstanceState.getBoolean(AUTH_PENDING);
8
    }
9
10
    mApiClient = new GoogleApiClient.Builder(this)
11
            .addApi(Fitness.SENSORS_API)
12
            .addScope(new Scope(Scopes.FITNESS_ACTIVITY_READ_WRITE))
13
            .addConnectionCallbacks(this)
14
            .addOnConnectionFailedListener(this)
15
            .build();
16
17
}

Sau khi khởi tạo đối tượng GoogleApiClient, bạn cần phải làm cho nó kết nối với back-end của Google. Bạn có thể làm điều này trong onStart().

1
@Override
2
protected void onStart() {
3
    super.onStart();
4
    mApiClient.connect();
5
}

Lần đầu tiên người dùng chạy ứng dụng, kết nối với Fitness API sẽ thất bại bởi vì người dùng phải cấp quyền cho ứng dụng của bạn để truy cập vào dữ liệu sức khoẻ của họ. Bạn có thể lắng nghe sự kiện này trong onConnectionFailed() và phản ứng phù hợp bằng cách kiểm tra xem việc cấp quyền có được tiến hành hay chưa. Nếu có, hãy gọi startResolutionForResult() để cho Google Play Services có thể xử lý quyền được người dùng cấp để sử dụng những thông tin của họ.

1
@Override
2
public void onConnectionFailed(ConnectionResult connectionResult) {
3
    if( !authInProgress ) {
4
        try {
5
            authInProgress = true;
6
            connectionResult.startResolutionForResult( MainActivity.this, REQUEST_OAUTH );
7
        } catch(IntentSender.SendIntentException e ) {
8
9
        }
10
    } else {
11
        Log.e( "GoogleFit", "authInProgress" );
12
    }
13
}

Nếu bạn chạy ứng dụng của bạn ngay bây giờ, bạn có thể thấy một hộp thoại yêu cầu bạn chọn một tài khoản Google để sử dụng nếu bạn đã sử dụng nhiều tài khoản trên thiết bị của bạn.

Google Play Services Email Selection ScreenGoogle Play Services Email Selection ScreenGoogle Play Services Email Selection Screen

Khi hệ điều hành biết tài khoản để sử dụng, ứng dụng của bạn sẽ đưa ra một hộp thoại mới yêu cầu người dùng cấp phép cho ứng dụng đọc dữ liệu sức khoẻ.

Google Play Services Consent ScreenGoogle Play Services Consent ScreenGoogle Play Services Consent Screen

Ở giai đoạn này, người dùng hoặc cấp phép ứng dụng của bạn để sử dụng dữ liệu của họ hoặc họ đóng hộp thoại lại, hủy bỏ quá trình này. Bạn có thể lắng nghe cả hai sự kiện trong onActivityResult() và xử lý kết quả. Nếu người dùng cấp phép cho ứng dụng của bạn, thì ứng dụng của bạn nhận được một phản hồi RESULT_OK và sau đó nó có thể cố gắng để kết nối với client Google API.

1
@Override
2
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
3
    if( requestCode == REQUEST_OAUTH ) {
4
        authInProgress = false;
5
        if( resultCode == RESULT_OK ) {
6
            if( !mApiClient.isConnecting() && !mApiClient.isConnected() ) {
7
                mApiClient.connect();
8
            }
9
        } else if( resultCode == RESULT_CANCELED ) {
10
            Log.e( "GoogleFit", "RESULT_CANCELED" );
11
        }
12
    } else {
13
        Log.e("GoogleFit", "requestCode NOT request_oauth");
14
    }
15
}

Ứng dụng của bạn bây giờ có thể kết nối thành công tới Google Play Services. Với những gì đã có, bạn có thể bắt đầu tập trung vào Fitness API.

Bước 2: Truy cập vào dữ liệu số bước đi Với Fitness API

Khi đối tượng GoogleApiClient của bạn đã kết nối với Google, hàm callback onConnected() được kích hoạt. Trong hàm callback này, bạn cần phải tạo ra một đối tượng DataSourcesRequest mới định nghĩa các kiểu dữ liệu mà ứng dụng của bạn quan tâm đến. Bạn cũng cần phải tạo ra một ResultCallback để xử lý những gì mà ứng dụng nên làm nếu số bước chân có thể được lấy từ thiết bị. Với các đối tượng được tạo ra, hãy gọi Fitness.SensorsApi.findDataSources() để bắt đầu tìm kiếm một nguồn dữ liệu số bước chân hợp lệ.

1
@Override
2
public void onConnected(Bundle bundle) {
3
    DataSourcesRequest dataSourceRequest = new DataSourcesRequest.Builder()
4
            .setDataTypes( DataType.TYPE_STEP_COUNT_CUMULATIVE )
5
            .setDataSourceTypes( DataSource.TYPE_RAW )
6
            .build();
7
8
    ResultCallback<DataSourcesResult> dataSourcesResultCallback = new ResultCallback<DataSourcesResult>() {
9
        @Override
10
        public void onResult(DataSourcesResult dataSourcesResult) {
11
            for( DataSource dataSource : dataSourcesResult.getDataSources() ) {
12
                if( DataType.TYPE_STEP_COUNT_CUMULATIVE.equals( dataSource.getDataType() ) ) {
13
                    registerFitnessDataListener(dataSource, DataType.TYPE_STEP_COUNT_CUMULATIVE);
14
                }
15
            }
16
        }
17
    };
18
19
    Fitness.SensorsApi.findDataSources(mApiClient, dataSourceRequest)
20
            .setResultCallback(dataSourcesResultCallback);
21
}

Bạn có thể thấy rằng phương thức registerFitnessDataListener() không thực sự tồn tại. Đây là một phương thức trợ giúp được gọi khi nguồn dữ liệu cho số bước chân được tìm thấy, sau đó tạo ra một đối tượng SensorRequest cho việc yêu cầu dữ liệu từ cảm biến đếm bước chân.

Trong đoạn code sau đây, đối tượng SensorRequest cố gắng để tìm ra số bước chân mỗi ba giây. Fitness.SensorApi sau đó thêm yêu cầu với một OnDataPointListener mới, do đó, khi dữ liệu mới sẵn có, listener được kích hoạt. Nếu không có dữ liệu mới được tìm thấy, OnDataPointListener không được kích hoạt và Fitness API chờ thêm ba giây trước khi kiểm tra một lần nữa.

1
private void registerFitnessDataListener(DataSource dataSource, DataType dataType) {
2
3
    SensorRequest request = new SensorRequest.Builder()
4
            .setDataSource( dataSource )
5
            .setDataType( dataType )
6
            .setSamplingRate( 3, TimeUnit.SECONDS )
7
            .build();
8
9
    Fitness.SensorsApi.add( mApiClient, request, this )
10
            .setResultCallback(new ResultCallback<Status>() {
11
                @Override
12
                public void onResult(Status status) {
13
                    if (status.isSuccess()) {
14
                        Log.e( "GoogleFit", "SensorApi successfully added" );
15
                    }
16
                }
17
            });
18
}

Khi một sự thay đổi trong việc đếm số bước chân được phát hiện, thì onDataPoint() được gọi. Trong phương thức này, bạn lặp qua các trường trong tham số DataPoint và hiển thị một thông báo Toast với tên trường và giá trị. Trong ví dụ này, đó sẽ là đếm số bước chân. Trong các ứng dụng của riêng bạn, bạn sẽ sử dụng logic thích hợp hơn để thực hiện nhiệm vụ của mình. Bạn sẽ nhận thấy rằng lệnh Toast được gói trong một Runnable được truyền vào runOnUiThread. Điều này là bởi vì hàm callback không được kích hoạt trên tiến trình UI.

1
@Override
2
public void onDataPoint(DataPoint dataPoint) {
3
    for( final Field field : dataPoint.getDataType().getFields() ) {
4
        final Value value = dataPoint.getValue( field );
5
        runOnUiThread(new Runnable() {
6
            @Override
7
            public void run() {
8
                Toast.makeText(getApplicationContext(), "Field: " + field.getName() + " Value: " + value, Toast.LENGTH_SHORT).show();
9
            }
10
        });
11
    }
12
}
Toast Message Showing the Steps Data OutputToast Message Showing the Steps Data OutputToast Message Showing the Steps Data Output

Có hai điều bạn cần phải làm cho ví dụ này. Việc đầu tiên là ngắt kết nối khỏi SensorApi và Google Play Services khi bạn sử dụng xong chúng. Trong ví dụ này, bạn làm điều đó khi onStop() được gọi. Việc thứ hai là lưu trữ các giá trị authInProgress mà được kiểm tra bằng phương thức onCreate() trong onSavedInstanceState().

1
@Override
2
protected void onStop() {
3
    super.onStop();
4
5
    Fitness.SensorsApi.remove( mApiClient, this )
6
            .setResultCallback(new ResultCallback<Status>() {
7
                @Override
8
                public void onResult(Status status) {
9
                    if (status.isSuccess()) {
10
                        mApiClient.disconnect();
11
                    }
12
                }
13
            });
14
}
15
16
@Override
17
protected void onSaveInstanceState(Bundle outState) {
18
    super.onSaveInstanceState(outState);
19
    outState.putBoolean(AUTH_PENDING, authInProgress);
20
}

Tổng kết

Trong hướng dẫn này, bạn đã học được cách làm thế nào để kết nối tới Fitness API của Google Play Services và đọc dữ liệu cảm biến theo dõi sức khoẻ từ thiết bị của người dùng. Ngay cả một thứ gì đó đơn giản như dữ liệu số bước đi cho người dùng của bạn có thể minh chứng đây là điều vô cùng quý giá đối với các ứng dụng như mặt đồng hồ Android Wear hay theo dõi mục tiêu. Có hàng tá các loại nguồn dữ liệu khác nhau mà bạn có thể sử dụng và nhiều hàm API khác trong Google Fit để làm cho ứng dụng của bạn tốt hơn.

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.