在当今世界,移动设备是我们日常生活中必不可少的一部分,我们在走路、跑步、开车以及其他许多活动时都会使用移动设备。
了解用户拿着手机的时候在做什么,可以让你的应用程序根据用户的动作进行直观的调整。对于某些应用程序,确定用户何时开始或停止某个特定活动可能是必要的。例如,一个应用程序可以在用户开始跑步的时候在后台启动音乐,或者计算燃烧的卡路里数。
在今天的文章中,我们将学习如何在Android中检测和识别用户活动,这样,你的应用程序将在与用户交互方面更加智能化,并能够提供高度定制的体验。
为此,我们将使用Activity Recognition Transition API。这个库建立在可用的设备传感器(陀螺仪、加速计等)上,以高精度检测用户活动的变化。此外,也许最重要的是,它消耗更少的电力。
本篇文章假定你已有使用Kotlin和AndroidX构建安卓应用程序的经验.
项目设置
首先在Android Studio中创建一个新项目,或者打开一个现有的项目,在其中添加活动识别功能。
首先要配置的是依赖项。在应用程序的build.gradle文件添加如下行:
首先要配置的是依赖项。在应用程序的build.gradle文件添加如下行:
dependencies {//.... other dependenciesimplementation "com.google.android.gms:play-services-location:17.0.0"implementation 'androidx.localbroadcastmanager:localbroadcastmanager:1.0.0'
}
接下来,在AndroidManifest.xml添加权限:
接下来,在AndroidManifest.xml添加权限:
<!-- Required for 28 and below -->
<uses-permission android:name="com.google.android.gms.permission.ACTIVITY_RECOGNITION" /><!-- Required for 29+. -->
<uses-permission android:name="android.permission.ACTIVITY_RECOGNITION" />
注意:在API 29及以上,您需要动态请求权限。
活动类型
Transition API使您能够检测到用户的多种活动类型—下面是列表:
- IN_VEHICLE: 表示设备在车内
- ON_BICYCLE: 表示设备在自行车上
- RUNNING: 表示设备用户在跑步
- ON_FOOT: 表示设备用户正在走路或者跑步
- STILL: 表示设备没有在移动
- WALKING: 表示设备用户在走路
API还让您知道特定的活动是即将开始还是即将结束。这由转换类型表示:
- ACTIVITY_TRANSITION_ENTER: 用户开始特定活动
- ACTIVITY_TRANSITION_EXIT: 用户推出特定活动
在接下来的几节中,我们需要知道我们要查找的类型和活动名称。
建立一个API请求
为了告诉API要监控哪些活动,我们需要事先知道活动名称和转换类型。然后,我们创建一个ActivityTransition对象的列表,并从这个列表中创建activityTransitionRequest对象来构造请求。
下面我们来看看如何实现这一点:
val
接收结果
在继续之前,我们需要设置一个地方来接收API的更新。例如,一个更新可以是用户进入IN_VEHICLE,即进入车内活动。
我们可以通过使用BroadcastReceiver类来实现这一点。我们通过扩展BroadcastReceiver类来创建所需的类,然后重写onReceive()方法以从API接收更新。
在onReceive()方法中,我们在检测到活动后执行所需的操作—可以向用户发送通知,也可以启动后台服务—实际上由您来决定检测到指定活动后如何做。
以下是我们的BroadcastReceiver的实现:
import
我们使用两个辅助函数activityType和transitionType将整数常量转换为字符串。
连接组件
现在,我们有了一个接收器可以处理API发送的更新,我们可以告诉API从哪里发送。具体步骤如下:
首先,我们创建一个Intent,使用我们定义的变量RECEIVER_ACTION作为参数。
接着,我们从广播接收器和上面的intent创建一个PendingIntent。
val
在这之后,我们创建一个我们的接收器的实例,并把它注册到LocalBroadcastManager中,使用我们指定的RECEIVER_ACTION作为IntentFilter。
receiver
让我进一步解释一下这一步。我们知道,BroadcastReceiver可以接收和响应来自其他应用程序或系统的广播消息。但是要做到这一点,首先需要注册这个接收器,我们在上面的代码中使用LocalBroadcastManager进行注册。
当我们注册一个广播接收器时,我们还需要指定响应什么,换句话说,要监听和响应什么事件。我们用自定义的行为RECEIVER_ACTION构建IntentFilter来实现这一点。
作为最后一步,我们请求ActivityRecognition API使用前面创建的PendingIntent和ActivityTransitionRequest进行更新。
val
以下是前面步骤的完整代码片段:
// creating the pending intent
停止跟踪
在某个时间点,如果您想取消并停止来自API的更新,可以在onStop()或onDestroy()方法,或者在您认为有必要停止跟踪的任何位置执行此操作。
我们需要做两件事来停止识别活动:
- 注销接收器以停止接收传入数据。
- 告诉API从我们的接收器中删除更新。
下面的topActivityRecognition()-您可以定义并在必要时调用:
private
结论
我们在本文中看到了如何检测你的用户的行为,并根据需要作出响应。您可以使用这个强大的API为用户提供高度可定制和身临其境的体验。
原文链接