目录

在Manifest指定权限

在调用活动感知能力时,开发者需要先在Manifest中指定相应的权限。

  1. <!-- 活动识别权限(安卓10及以上),此权限为敏感权限,声明后还需在代码中动态申请 -->
  2. <uses-permission android:name="android.permission.ACTIVITY_RECOGNITION" />
  3. <!-- 活动识别权限(安卓9),此权限为敏感权限,声明后还需在代码中动态申请 -->
  4. <uses-permission android:name="com.huawei.hms.permission.ACTIVITY_RECOGNITION" />

导入接口类

使用活动状态感知能力,除需要导入情景感知服务的公共能力类外,还需要导入活动状态相关的类。

  1. import com.huawei.hmf.tasks.OnFailureListener;
  2. import com.huawei.hmf.tasks.OnSuccessListener;
  3. import com.huawei.hms.kit.awareness.Awareness;
  4. //导入活动识别快照相关类
  5. import com.huawei.hms.kit.awareness.capture.BehaviorResponse;
  6. import com.huawei.hms.kit.awareness.status.BehaviorStatus;
  7. import com.huawei.hms.kit.awareness.status.DetectedBehavior;
  8. //导入活动识别围栏相关类
  9. import com.huawei.hms.kit.awareness.barrier.AwarenessBarrier;
  10. import com.huawei.hms.kit.awareness.barrier.BarrierStatus;
  11. import com.huawei.hms.kit.awareness.barrier.BehaviorBarrier;
  12. import com.huawei.hms.kit.awareness.barrier.BarrierUpdateRequest;

能力开发

Capture能力开发

1. 获取Awareness Kit的“Capture Client”。

2. 通过“Capture Client”调用活动状态查询能力接口查询情景状态。

3. 监听情景感知服务结果返回,进行应用的业务处理。

  1. Awareness.getCaptureClient(this).getBehavior()
  2.        .addOnSuccessListener(new OnSuccessListener<BehaviorResponse>() {
  3.            @Override
  4.            public void onSuccess(BehaviorResponse behaviorResponse) {
  5.                BehaviorStatus behaviorStatus = behaviorResponse.getBehaviorStatus();
  6.                DetectedBehavior mostLikelyBehavior = behaviorStatus.getMostLikelyBehavior();
  7.                String str = "Most likely behavior type is " + mostLikelyBehavior.getType() +
  8.                        ",the confidence is " + mostLikelyBehavior.getConfidence();
  9.                Log.i(TAG, str);
  10.            }
  11.        })
  12.        .addOnFailureListener(new OnFailureListener() {
  13.            @Override
  14.            public void onFailure(Exception e) {
  15.                Log.e(TAG, "get behavior failed", e);
  16.            }
  17.        });

Barrier能力开发

以下以开发活动状态“keeping”的Barrier为例(当用户处于指定的活动状态时触发Barrier)。

1. 定义Barrier。

  1. AwarenessBarrier keepStillBarrier = BehaviorBarrier.keeping(BehaviorBarrier.BEHAVIOR_STILL);

2. 定义Barrier状态改变时触发的“PendingIntent”,本示例中为发送一个广播,同时新建一个广播接收器用来接收这个广播。

  1. final String BARRIER_RECEIVER_ACTION = getApplication().getPackageName() + "BEHAVIOR_BARRIER_RECEIVER_ACTION";
  2. Intent intent = new Intent(BARRIER_RECEIVER_ACTION);
  3. PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 1, intent, PendingIntent.FLAG_UPDATE_CURRENT);
  4. BehaviorBarrierReceiver barrierReceiver = new BehaviorBarrierReceiver();
  5. registerReceiver(barrierReceiver, new IntentFilter(BARRIER_RECEIVER_ACTION));

3. 定义Barrier对应的标签Label,然后添加Barrier。

  1. String behaviorBarrierLabel = "behavior keeping barrier";
  2. BarrierUpdateRequest.Builder builder = new BarrierUpdateRequest.Builder();
  3. BarrierUpdateRequest request = builder.addBarrier(behaviorBarrierLabel, keepStillBarrier,pendingIntent).build();
  4. Awareness.getBarrierClient(context).updateBarriers(request)
  5.        .addOnSuccessListener(new OnSuccessListener<Void>() {
  6.            @Override
  7.            public void onSuccess(Void aVoid) {
  8.                Toast.makeText(getApplicationContext(), "add barrier success", Toast.LENGTH_SHORT).show();
  9.            }
  10.        })
  11.        .addOnFailureListener(new OnFailureListener() {
  12.            @Override
  13.            public void onFailure(Exception e) {
  14.                Toast.makeText(getApplicationContext(), "add barrier failed", Toast.LENGTH_SHORT).show();
  15.                Log.e(TAG, "add barrier failed", e);
  16.            }
  17.        });

4. 定义广播接收器,用于监听Barrier事件,收到事件后进行应用的业务处理。

  1. class BehaviorBarrierReceiver extends BroadcastReceiver {
  2.    @Override
  3.    public void onReceive(Context context, Intent intent) {
  4.        BarrierStatus barrierStatus = BarrierStatus.extract(intent);
  5.        String label = barrierStatus.getBarrierLabel();
  6.        switch(barrierStatus.getPresentStatus()) {
  7.            case BarrierStatus.TRUE:
  8.                Log.i(TAG, label + " status:true");
  9.                break;
  10.            case BarrierStatus.FALSE:
  11.                Log.i(TAG, label + " status:false");
  12.                break;
  13.            case BarrierStatus.UNKNOWN:
  14.                Log.i(TAG, label + " status:unknown");
  15.                break;
  16.        }
  17.    }
  18. }