您可能需要设计您的应用来识别用户何时开始或停止特定活动,例如步行、骑自行车或驾驶。例如,里程追踪应用可以在用户开始驾驶时开始追踪里程,或者消息应用可以在用户停止驾驶之前静音所有会话。
Activity Recognition Transition API 可用于检测用户活动的更改。您的应用订阅感兴趣的活动转换,API 只在需要时通知您的应用。本页介绍如何使用 Activity Recognition Transition API(简称 Transition API)。
设置您的项目
要在您的应用中使用 Transition API,您必须声明对版本 12.0.0 或更高版本的 Google Location and Activity Recognition API 的依赖项,并在应用清单中指定 com.google.android.gms.permission.ACTIVITY_RECOGNITION
权限。
- 要声明对 API 的依赖项,请在应用的
build.gradle
文件的 dependencies 部分添加对 Google Maven 仓库的引用,并添加com.google.android.gms:play-services-location:12.0.0
的 implementation 条目。如需了解更多信息,请参阅设置 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
回调,您的应用将在其中接收通知。如需了解更多信息,请参阅使用 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()
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());
您可以通过将 ActivityTransitions
列表传递给 ActivityTransitionRequest
类来创建 ActivityTransitionRequest
对象,如以下示例所示:
Kotlin
val request = ActivityTransitionRequest(transitions)
Java
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 }
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 } } );
成功注册活动转换更新后,您的应用会在注册的 PendingIntent
中接收通知。
处理活动转换事件
当请求的活动转换发生时,您的应用会收到一个 Intent
回调。可以从 Intent
中提取一个 ActivityTransitionResult
对象,其中包含一个 ActivityTransitionEvent
对象列表。这些事件按时间顺序排列,例如,如果应用请求 IN_VEHICLE
活动类型的 ACTIVITY_TRANSITION_ENTER
和 ACTIVITY_TRANSITION_EXIT
转换,那么当用户开始驾驶时,它会收到一个 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.... } } }
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.... } } }
取消注册活动转换更新
您可以通过调用 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 的用法,请查看以下资料:
示例
示例,演示用户活动识别的最佳实践。