사용자가 언제 도보, 자전거, 운전과 같은 특정 활동을 시작하거나 중지하는지를 식별하도록 앱을 설계해야 할 수 있습니다. 예를 들어 사용자가 운전을 시작하면 마일리지 추적 앱이 이동 거리를 추적하거나, 사용자가 운전을 중지할 때까지 메시지 앱이 모든 대화를 숨길 수 있습니다.
Activity Recognition Transition API는 사용자 활동의 변화를 감지하는 데 사용할 수 있습니다. 앱은 관심 있는 활동의 전환을 구독하고 API는 필요할 때만 앱에 알림을 보냅니다. 이 페이지에서는 Activity Recognition Transition API(Transition API라고도 함)를 사용하는 방법을 보여줍니다.
프로젝트 설정
앱에서 Transition API를 사용하려면 Google Location and Activity Recognition API 버전 12.0.0 이상의 종속 항목을 선언하고 앱 매니페스트에서 com.google.android.gms.permission.ACTIVITY_RECOGNITION
권한을 지정해야 합니다.
- API 종속 항목을 선언하려면 Google Maven 저장소에 참조를 추가하고
com.google.android.gms:play-services-location:12.0.0
의 구현 항목을 앱build.gradle
파일의 종속 항목 섹션에 추가합니다. 자세한 내용은 Google Play 서비스 설정을 참고하세요. com.google.android.gms.permission.ACTIVITY_RECOGNITION
권한을 지정하려면 다음 예와 같이 앱 매니페스트에<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
객체 - 앱이 알림을 수신하는
PendingIntent
콜백. 자세한 내용은 대기 중인 인텐트 사용을 참고하세요.
ActivityTransitionRequest
객체를 만들려면 알림을 받으려는 전환을 나타내는 ActivityTransition
객체의 목록을 만들어야 합니다. ActivityTransition
객체에는 다음 데이터가 포함됩니다.
DetectedActivity
클래스로 표시되는 활동 유형. Transition API는 다음과 같은 활동을 지원합니다.ACTIVITY_TRANSITION_ENTER
또는ACTIVITY_TRANSITION_EXIT
의 전환 유형. 자세한 내용은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);
ActivityTransitionRequest
및 PendingIntent
객체의 인스턴스를 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_ENTER
및 ACTIVITY_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.... } } }
활동 전환 업데이트의 등록 취소
다음 예와 같이 ActivityRecognitionClient
의 removeActivityTransitionUpdates()
메서드를 호출하고 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) }
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()); } } );
추가 리소스
사용자 활동 감지 API 사용에 관한 자세한 내용은 다음 자료를 참고하세요.
샘플
샘플: 사용자 활동 감지를 위한 권장사항을 보여줍니다.