在调用时间感知能力时,开发者需要先在Manifest中指定相应的权限。
- <!-- 位置权限,此权限为敏感权限,声明后还需在代码中动态申请-->
- <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
- <!-- 位置权限,若只使用基于IP的时间快照功能,可申明此权限-->
- <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
使用时间状态感知能力,除需要导入情景感知服务的公共能力类外,还需要导入时间状态相关的类。
- import com.huawei.hmf.tasks.OnFailureListener;
- import com.huawei.hmf.tasks.OnSuccessListener;
- import com.huawei.hms.kit.awareness.Awareness;
- //导入时间快照相关类
- import com.huawei.hms.kit.awareness.capture.TimeCategoriesResponse;
- import com.huawei.hms.kit.awareness.status.TimeCategories;
- //导入时间围栏相关类
- import com.huawei.hms.kit.awareness.barrier.AwarenessBarrier;
- import com.huawei.hms.kit.awareness.barrier.BarrierStatus;
- import com.huawei.hms.kit.awareness.barrier.TimeBarrier;
- import com.huawei.hms.kit.awareness.barrier.BarrierUpdateRequest;
1. 获取Awareness Kit的“Capture Client”。
2. 通过“Capture Client”调用时间状态查询能力接口查询情景状态。
3. 监听情景感知服务结果返回,进行应用的业务处理。
- Awareness.getCaptureClient(this).getTimeCategories()
- .addOnSuccessListener(new OnSuccessListener<TimeCategoriesResponse>() {
- @Override
- public void onSuccess(TimeCategoriesResponse timeCategoriesResponse) {
- TimeCategories categories = timeCategoriesResponse.getTimeCategories();
- int[] timeInfo = categories.getTimeCategories();
- }
- })
- .addOnFailureListener(new OnFailureListener() {
- @Override
- public void onFailure(Exception e) {
- Log.e(TAG, "get Time Categories failed", e);
- }
- });
以下以开发时间“duringPeriodOfDay”的Barrier为例(在指定时区的指定时间段内,Barrier状态为true)。
1. 定义Barrier。
- long oneHourMilliSecond = 60 * 60 * 1000L;
- AwarenessBarrier periodOfDayBarrier = TimeBarrier.duringPeriodOfDay(TimeZone.getDefault(),
- 11 * oneHourMilliSecond, 12 * oneHourMilliSecond);
2. 定义Barrier状态改变时触发的“PendingIntent”,本示例中为发送一个广播,同时新建一个广播接收器用来接收这个广播。
- final String BARRIER_RECEIVER_ACTION = getApplication().getPackageName() + "TIME_BARRIER_RECEIVER_ACTION";
- Intent intent = new Intent(BARRIER_RECEIVER_ACTION);
- PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 1, intent, PendingIntent.FLAG_UPDATE_CURRENT);
- TimeBarrierReceiver barrierReceiver = new TimeBarrierReceiver();registerReceiver(barrierReceiver, new IntentFilter(BARRIER_RECEIVER_ACTION));
3. 定义Barrier对应的标签Label,然后添加Barrier。
- String timeBarrierLabel = "period of day barrier";
- BarrierUpdateRequest.Builder builder = new BarrierUpdateRequest.Builder();
- BarrierUpdateRequest request = builder.addBarrier(timeBarrierLabel, periodOfDayBarrier,pendingIntent).build();
- Awareness.getBarrierClient(context).updateBarriers(request)
- .addOnSuccessListener(new OnSuccessListener<Void>() {
- @Override
- public void onSuccess(Void aVoid) {
- Toast.makeText(getApplicationContext(), "add barrier success", Toast.LENGTH_SHORT).show();
- }
- })
- .addOnFailureListener(new OnFailureListener() {
- @Override
- public void onFailure(Exception e) {
- Toast.makeText(getApplicationContext(), "add barrier failed", Toast.LENGTH_SHORT).show();
- Log.e(TAG, "add barrier failed", e);
- }
- });
4. 定义广播接收器,用于监听Barrier事件,收到事件后进行应用的业务处理。
- class TimeBarrierReceiver extends BroadcastReceiver {
- @Override
- public void onReceive(Context context, Intent intent) {
- BarrierStatus barrierStatus = BarrierStatus.extract(intent);
- String label = barrierStatus.getBarrierLabel();
- switch(barrierStatus.getPresentStatus()) {
- case BarrierStatus.TRUE:
- Log.i(TAG, label + " status:true");
- break;
- case BarrierStatus.FALSE:
- Log.i(TAG, label + " status:false");
- break;
- case BarrierStatus.UNKNOWN:
- Log.i(TAG, label + " status:unknown");
- break;
- }
- }
- }