Mendeteksi kapan pengguna memulai atau mengakhiri aktivitas

Anda mungkin perlu mendesain aplikasi agar mengidentifikasi kapan pengguna memulai atau berhenti melakukan aktivitas tertentu, seperti berjalan, bersepeda, atau mengemudi. Misalnya, aplikasi pelacak jarak tempuh dapat mulai melacak mil saat pengguna mulai mengemudi, atau aplikasi pesan dapat membisukan semua percakapan sampai pengguna berhenti mengemudi.

Activity Recognition Transition API dapat digunakan untuk mendeteksi perubahan pada aktivitas pengguna. Aplikasi Anda berlangganan ke transisi dalam aktivitas yang diminati dan API akan memberi tahu aplikasi Anda hanya saat dibutuhkan. Halaman ini menunjukkan cara menggunakan Activity Recognition Transition API, yang lebih singkatnya disebut dengan Transition API.

Menyiapkan project

Untuk menggunakan Transition API di aplikasi, Anda harus mendeklarasikan dependensi ke Google Location and Activity Recognition API versi 12.0.0 atau yang lebih tinggi dan menetapkan izin com.google.android.gms.permission.ACTIVITY_RECOGNITION di manifes aplikasi.

  1. Untuk mendeklarasikan dependensi ke API tersebut, tambahkan referensi ke repositori Google maven dan tambahkan entri implementasi ke com.google.android.gms:play-services-location:12.0.0 ke bagian dependensi file build.gradle aplikasi Anda. Untuk informasi selengkapnya, buka Menyiapkan Layanan Google Play.
  2. Untuk menetapkan izin com.google.android.gms.permission.ACTIVITY_RECOGNITION, tambahkan elemen <uses-permission> di manifes aplikasi, seperti yang ditunjukkan di contoh berikut:

     <manifest xmlns:android="http://schemas.android.com/apk/res/android"
                 package="com.example.myapp">
    
           <uses-permission android:name="com.google.android.gms.permission.ACTIVITY_RECOGNITION" />
           …
         </manifest>
        

Mendaftar ke pembaruan transisi aktivitas

Untuk mulai menerima notifikasi terkait transisi aktivitas, Anda harus mengimplementasikan berikut ini:

Untuk membuat objek ActivityTransitionRequest, Anda harus membuat daftar objek ActivityTransition, yang mewakili transisi yang ingin Anda terima notifikasinya. Objek ActivityTransition mencakup data berikut:

Kode berikut menunjukkan cara membuat daftar objek ActivityTransition:

Kotlin

    val transitions = mutableListOf<ActivityTransition>()

    transitions +=
            ActivityTransition.Builder()
              .setActivityType(DetectedActivity.IN_VEHICLE)
              .setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_ENTER)
              .build()

    transitions +=
            ActivityTransition.Builder()
              .setActivityType(DetectedActivity.IN_VEHICLE)
              .setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_EXIT)
              .build()

    transitions +=
            ActivityTransition.Builder()
              .setActivityType(DetectedActivity.WALKING)
              .setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_EXIT)
              .build()
    

Java

    List<ActivityTransition> transitions = new ArrayList<>();

    transitions.add(
            new ActivityTransition.Builder()
              .setActivityType(DetectedActivity.IN_VEHICLE)
              .setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_ENTER)
              .build());

    transitions.add(
            new ActivityTransition.Builder()
              .setActivityType(DetectedActivity.IN_VEHICLE)
              .setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_EXIT)
              .build());

    transitions.add(
            new ActivityTransition.Builder()
              .setActivityType(DetectedActivity.WALKING)
              .setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_EXIT)
              .build());
    

Anda dapat membuat objek ActivityTransitionRequest dengan meneruskan daftar ActivityTransitions ke class ActivityTransitionRequest, seperti yang ditunjukkan di contoh berikut:

Kotlin

    val request = ActivityTransitionRequest(transitions)
    

Java

    ActivityTransitionRequest request = new ActivityTransitionRequest(transitions);
    

Anda dapat mendaftar untuk pembaruan transisi aktivitas dengan meneruskan instance ActivityTransitionRequest dan objek PendingIntent ke metode requestActivityTransitionUpdates(). Metode requestActivityTransitionUpdates() menampilkan objek Task yang dapat Anda periksa kesuksesan atau kegagalannya, seperti yang ditunjukkan di contoh kode berikut:

Kotlin

    // myPendingIntent is the instance of PendingIntent where the app receives callbacks.
    val task = ActivityRecognition.getClient(context)
            .requestActivityTransitionUpdates(request, myPendingIntent)

    task.addOnSuccessListener {
        // Handle success
    }

    task.addOnFailureListener { e: Exception ->
        // Handle error
    }
    

Java

    // myPendingIntent is the instance of PendingIntent where the app receives callbacks.
    Task<Void> task = ActivityRecognition.getClient(context)
              .requestActivityTransitionUpdates(request, myPendingIntent);

    task.addOnSuccessListener(
        new OnSuccessListener<Void>() {
            @Override
            public void onSuccess(Void result) {
                // Handle success
            }
        }
    );

    task.addOnFailureListener(
        new OnFailureListener() {
            @Override
            public void onFailure(Exception e) {
                // Handle error
            }
        }
    );
    

Setelah berhasil mendaftar untuk pembaruan transisi aktivitas, aplikasi Anda menerima notifikasi di PendingIntent yang terdaftar.

Memproses peristiwa transisi aktivitas

Saat transisi aktivitas yang diminta terjadi, aplikasi Anda akan menerima callback Intent. Objek ActivityTransitionResult dapat diekstrak dari Intent, yang mencakup daftar objek ActivityTransitionEvent. Peristiwa diurutkan secara kronologis, misalnya, jika aplikasi meminta jenis aktivitas IN_VEHICLE di transisi ACTIVITY_TRANSITION_ENTER dan ACTIVITY_TRANSITION_EXIT, maka aplikasi menerima objek ActivityTransitionEvent saat pengguna mulai mengemudi, dan menerima objek lain lagi saat pengguna bertransisi ke aktivitas lainnya.

Anda dapat mengimplementasikan callback dengan membuat subclass BroadcastReceiver dan mengimplementasikan metode onReceive() untuk mendapatkan daftar peristiwa transisi aktivitas. Untuk informasi selengkapnya, buka Siaran. Contoh berikut menunjukkan cara mengimplementasikan metode onReceive():

Kotlin

    override fun onReceive(context: Context, intent: Intent) {
        if (ActivityTransitionResult.hasResult(intent)) {
            val result = ActivityTransitionResult.extractResult(intent)!!
            for (event in result.transitionEvents) {
                // chronological sequence of events....
            }
        }
    }
    

Java

    @Override
    public void onReceive(Context context, Intent intent) {
        if (ActivityTransitionResult.hasResult(intent)) {
            ActivityTransitionResult result = ActivityTransitionResult.extractResult(intent);
            for (ActivityTransitionEvent event : result.getTransitionEvents()) {
                // chronological sequence of events....
            }
        }
    }
    

Membatalkan pendaftaran pembaruan transisi aktivitas

Anda dapat membatalkan pendaftaran pembaruan transisi aktivitas dengan memanggil metode removeActivityTransitionUpdates() dari ActivityRecognitionClient dan meneruskan objek PendingIntent Anda sebagai parameter, seperti yang ditunjukkan di contoh berikut:

Kotlin

    // myPendingIntent is the instance of PendingIntent where the app receives callbacks.
    val task = ActivityRecognition.getClient(context)
            .removeActivityTransitionUpdates(myPendingIntent)

    task.addOnSuccessListener {
        myPendingIntent.cancel()
    }

    task.addOnFailureListener { e: Exception ->
        Log.e("MYCOMPONENT", e.message)
    }
    

Java

    // myPendingIntent is the instance of PendingIntent where the app receives callbacks.
    Task<Void> task = ActivityRecognition.getClient(context)
            .removeActivityTransitionUpdates(myPendingIntent);

    task.addOnSuccessListener(
        new OnSuccessListener<Void>() {
            @Override
            public void onSuccess(Void result) {
                myPendingIntent.cancel();
            }
        }
    );

    task.addOnFailureListener(
        new OnFailureListener() {
            @Override
            public void onFailure(Exception e) {
                Log.e("MYCOMPONENT", e.getMessage());
            }
        }
    );