12/08/2018, 13:15

Google Fit for Android: Recording API

Như mình đã giới thiệu ở bài viết trước https://viblo.asia/bui.huu.tuan/posts/7eEREJVVMgNj, hôm nay mình sẽ hướng dẫn các bạn sử dụng chi tiết một API cụ thể của Google Fit, đó là Recording API. Nhắc lại một chút, Google Fit là một nền tảng cho phép các lập trình viên xây dựng các ứng dụng tập ...

Như mình đã giới thiệu ở bài viết trước https://viblo.asia/bui.huu.tuan/posts/7eEREJVVMgNj, hôm nay mình sẽ hướng dẫn các bạn sử dụng chi tiết một API cụ thể của Google Fit, đó là Recording API.

Nhắc lại một chút, Google Fit là một nền tảng cho phép các lập trình viên xây dựng các ứng dụng tập trung vào dữ liệu tập thể dục của người dùng. Một trong những công cụ Google đã cung cấp là Google Fit cho Android, được tích hợp sẵn trong Google Play Services.

Trong khi có rất nhiều các API khác nhau có sẵn cho Google Fit, bài viết này tập trung vào việc sử dụng Google Fit để tạo các đăng ký cho dữ liệu sensor. Chúng ta sẽ tìm hiểu làm thế nào để tận dụng Google Play Services để lưu trữ dữ liệu tập thể dục để nó có thể được truy cập tại một thời gian sau đó.

Các Recording API khác với các Sensors API ở chỗ dữ liệu sensor không được chuyển giao trực tiếp cho các API Recording, thay vào đó chúng được lưu giữ trực tuyến để ghi lại các hoạt động của người dùng.

1.Thiết lập Project

Bước 1. Thiết lập Developer Console

Để sử dụng Google Fit, bạn cần tạo một OAuth 2.0 client ID và đăng kí ứng dụng của mình thông qua Google Developer Console.

Bước 2. Tạo Android Project

Một khi bạn đã có ứng dụng được thiết lập trong Google Developer Console, hãy sử dụng packagename đã đăng kí để tạo một ứng dụng Android mới với min SDK là 14 và một Activity rỗng.

Với ứng dụng vừa được tạo ra ở trên, mở file build.gradle và tích hợp Google Play Services như sau :

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

Bạn nên thêm các gói Google Play Services cần thiết cho ứng dụng của mình. Trước khi chúng ta bắt đầu vào chi tiết Java code, mở activity_main.xml chúng ta sẽ thêm 2 Button sử dụng để chứng minh một số tính năng của Recording API :

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_awidth="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <Button
        android:id="@+id/btn_show_subscriptions"
        android:layout_awidth="match_parent"
        android:layout_height="wrap_content"
        android:text="Show Subscriptions"/>
    <Button
        android:id="@+id/btn_cancel_subscriptions"
        android:layout_awidth="match_parent"
        android:layout_height="wrap_content"
        android:text="Cancel Subscriptions"/>
</LinearLayout>

Khi app đã chạy, bạn sẽ thấy giao diện như sau :

layout.png

Để hoàn thành việc thiết lập, mở MainActivity.java và implement các callbacks sau cùng các hàm yêu cầu của chúng :

    GoogleApiClient.ConnectionCallbacks
    GoogleAPiClient.OnConnectionFailedListener
    View.OnClickListener

Bên cạnh đó hãy khai báo một số biến như sau :

    public class MainActivity extends AppCompatActivity implements
    GoogleApiClient.ConnectionCallbacks,
    GoogleApiClient.OnConnectionFailedListener,
    View.OnClickListener {

    private Button mCancelSubscriptionsBtn;
    private Button mShowSubscriptionsBtn;

    private ResultCallback<Status> mSubscribeResultCallback;
    private ResultCallback<Status> mCancelSubscriptionResultCallback;
    private ResultCallback<ListSubscriptionsResult> mListSubscriptionsResultCallback;

    private GoogleApiClient mGoogleApiClient;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    public void onConnected(@Nullable Bundle bundle) {
        Log.e("RecordingAPI", "onConnected");
    }

    @Override
    public void onConnectionSuspended(int i) {
        Log.e("RecordingAPI", "onConnectionSuspended");
    }

    @Override
    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
        Log.e("RecordingAPI", "onConnectionFailed");
    }

    @Override
    public void onClick(View v) {
    }
}

2.Khởi tạo

Trước khi bạn bắt đầu dùng callback và các biến đã khai báo ở trên, bạn cần khởi tạo chúng. Chúng ta sẽ viết hai phương thức, một để khởi tạo các view và một để khởi tạo callback ở trong onCreate().

Hàm initViews() sẽ khởi tạo các view được khai báo ở trên :

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    initViews();
    initCallbacks();
    }

    private void initViews() {
    mCancelSubscriptionsBtn = (Button) findViewById(R.id.btn_cancel_subscriptions);
    mShowSubscriptionsBtn = (Button) findViewById(R.id.btn_show_subscriptions);

    mCancelSubscriptionsBtn.setOnClickListener(this);
    mShowSubscriptionsBtn.setOnClickListener(this);
    }

Trong hàm initCallbacks(), mỗi callback được sử dụng cho một hoạt động không đồng bộ cụ thể. Đúng như tên của nó, mSubscribeResultCallback được gọi ngay khi lần đầu tiên bạn thêm vào một theo dõi cho một sensor, và mListSubscriptionResultCallback được dùng khi bạn một yêu cầu danh sách của tất cả các theo dõi.

Trong đoạn code dưới đây, hai phương thức tương ứng với việc bắt đầu và kết thúc một theo dõi sẽ ghi ra kết qủa thành công hay thất bại. mListSubscriptionResultCallback sẽ nhận một danh sách các theo dõi và ghi ra thông tin của chúng bằng cách lấy DataType và mỗi Field liên kết với một theo dõi.

    private void initCallbacks() {
    mSubscribeResultCallback = new ResultCallback<Status>() {
        @Override
        public void onResult(@NonNull Status status) {
            if (status.isSuccess()) {
                if (status.getStatusCode() == FitnessStatusCodes.SUCCESS_ALREADY_SUBSCRIBED) {
                    Log.e( "RecordingAPI", "Already subscribed to the Recording API");
                } else {
                    Log.e("RecordingAPI", "Subscribed to the Recording API");
                }
            }
        }
    };

    mCancelSubscriptionResultCallback = new ResultCallback<Status>() {
        @Override
        public void onResult(@NonNull Status status) {
            if (status.isSuccess()) {
                Log.e( "RecordingAPI", "Canceled subscriptions!");
            } else {
                // Subscription not removed
                Log.e("RecordingAPI", "Failed to cancel subscriptions");
            }
        }
    };

    mListSubscriptionsResultCallback = new ResultCallback<ListSubscriptionsResult>() {
        @Override
        public void onResult(@NonNull ListSubscriptionsResult listSubscriptionsResult) {
            for (Subscription subscription : listSubscriptionsResult.getSubscriptions()) {
                DataType dataType = subscription.getDataType();
                Log.e( "RecordingAPI", dataType.getName() );
                for (Field field : dataType.getFields() ) {
                    Log.e( "RecordingAPI", field.toString() );
                }
            }
        }
    };
    }

3.Kết nối và điều khiển các theo dõi

Bây giờ bạn đã có framework chung cho ứng dụng mẫu của mình, đã đến lúc để tập hợp mọi thứ lại bằng cách kết nối đến Google Play Services và yêu cầu các theo dõi.

Trong hàm onCreate(), bạn có thể khởi tạo và kết nối tới Google Play Services bằng việc khai báo rằng bạn sử dụng Fitness.RECORDING_API, thêm một scope cho việc đọc dữ liệu thể dục của activity, và thiết lập nó tự động kết nối/ngắt kết nối thông qua vòng đời của Activity :

    mGoogleApiClient = new GoogleApiClient.Builder(this)
        .addApi(Fitness.RECORDING_API)
        .addScope(new Scope(Scopes.FITNESS_ACTIVITY_READ))
        .addConnectionCallbacks(this)
        .enableAutoManage(this, 0, this)
        .build();

Tại bất kì thời điểm nào sau khi GoogleApiClient đã kết nối, bạn có thể yêu cầu một theo dõi. Trong bài viết này, bạn sẽ theo dõi trong hàm onConnected(). Đoạn code sau sẽ cho thấy làm thế nào để theo dõi sự thay đổi số bước đi của người dùng, qua đó bạn có thể truy cập bất cứ sensor nào mà Google Fit hỗ trợ.

Nếu một theo dõi đã chạy bởi vì một hành động trước đó, rồi callback nhận được một status code của FitnessStatusCodes.SUCCESS_ALREADY_SUBSCRIBED :

    @Override
    public void onConnected(@Nullable Bundle bundle) {
    Fitness.RecordingApi.subscribe(mGoogleApiClient, DataType.TYPE_STEP_COUNT_DELTA)
            .setResultCallback(mSubscribeResultCallback);
}

Thỉnh thoảng nó sẽ rất hữu ích để yêu cầu một danh sách các theo dõi. Trước đó, chúng ta đã tạo ra hai button để phục vụ các hoạt động này :

    @Override
    public void onClick(View v) {
    switch(v.getId()) {
        case R.id.btn_cancel_subscriptions: {
            cancelSubscriptions();
            break;
        }
        case R.id.btn_show_subscriptions: {
            showSubscriptions();
            break;
        }
    }
}

Nếu hàm showSubscriptions() được gọi, ứng dụng sẽ yêu cầu một danh sách các theo dõi liên kết với Recording API :

    private void showSubscriptions() {
    Fitness.RecordingApi.listSubscriptions(mGoogleApiClient)
            .setResultCallback(mListSubscriptionsResultCallback);
    }

Nó sẽ làm cho mListSubscriptionsResultCallback in ra tất cả các theo dõi đã được kết nối. Kết qủa như sau :

    .../com.tutsplus.googlefitrecordingapi E/RecordingAPI: com.google.step_count.delta
    .../com.tutsplus.googlefitrecordingapi E/RecordingAPI: steps(i)

Hủy một theo dõi sẽ đơn gianr như sau :

    private void cancelSubscriptions() {
    Fitness.RecordingApi.unsubscribe(mGoogleApiClient, DataType.TYPE_STEP_COUNT_DELTA)
            .setResultCallback(mCancelSubscriptionResultCallback);
}

4.Kết luận

Bây giờ bạn cần phải có một sự hiểu biết cơ bản về cách kết nối với Google Fit từ một ứng dụng Android và làm việc với các API Recording.

Trong khi điều này có vẻ như không nhiều ngay bây giờ, nhưng nó sẽ mở đường cho bạn để lưu trữ thông tin về các hoạt động thể chất của người dùng để họ có thể được truy cập bởi các API Google Fit khác trong ứng dụng của bạn.

Tham khảo : http://code.tutsplus.com/tutorials/google-fit-for-android-recording-api--cms-25855

0