Google 在 I/O 2016 大会上正式向开发者介绍了 Awareness API:
A unified sensing platform enabling applications to be aware of multiple aspects of a users context, while managing battery and memory health.
Google 将 Google Play Service 中和用户场景识别相关的服务和功能整合在一个统一的 API 下,为开发者从兼顾内存占用和电量消耗方面提供更高效率的方案。
Google 定义的场景识别
Google 在 Awareness API 的文档中,对智能化所需的场景是 这样描述 的:
具体来说:
- 时间:系统当地时间。
- 地点:当前用户位置,该位置的区域类别信息。
- 行为:用户正在做什么事。
- 近场 Beacons:附近有哪些 Beacon 设备。
- 设备状态:耳机是否已经接入设备等。
- 环境信息:光照、气压等。
为了提供这些数据采集能力,Awareness API 提供了两种类型的服务:
- Fence API:可对用户周围的环境变化做出反应。Fence API 可以将多种场景条件结合在一起,当这些条件满足时通过广播通知用户,及时此时订阅了该广播的应用处于后台。
- Snapshot API:通过一个简单的接口获取由 7 种信号描述的用户当前的场景信息。Google 通过智能缓存和跨应用响应改善了电量消耗和内存占用。
相比直接通过系统接口采集相关传感器数据,使用 Awareness API 有哪些优势呢,Google 提到:
- 更易集成:只要引入 Google Play Service,通过 Awareness API 一个接口,就可以获得所有场景相关数据,提高集成效率和生产率。
- 更高质量的场景数据:Awareness API 返回的数据是 Google 通过专门优化算法对原始传感器数据处理后的结果,质量更好,更适合于相关业务开发。
- 更好的电池和内存效率:Google Play Service 在后台做数据处理,所有安装的应用都可以根据需要获取这些数据,无需自己通过直接的传感器数据采集实现场景识别,节省大量电量和内存的消耗。
Awareness API 的集成
Awareness API 的集成文档 为开发者提供了详细的集成步骤和一些 Best Practices。
申请使用 Awareness API 的 AppKey
以及相应功能的 Credentials
为了在应用中集成 Awareness API, 我们首先需要登录 developer console,创建一个新的 Project:
选择刚刚创建的工程 AwarenessDemo
,进入 API Manager,添加相关权限:
然后,提供应用的 Package Name
和用来对应用进行签名的证书 SHA1
指纹生成 APIKey
:
That's it! 这样就生成了一个可以调用 Awareness API 的 key,我们后面将在 AndroidManifest.xml
中对其进行配置。
应用集成配置
我们需要使用 SDK Manager 将 Google play Service 更新到最新版本,也就是 9.2.1 版本以上。
在 Android Studio 中创建一个新的 Android 应用,该应用的
Package Name
必须和上面生成APIKey
时使用到的包名相同。-
在应用的
build.gradle
中添加对 Google Play Service 的依赖:dependencies { ... compile 'com.google.android.gms:play-services-contextmanager:9.2.1' }
-
在
AndroidManifest.xml
文件中添加 Awareness API 所需的权限:<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="com.google.android.gms.permission.ACTIVITY_RECOGNITION" />
-
同样在
AndroidManifest.xml
文件中,添加APIKey
的配置:<application> <meta-data android:name="com.google.android.awareness.API_KEY" android:value="YOUR_API_KEY" /> <meta-data android:name="com.google.android.geo.API_KEY" android:value="YOUR_API_KEY" /> <meta-data android:name="com.google.android.nearby.messages.API_KEY" android:value="YOUR_API_KEY" /> ... </application>
用刚才生成的
APIKey
替换YOUR_API_KEY
。
代码集成
-
在应用自定义的
Application
类中通过下面的方式进行GoogleApiClient
的初始化:private GoogleApiClient mGoogleApiClient; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mGoogleApiClient = new GoogleApiClient.Builder(MainActivity.this) .addApi(Awareness.API) .build(); mGoogleApiClient.connect(); // 其他代码 }
-
GoogleApiClient
初始化后,在我们需要获取 Awareness API 提供的场景数据时,就可以直接调用com.google.android.gms.awareness.Awareness
类了。比如实时识别的用户行为数据,可以通过下面的代码获取:Awareness.SnapshotApi.getDetectedActivity(mGoogleApiClient) .setResultCallback(new ResultCallback<DetectedActivityResult>() { @Override public void onResult(@NonNull DetectedActivityResult detectedActivityResult) { if (!detectedActivityResult.getStatus().isSuccess()) { Log.e(TAG, "Could not detect user activity"); mUserActivityTextView.setText("--Could not detect user activity--"); mUserActivityTextView.setTextColor(Color.RED); return; } ActivityRecognitionResult arResult = detectedActivityResult.getActivityRecognitionResult(); DetectedActivity probableActivity = arResult.getMostProbableActivity(); Log.i(TAG, probableActivity.toString()); } });
当这里为止,我们已经成功集成了 Awareness API。需要注意的是,对于 Awareness API 可以提供的有些数据,需要 Enable
相应的 API,在 Library
中搜索启用即可:
比如用户周围的 POI 数据,查找 place
API 并启用就可以了。
Best Practices
由于 Awareness API 提供了较为隐私的用户数据,所以我们在应用中使用该 API 时,需要注意不要滥用,管理好用户的期望。Google 提出了下面的最佳实践建议:
- Be mindful of user expectations,也就是说考虑这些功能和应用提供服务的统一性,不要设计和实现容易导致用户疑惑和恐慌的功能。
- Be conservative with notifications,管理好通知,不必要不要打扰用户,提供友好的交互。
- Conserve system health,注意不要涉及过于复杂的场景,避免电量和内存的过度消耗。
- Use the Awareness API for awareness,仅在需要的时候使用 Awareness API。
正如对 Awareness API 同样感兴趣,并且写了一篇 非常好的体验文章 的作者提到的:
Be aware that while some uses of the Awareness API can make your app feel smart, delightful and intuitive, too much use, or usage in an unexpected way can have the opposite effect and make your app users uncomfortable, and your app feel creepy. Remember, similar to great power, with great APIs, comes great responsibility. Use at your own discretion.
Google Android Team 的一个开发者也在 Using the Awareness API for Android 文章中提到:
Always explain how you’re using their context, and what you’re doing with the data — both on the device, and especially if that data is being stored or transmitted.
Don’t transmit or store location or contact details unless that’s clear to the user, and a critical part of your app’s functionality.
Have a clear privacy policy that’s easy for users to find and understand.
If you are storing any context data, make it simple and easy for users to erase it — both on their device and on your servers.
个性化的智能服务不可避免地需要用到用户的部分隐私数据,作为用户,为了获得更智能的服务和体验,也需要出让部分隐私数据。作为负责任的开发者,我们需要精心设计应用的功能,为用户提供这些服务,同时做到不打扰用户,不让用户感到不适,当然,最重要的是保护好用户的数据。