本部分介绍了如何使用 Snapshot API 获取每种受支持的上下文类型的当前状态。如需了解详情,请参阅使用入门。如需详细了解已弃用的情境信号,请打开以下展开式通知:
获取当前活动
如需获取用户的当前 activity,请调用 getDetectedActivity()
,后者会返回一个包含用户最新 activity 信息的 ActivityRecognitionResult
。
getDetectedActivity()
方法需要 com.google.android.gms.permission.ACTIVITY_RECOGNITION
权限。将此权限添加到 AndroidManifest.xml
。
如需获取用户的当前 activity,请执行以下步骤:
- 调用
getSnapshotClient()
以创建SnapshotClient
的实例。 - 使用
addOnSuccessListener
创建一个可以监听DetectedActivityResponse
的OnSuccessListener
。 - 调用
getStatus()
以确保结果有效。 调用
DetectedActivityResponse.getActivityRecognitionResult()
以返回ActivityRecognitionResult
。您可以使用它获取用户当前活动的许多方面。例如:- 调用
getMostProbableActivity()
仅获取最可能的 activity。 - 调用
getProbableActivities()
可获取按概率排名的近期活动列表。 - 调用
getActivityConfidence()
以返回给定 activity 类型的置信度值。 - 调用
hasResult()
以检测Intent
是否包含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 密钥以及开始使用。
若要获取附近信标的相关信息,请执行以下步骤:
检查用户是否已授予所需的权限。以下示例会检查是否已授予
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; }
定义
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")); 使用
addOnSuccessListener
创建一个可以监听BeaconStateResponse
的OnSuccessListener
。调用
getStatus()
以确保结果有效。调用
BeaconStateResponse.getBeaconState()
以返回信标状态。
以下示例展示了如何获取信标信息:
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
。
如需获取当前的耳机状态,请执行以下步骤:
- 调用
getSnapshotClient.getHeadphoneState()
。 - 使用
addOnSuccessListener
创建一个可以监听HeadphoneStateResponse
的OnSuccessListener
。 - 调用
getStatus()
以确保结果有效。 - 调用成功后,调用
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
。
如需获取当前位置,请执行以下步骤:
检查用户是否已授予所需的权限。以下示例会检查是否已授予
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; }
使用
addOnSuccessListener
创建一个可以监听LocationResponse
的OnSuccessListener
。调用
getStatus()
以确保结果有效。调用
LocationResponse.getLocation()
以返回当前的Location
。
以下示例展示了如何获取当前位置:
Awareness.getSnapshotClient(this).getLocation()
.addOnSuccessListener(new OnSuccessListener<LocationResponse>() {
@Override
public void onSuccess(LocationResponse locationResponse) {
Location loc = locationResponse.getLocationResult();
}
})