获取快照数据

本部分介绍了如何使用 Snapshot API 获取每种受支持的上下文类型的当前状态。如需了解详情,请参阅使用入门。如需详细了解已弃用的情境信号,请打开以下展开式通知:

获取当前活动

如需获取用户的当前 activity,请调用 getDetectedActivity(),后者会返回一个包含用户最新 activity 信息的 ActivityRecognitionResult

getDetectedActivity() 方法需要 com.google.android.gms.permission.ACTIVITY_RECOGNITION 权限。将此权限添加到 AndroidManifest.xml

如需获取用户的当前 activity,请执行以下步骤:

  1. 调用 getSnapshotClient() 以创建 SnapshotClient 的实例。
  2. 使用 addOnSuccessListener 创建一个可以监听 DetectedActivityResponseOnSuccessListener
  3. 调用 getStatus() 以确保结果有效。
  4. 调用 DetectedActivityResponse.getActivityRecognitionResult() 以返回 ActivityRecognitionResult。您可以使用它获取用户当前活动的许多方面。例如:

以下代码示例使用 getMostProbableActivity() 获取最有可能检测到的活动,并将结果记录到控制台:

Awareness.getSnapshotClient(this).getDetectedActivity()
    .addOnSuccessListener(new OnSuccessListener<DetectedActivityResponse>() {
        @Override
        public void onSuccess(DetectedActivityResponse dar) {
            ActivityRecognitionResult arr = dar.getActivityRecognitionResult();
            DetectedActivity probableActivity = arr.getMostProbableActivity();

            int confidence = probableActivity.getConfidence();
            String activityStr = probableActivity.toString();
            mLogFragment.getLogView().println("Activity: " + activityStr
                + ", Confidence: " + confidence + "/100");
        }
    })

获取附近的信标

要获取有关附近信标的信息,请调用 getBeaconState()。信标数据由所有附件的内容、类型和命名空间组成。

getBeaconState() 方法需要 android.permission.ACCESS_FINE_LOCATION 权限。将此权限添加到 AndroidManifest.xml。 此外,您还必须为 Google Developers Console 项目激活 Nearby Messages API。如需了解详情,请参阅注册和 API 密钥以及开始使用

若要获取附近信标的相关信息,请执行以下步骤:

  1. 检查用户是否已授予所需的权限。以下示例会检查是否已授予 android.permission.ACCESS_FINE_LOCATION 权限。否则,系统会提示用户同意。

    if (ContextCompat.checkSelfPermission(
                MainActivity.this,
                Manifest.permission.ACCESS_FINE_LOCATION) !=
                PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(
                    MainActivity.this,
                    new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
                    MY_PERMISSION_LOCATION
            );
            return;
        }
    
  2. 定义 BeaconState.TypeFilter。 这将仅返回带有在指定的命名空间和类型中注册的附件的信标。您还可以根据附件内容的逐字节匹配进行过滤。以下示例展示了如何创建类型过滤器:

    private static final List BEACON_TYPE_FILTERS = Arrays.asList(
            BeaconState.TypeFilter.with(
                "my.beacon.namespace",
                "my-attachment-type"),
            BeaconState.TypeFilter.with(
                "my.other.namespace",
                "my-attachment-type"));
    
  3. 调用 getSnapshotClient.getBeaconState()

  4. 使用 addOnSuccessListener 创建一个可以监听 BeaconStateResponseOnSuccessListener

  5. 调用 getStatus() 以确保结果有效。

  6. 调用 BeaconStateResponse.getBeaconState() 以返回信标状态。

  7. 调用 BeaconState.getBeaconInfo() 以获取 BeaconState.BeaconInfo

以下示例展示了如何获取信标信息:

Awareness.getSnapshotClient(this).getBeaconState(BEACON_TYPE_FILTERS)
    .addOnSuccessListener(new OnSuccessListener<BeaconStateResponse>() {
        @Override
        public void onSuccess(BeaconStateResponse beaconStateResponse) {
            BeaconStateResult beaconStateResult = beaconStateResponse.getBeaconState();
            BeaconState.BeaconInfo beaconInfo = beaconStateResponse.getBeaconInfo();
        }
    })

获取耳机状态

如需检测耳机是否已插入设备,请调用 getHeadphoneState(),它会创建一个 HeadphoneStateResponse 检测状态,并将 OnSuccessListener 设为要检测。然后,您可以调用 getHeadphoneState() 来获取 HeadphoneState

如需获取当前的耳机状态,请执行以下步骤:

  1. 调用 getSnapshotClient.getHeadphoneState()
  2. 使用 addOnSuccessListener 创建一个可以监听 HeadphoneStateResponseOnSuccessListener
  3. 调用 getStatus() 以确保结果有效。
  4. 调用成功后,调用 HeadphoneStateResponse.getHeadphoneState() 可返回耳机状态。该值可以是 PLUGGED_IN,也可以是 UNPLUGGED

以下代码示例展示了如何使用 getHeadphoneState()

Awareness.getSnapshotClient(this).getHeadphoneState()
    .addOnSuccessListener(new OnSuccessListener<HeadphoneStateResponse>() {
        @Override
        public void onSuccess(HeadphoneStateResponse headphoneStateResponse) {
            HeadphoneState headphoneState = headphoneStateResponse.getHeadphoneState();
            boolean pluggedIn = headphoneState.getState() == HeadphoneState.PLUGGED_IN;
            String stateStr =
                "Headphones are " + (pluggedIn ? "plugged in" : "unplugged");
            mLogFragment.getLogView().println(stateStr);
        }
    })
    .addOnFailureListener(new OnFailureListener() {
        @Override
        public void onFailure(@NonNull Exception e) {
            Log.e(TAG, "Could not get headphone state: " + e);
        }
    });

获取位置

您可以通过调用 getLocation()(该函数会返回 LocationResponse)来获取用户的当前位置(纬度-经度)。 然后,您可以调用 LocationResponse.getLocation() 来获取包含当前位置数据的 Location

getLocation() 方法需要 android.permission.ACCESS_FINE_LOCATION 权限。将此权限添加到 AndroidManifest.xml

如需获取当前位置,请执行以下步骤:

  1. 检查用户是否已授予所需的权限。以下示例会检查是否已授予 android.permission.ACCESS_FINE_LOCATION 权限。否则,系统会提示用户同意。

    
    if (ContextCompat.checkSelfPermission(
                MainActivity.this,
                Manifest.permission.ACCESS_FINE_LOCATION) !=
                PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(
                    MainActivity.this,
                    new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
                    MY_PERMISSION_LOCATION
            );
            return;
        }
    
  2. 调用 getSnapshotClient.getLocation()

  3. 使用 addOnSuccessListener 创建一个可以监听 LocationResponseOnSuccessListener

  4. 调用 getStatus() 以确保结果有效。

  5. 调用 LocationResponse.getLocation() 以返回当前的 Location

以下示例展示了如何获取当前位置:

Awareness.getSnapshotClient(this).getLocation()
    .addOnSuccessListener(new OnSuccessListener<LocationResponse>() {
        @Override
        public void onSuccess(LocationResponse locationResponse) {
            Location loc = locationResponse.getLocationResult();
        }
    })