Android 开发者需要知道的 Google Awareness API

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.

个性化的智能服务不可避免地需要用到用户的部分隐私数据,作为用户,为了获得更智能的服务和体验,也需要出让部分隐私数据。作为负责任的开发者,我们需要精心设计应用的功能,为用户提供这些服务,同时做到不打扰用户,不让用户感到不适,当然,最重要的是保护好用户的数据。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容