사용자가 활동을 시작하거나 종료할 때 감지

사용자가 언제 도보, 자전거, 운전과 같은 특정 활동을 시작하거나 중지하는지를 식별하도록 앱을 설계해야 할 수 있습니다. 예를 들어 사용자가 운전을 시작하면 마일리지 추적 앱이 마일을 추적하거나, 사용자가 운전을 중단할 때까지 메시지 앱이 모든 대화를 숨길 수 있습니다.

Activity Recognition Transition API는 사용자 활동의 변화를 감지하는 데 사용할 수 있습니다. 앱은 관심 있는 활동의 전환을 구독하고 API는 필요할 때만 앱에 알림을 보냅니다. 이 페이지에서는 Activity Recognition Transition API(Transition API라고도 함)를 사용하는 방법을 보여줍니다.

프로젝트 설정

앱에서 Transition API를 사용하려면 Google Location and Activity Recognition API 버전 12.0.0 이상에의 종속성을 선언하고 앱 manifest에서 com.google.android.gms.permission.ACTIVITY_RECOGNITION 권한을 지정해야 합니다.

  1. API에의 종속성을 선언하려면 Google Maven 저장소에 참조를 추가하고 com.google.android.gms:play-services-location:12.0.0의 구현 항목을 앱 build.gradle 파일의 종속성 섹션에 추가합니다. 자세한 내용은 Google Play 서비스 설정을 참고하세요.
  2. com.google.android.gms.permission.ACTIVITY_RECOGNITION 권한을 지정하려면 다음의 예와 같이 앱 manifest의 <uses-permission> 요소를 추가합니다.

     <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>
        

활동 전환 업데이트 등록

활동 전환에 관한 알림을 받으려면 다음을 구현해야 합니다.

ActivityTransitionRequest 객체를 만들려면 알림을 받을 전환을 나타내는 ActivityTransition 객체의 목록을 만들어야 합니다. ActivityTransition 객체에는 다음 데이터가 포함됩니다.

다음 코드는 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()
    

자바

    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());
    

다음 예와 같이 ActivityTransitions의 목록을 ActivityTransitionRequest 클래스에 전달하여 ActivityTransitionRequest 객체를 만들 수 있습니다.

Kotlin

    val request = ActivityTransitionRequest(transitions)
    

자바

    ActivityTransitionRequest request = new ActivityTransitionRequest(transitions);
    

ActivityTransitionRequestPendingIntent 객체의 인스턴스를 requestActivityTransitionUpdates() 메서드에 전달하여 활동 전환 업데이트를 등록할 수 있습니다. 다음 코드 예와 같이 requestActivityTransitionUpdates() 메서드는 성공 또는 실패를 확인할 수 있는 Task 객체를 반환합니다.

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
    }
    

자바

    // 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
            }
        }
    );
    

활동 전환 업데이트를 성공적으로 등록하면 앱이 등록된 PendingIntent에서 알림을 받습니다.

활동 전환 이벤트 처리

요청된 활동 전환이 발생하면 앱은 Intent 콜백을 받습니다. ActivityTransitionResult 객체는 Intent에서 추출될 수 있으며, 여기에는 ActivityTransitionEvent 객체의 목록이 포함됩니다. 이벤트는 시간 순서대로 정렬됩니다. 예를 들어 앱이 ACTIVITY_TRANSITION_ENTERACTIVITY_TRANSITION_EXIT 전환의 IN_VEHICLE 활동 유형을 요청하는 경우, 사용자가 운전을 시작하면 ActivityTransitionEvent 객체를 수신하고 사용자가 다른 활동으로 전환하면 다른 객체를 수신합니다.

활동 전환 이벤트의 목록을 가져오려면 BroadcastReceiver의 서브클래스를 만들고 onReceive() 메서드를 구현하여 콜백을 구현할 수 있습니다. 자세한 내용은 브로드캐스트를 참조하세요. 다음 예에서는 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....
            }
        }
    }
    

자바

    @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....
            }
        }
    }
    

활동 전환 업데이트의 등록 취소

다음의 예와 같이 ActivityRecognitionClientremoveActivityTransitionUpdates() 메서드를 호출하고 PendingIntent 객체를 매개변수로 전달하여 활동 전환 업데이트의 등록을 취소할 수 있습니다.

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)
    }
    

자바

    // 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());
            }
        }
    );