Состояние наушников отображается неправильно с использованием Fence API
Я использую Fence API в этом упражнении и обнаруживаю активность пользователя независимо от того, идет ли пользователь или стоит на месте, в то же время я также получаю состояние наушников, но при подключенных наушниках состояние ниже:
- Когда я иду, статус наушников подключен
- Когда я все еще статус наушников отключен
Здесь есть 2 проблемы... даже если наушники подключены... помогите мне здесь.
public class FenceApiDemo extends AppCompatActivity {
private static final String DURING_FENCE_KEY = "DURING_FENCE_KEY";
private static final String STARTING_FENCE_KEY = "STARTING_FENCE_KEY";
private static final String STOPPING_FENCE_KEY = "STOPPING_FENCE_KEY";
public static final int STATUS_DURING = 0;
public static final int STATUS_STARTING = 1;
public static final int STATUS_STOPPING = 2;
public static final int STATUS_DEFAULT = 3;
RelativeLayout mLayoutDetectedActivityFence;
TextView mDetectedActivityText;
private GoogleApiClient mGoogleApiClient;
private PendingIntent mPendingIntent;
private DetectedActivityFenceReceiver mDetectedActivityFenceReceiver;
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_fence);
mLayoutDetectedActivityFence =(RelativeLayout)findViewById (R.id.layout_detected_activity_fence);
mDetectedActivityText=(TextView)findViewById (R.id.text_detected_activity) ;
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addApi(Awareness.API)
.build();
mGoogleApiClient.connect();
mDetectedActivityFenceReceiver = new DetectedActivityFenceReceiver();
Intent intent = new Intent(DetectedActivityFenceReceiver.FENCE_RECEIVER_ACTION);
mPendingIntent = PendingIntent.getBroadcast(this, 1, intent, 0);
}
@Override
protected void onStart() {
super.onStart();
registerFences();
registerReceiver(mDetectedActivityFenceReceiver, new IntentFilter(DetectedActivityFenceReceiver.FENCE_RECEIVER_ACTION));
}
@Override
protected void onStop() {
super.onStop();
unregisterFences();
unregisterReceiver(mDetectedActivityFenceReceiver);
}
private void registerFences() {
AwarenessFence headphoneFence = DetectedActivityFence.during(DetectedActivity.WALKING);
AwarenessFence startWalking = DetectedActivityFence.starting(DetectedActivity.WALKING);
AwarenessFence stopWalkingFence = DetectedActivityFence.stopping(DetectedActivity.WALKING);
Awareness.FenceApi.updateFences(
mGoogleApiClient,
new FenceUpdateRequest.Builder()
.addFence(DURING_FENCE_KEY, headphoneFence, mPendingIntent)
.addFence(STARTING_FENCE_KEY, startWalking, mPendingIntent)
.addFence(STOPPING_FENCE_KEY, stopWalkingFence, mPendingIntent)
.build())
.setResultCallback(new ResultCallback<Status>() {
@Override
public void onResult(@NonNull Status status) {
if (status.isSuccess()) {
Snackbar.make(mLayoutDetectedActivityFence, "Fence Registered", Snackbar.LENGTH_LONG).show();
} else {
Snackbar.make(mLayoutDetectedActivityFence,
"Fence Not Registered",
Snackbar.LENGTH_LONG).show();
}
}
});
}
private void unregisterFences() {
Awareness.FenceApi.updateFences(
mGoogleApiClient,
new FenceUpdateRequest.Builder()
.removeFence(DURING_FENCE_KEY)
.removeFence(STARTING_FENCE_KEY)
.removeFence(STOPPING_FENCE_KEY)
.build()).setResultCallback(new ResultCallbacks<Status>() {
@Override
public void onSuccess(@NonNull Status status) {
Snackbar.make(mLayoutDetectedActivityFence,
"Fence Removed",
Snackbar.LENGTH_LONG).show();
}
@Override
public void onFailure(@NonNull Status status) {
Snackbar.make(mLayoutDetectedActivityFence,
"Fence Not Removed",
Snackbar.LENGTH_LONG).show();
}
});
}
private void setHeadphoneState(int headphoneState) {
switch (headphoneState) {
case STATUS_DEFAULT:
mDetectedActivityText.setText(R.string.text_still);
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
mDetectedActivityText.setText(R.string.text_start_walking);
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
mDetectedActivityText.setText(R.string.text_walking);
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
mDetectedActivityText.setText(R.string.text_stopping_walking);
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
mDetectedActivityText.setText(R.string.text_still);
}
}, 2500);
}
}, 4000);
}
}, 2000);
}
}, 5000);
break;
case STATUS_DURING:
mDetectedActivityText.setText(R.string.text_walking);
break;
case STATUS_STARTING:
mDetectedActivityText.setText(R.string.text_start_walking);
break;
case STATUS_STOPPING:
mDetectedActivityText.setText(R.string.text_stopping_walking);
break;
}
}
class DetectedActivityFenceReceiver extends BroadcastReceiver {
public static final String FENCE_RECEIVER_ACTION =
"FENCE_RECEIVER_ACTION";
@Override
public void onReceive(Context context, Intent intent) {
FenceState fenceState = FenceState.extract(intent);
if (TextUtils.equals(fenceState.getFenceKey(), DURING_FENCE_KEY)) {
switch(fenceState.getCurrentState()) {
case FenceState.TRUE:
setHeadphoneState(STATUS_DURING);
Toast.makeText(context,"1 headphone plugged in",Toast.LENGTH_SHORT).show();
break;
case FenceState.FALSE:
setHeadphoneState(STATUS_DEFAULT);
Toast.makeText(context,"1 headphone unplugged in",Toast.LENGTH_SHORT).show();
break;
case FenceState.UNKNOWN:
Snackbar.make(mLayoutDetectedActivityFence,
"Oops, your headphone status is unknown!",
Snackbar.LENGTH_LONG).show();
break;
}
} else if (TextUtils.equals(fenceState.getFenceKey(), STARTING_FENCE_KEY)) {
switch(fenceState.getCurrentState()) {
case FenceState.TRUE:
setHeadphoneState(STATUS_STARTING);
Toast.makeText(context,"2 headphone plugged in",Toast.LENGTH_SHORT).show();
break;
case FenceState.FALSE:
Toast.makeText(context,"2 headphone unplugged in",Toast.LENGTH_SHORT).show();
break;
case FenceState.UNKNOWN:
Snackbar.make(mLayoutDetectedActivityFence,
"Oops, your headphone status is unknown!",
Snackbar.LENGTH_LONG).show();
break;
}
} else if (TextUtils.equals(fenceState.getFenceKey(), STOPPING_FENCE_KEY)) {
switch(fenceState.getCurrentState()) {
case FenceState.TRUE:
setHeadphoneState(STATUS_STOPPING);
Toast.makeText(context,"3 headphone plugged in",Toast.LENGTH_SHORT).show();
break;
case FenceState.FALSE:
Toast.makeText(context,"3 headphone unplugged in",Toast.LENGTH_SHORT).show();
break;
case FenceState.UNKNOWN:
Snackbar.make(mLayoutDetectedActivityFence,
"Oops, your headphone status is unknown!",
Snackbar.LENGTH_LONG).show();
break;
}
}
}
}