I. Lời mở đầu

Đã bao giờ bạn phát triển một ứng dụng có thể giúp user dùng giọng nói của họ để thực hiện các tác vụ mong muốn? Việc ra lệnh bằng giọng nói sẽ tạo ra một trải nghiệm free-hand tuyệt vời cho user, họ như là những chủ nhân có thể sai khiến ứng dụng thực hiện các ý muốn của bản thân. Và với Google Voice Actions, mọi việc trở nên đơn giản hơn bao giờ hết! Với bài viết này, mình sẽ hướng dẫn các bạn tích hợp và xử lý thông tin thông qua Google Voice Actions một cách đơn giản nhất!

II. Các bước tiến hành

1. Định nghĩa Intent Filter trong manifest.xml

Để ứng dụng có thể nhận biết và xác định các hành động cụ thể thì chúng ta cần phải định nghĩa các Intent Filter tương ứng trong manifest.xml:

<activity ...>
    <intent-filter>
        <action android:name="android.intent.action.SET_ALARM"/>
        <category android:name="android.intent.category.DEFAULT"/>
    </intent-filter>
</activity>

Nếu user có ứng dụng khác cũng xử lý hành động tương tự thì user sẽ phải lựa chọn ứng dụng cụ thể.

2. Xử lý thông tin trong app

Khi ứng dụng nhận được intent, chúng ta cần phân tách dữ liệu để xử lý. Như ví dụ trên, chúng ta tạo một hành động cài đặt báo thức và việc phân tách intent sẽ như sau:

public class MainActivity extends Activity {

    private static final Uri ALARM_URI = Uri.parse("android-app://com.myclockapp/set_alarm_page");

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ...

        // Get the intent
        Intent intent = getIntent();
        if (AlarmClock.ACTION_SET_ALARM.equals(intent.getAction())) {
            if (intent.hasExtra(AlarmClock.EXTRA_HOUR)) {
                // Step 2: get the rest of the intent extras and set an alarm
                ...
            }
}
    }

    ...

}

3. Xử lý các hành động sau khi phân tách

App Indexing API sẽ cho phép chúng ta liệt kê toàn bộ các activity của ứng dụng. Sau đó, Google sẽ nhận dạng giọng nói và đưa ra các tác vụ phù hợp với từng activity.

Sau khi ứng dụng thực hiện tác vụ, chúng ta phải gọi phương thức AppIndexApi.end() ứng với mỗi loại tác vụ, ví dụ Action.TYPEADD. Chúng ta cũng nên thiết lập loại trạng thái tác vụ phù hợp để báo cáo xem tác vụ đó đã thành công hay chưa bằng cách gọi phương thức setActionStatus.

Ví dụ hoàn chỉnh bên dưới thể hiện cách xử lý một tác vụ cụ thể:

public class MainActivity extends Activity {

    private static final Uri ALARM_URI = Uri.parse("android-app://com.myclockapp/set_alarm_page");

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ...

        // Get the intent
        Intent intent = getIntent();
        if (AlarmClock.ACTION_SET_ALARM.equals(intent.getAction())) {
            if (intent.hasExtra(AlarmClock.EXTRA_HOUR)) {
                // Step 2: get the rest of the intent extras and set an alarm
                ...
            }

            // Step 3: report the action through the App Indexing API
            Thing alarm = new Thing.Builder()
                    .setName("Alarm for 4:00 PM")
                    .setDescription("Alarm set for 4:00 PM, with the 'Argon' ringtone"
                                    + " and vibrate turned on.")
                    .setUrl(APP_URI)
                    .build();

            Action setAlarmAction = new Action.Builder(Action.TYPE_ADD)
                    .setObject(alarm)
                    .setActionStatus(Action.STATUS_TYPE_COMPLETED)
                    .build();

            AppIndex.AppIndexApi.end(mClient, setAlarmAction);
        }
    }

    ...

}

III. Kết

Hy vọng với bài viết này, các bạn sẽ có thêm ý tưởng để mở rộng tính năng của ứng dụng nhằm đem lại cho người dùng những trải nghiệm tốt hơn!

Để tìm hiểu sâu hơn về khả năng của Google Voice Actions các bạn có thể tham khảo thêm tại đây