Android 活动围栏在感知API中不工作

Android 活动围栏在感知API中不工作,android,google-awareness,Android,Google Awareness,我尝试使用Google Awareness API实现活动围栏。但是没有检测到用户活动中的更改。不过,耳机围栏的工作原理与预期一致 活动围栏活动 public class ActivityFenceActivity extends AppCompatActivity implements GoogleApiClient.ConnectionCallbacks { private static final String FENCE_RECEIVER_ACTION = "FENCE_RE

我尝试使用Google Awareness API实现活动围栏。但是没有检测到用户活动中的更改。不过,耳机围栏的工作原理与预期一致

活动围栏活动

public class ActivityFenceActivity extends AppCompatActivity implements GoogleApiClient.ConnectionCallbacks {

private static final String FENCE_RECEIVER_ACTION = "FENCE_RECEIVE";
private static final String FENCE_WALKING_KEY = "walkingKey";
private static final String FENCE_RUNNING_KEY = "runningKey";
private static final String TAG = ActivityFenceActivity.class.getSimpleName();

private GoogleApiClient googleApiClient;
private TextView activityTextView;
private BroadcastReceiver activityFenceReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(final Context context, final Intent intent) {
        Toast.makeText(context, "Recieved", Toast.LENGTH_SHORT).show();
        FenceState fenceState = FenceState.extract(intent);

        if (TextUtils.equals(fenceState.getFenceKey(), FENCE_WALKING_KEY)) {
            switch (fenceState.getCurrentState()) {
                case FenceState.TRUE:
                    activityTextView.setText("User is walking");
                    break;
                case FenceState.FALSE:
                    activityTextView.setText("User is not walking");
                    break;
                case FenceState.UNKNOWN:
                    activityTextView.setText("Activity state unknown");
                    break;
            }
        } else if (TextUtils.equals(fenceState.getFenceKey(), FENCE_RUNNING_KEY)) {
            switch (fenceState.getCurrentState()) {
                case FenceState.TRUE:
                    activityTextView.setText("User is running");
                    break;
                case FenceState.FALSE:
                    activityTextView.setText("User is not running");
                    break;
                case FenceState.UNKNOWN:
                    activityTextView.setText("Activity state unknown");
                    break;
            }
        }
    }
};

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_activity_fence);

    activityTextView = (TextView) findViewById(R.id.activityTextView);

    googleApiClient = new GoogleApiClient.Builder(ActivityFenceActivity.this)
            .addApi(Awareness.API)
            .addConnectionCallbacks(this)
            .build();
    googleApiClient.connect();

    findViewById(R.id.register_fence).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            registerActivityFence();
        }
    });

    findViewById(R.id.unregister_fence).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            unregisterActivityFence();
        }
    });


}

@Override
public void onConnected(@Nullable final Bundle bundle) {
    Log.d(TAG, "Google API connected");

}

@Override
public void onConnectionSuspended(final int i) {
    Log.d(TAG, "Google API connection suspended");

}

@Override
protected void onStart() {
    super.onStart();
    registerReceiver(activityFenceReceiver, new IntentFilter(FENCE_RECEIVER_ACTION));
}

@Override
protected void onStop() {
    super.onStop();

    unregisterReceiver(activityFenceReceiver);
    unregisterActivityFence();
}

private void registerActivityFence() {
    AwarenessFence walkingFence = DetectedActivityFence.during(DetectedActivityFence.WALKING);
    AwarenessFence runningFence = DetectedActivityFence.during(DetectedActivityFence.RUNNING);

    PendingIntent fencePendingIntent = PendingIntent.getBroadcast(this,
            0,
            new Intent(FENCE_RECEIVER_ACTION),
            0);

    Awareness.FenceApi.updateFences(googleApiClient, new FenceUpdateRequest.Builder()
            .addFence(FENCE_WALKING_KEY, walkingFence, fencePendingIntent).build())
            .setResultCallback(new ResultCallbacks<Status>() {
                @Override
                public void onSuccess(@NonNull final Status status) {
                    Toast.makeText(ActivityFenceActivity.this,
                            "Fence registered successfully",
                            Toast.LENGTH_SHORT).show();
                }

                @Override
                public void onFailure(@NonNull final Status status) {
                    Toast.makeText(ActivityFenceActivity.this,
                            "Cannot register activity fence.",
                            Toast.LENGTH_SHORT).show();
                }
            });

    Awareness.FenceApi.updateFences(googleApiClient, new FenceUpdateRequest.Builder()
            .addFence(FENCE_RUNNING_KEY, runningFence, fencePendingIntent).build());

}

private void unregisterActivityFence() {
    Awareness.FenceApi.updateFences(
            googleApiClient,
            new FenceUpdateRequest.Builder()
                    .removeFence(FENCE_WALKING_KEY)
                    .removeFence(FENCE_RUNNING_KEY)
                    .build()).setResultCallback(new ResultCallbacks<Status>() {
        @Override
        public void onSuccess(@NonNull Status status) {
            Toast.makeText(ActivityFenceActivity.this,
                    "Fence unregistered successfully.",
                    Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onFailure(@NonNull Status status) {
            Toast.makeText(ActivityFenceActivity.this,
                    "Cannot unregister headphone fence.",
                    Toast.LENGTH_SHORT).show();
        }
    });
}
公共类ActivityFenceActivity扩展AppCompativeActivity实现GoogleAppClient.ConnectionCallbacks{
专用静态最终字符串围栏\接收器\操作=“围栏\接收”;
专用静态最终串围栏\u WALKING\u KEY=“walkingKey”;
专用静态最终字符串围栏\u RUNNING\u KEY=“runningKey”;
私有静态最终字符串标记=ActivityFenceActivity.class.getSimpleName();
私人GoogleapClient GoogleapClient;
私有文本视图活动文本视图;
private BroadcastReceiver activityFenceReceiver=new BroadcastReceiver(){
@凌驾
公共void onReceive(最终上下文、最终意图){
Toast.makeText(上下文,“received”,Toast.LENGTH_SHORT).show();
FenceState=FenceState.extract(intent);
if(TextUtils.equals(fenceState.getFenceKey(),FENCE\u WALKING\u KEY)){
开关(fenceState.getCurrentState()){
case FenceState.TRUE:
activityTextView.setText(“用户正在行走”);
打破
case FenceState.FALSE:
activityTextView.setText(“用户未行走”);
打破
案例FenceState.UNKNOWN:
activityTextView.setText(“活动状态未知”);
打破
}
}else if(TextUtils.equals(fenceState.getFenceKey(),FENCE\u RUNNING\u KEY)){
开关(fenceState.getCurrentState()){
case FenceState.TRUE:
activityTextView.setText(“用户正在运行”);
打破
case FenceState.FALSE:
activityTextView.setText(“用户未运行”);
打破
案例FenceState.UNKNOWN:
activityTextView.setText(“活动状态未知”);
打破
}
}
}
};
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u activity\u fence);
activityTextView=(TextView)findViewById(R.id.activityTextView);
GoogleAppClient=新建GoogleAppClient.Builder(ActivityFenceActivity.this)
.addApi(Awareness.API)
.addConnectionCallbacks(此)
.build();
googleApiClient.connect();
findviewbyd(R.id.register\u fence).setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
RegisterActivityFunce();
}
});
findviewbyd(R.id.unregister\u fence).setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
取消注册ActivityFence();
}
});
}
@凌驾
未连接的公共无效(@Nullable final Bundle){
Log.d(标签“GoogleAPI连接”);
}
@凌驾
公共空间连接暂停(最终int i){
Log.d(标签“GoogleAPI连接暂停”);
}
@凌驾
受保护的void onStart(){
super.onStart();
registerReceiver(活动FenceReceiver,新意向过滤器(Fencer_RECEIVER_ACTION));
}
@凌驾
受保护的void onStop(){
super.onStop();
未注册接收人(activityFenceReceiver);
取消注册ActivityFence();
}
私有无效注册表活动功能(){
AwarenessFence walkingFence=检测到的活动fence.during(检测到的活动fence.WALKING);
AwarenessFence runningFence=DetectedActivityFence.during(DetectedActivityFence.RUNNING);
PendingEvent FencePendingEvent=PendingEvent.getBroadcast(此,
0,
新意图(围栏、接收器、行动),
0);
Awareness.FenceApi.updateFunces(GoogleAppClient,new FenceUpdateRequest.Builder()
.addFence(FENCE\u WALKING\u键、walkingFence、fencependingent.build())
.setResultCallback(新的ResultCallbacks(){
@凌驾
成功时公共无效(@NonNull最终状态){
Toast.makeText(ActivityFenceActivity.this,
“围栏注册成功”,
吐司。长度(短)。show();
}
@凌驾
public void onFailure(@NonNull final Status Status){
Toast.makeText(ActivityFenceActivity.this,
“无法注册活动围栏。”,
吐司。长度(短)。show();
}
});
Awareness.FenceApi.updateFunces(GoogleAppClient,new FenceUpdateRequest.Builder()
.addFence(FENCE_RUNNING_KEY、runningFence、fencependingent.build());
}
私有void unregisterActivityFence(){
Awareness.FenceApi.updateFences(
GoogleapClient,
新建FenceUpdateRequest.Builder()
.拆除围栏(围栏和行走键)
.移除围栏(围栏运行键)
.build()).setResultCallback(新的ResultCallbacks()){
@凌驾
成功时公共无效(@NonNull状态){
Toast.makeText(ActivityFenceActivity.this,
“围栏已成功注销。”,
吐司。长度(短)。show();
}
@凌驾
public void onFailure(@NonNull状态){
Toast.makeText(ActivityFenceActivity.this,
“无法注销耳机围栏。”,
吐司。长度(短)。show();
}
});
}
}

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.subhrajyoti.awareness">

    <uses-permission android:name="com.google.android.gms.permission.ACTIVITY_RECOGNITION" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <meta-data
            android:name="com.google.android.awareness.API_KEY"
            android:value="AIzaSyBEmjlfC87xRUP2FnFynsDdY3QRuI1hIHs" />

    </application>

</manifest>

如果耳机围栏工作,而活动围栏不工作,可能您只是忘记了在中添加权限
<uses-permission android:name="com.google.android.gms.permission.ACTIVITY_RECOGNITION"/>