我需要ActivityRecognition後得到的用戶位置(由fusedlocation API)檢測用戶狀態(其中要求每3分鐘),像IN_VEHICLE,ON_FOOT,跑步等位置更新
在每個事件我需要定期間隔後的用戶位置例如:
如果用戶仍然然後setInterval(5*60*60*1000);
並檢查下一個位置 更新不在5小時之前。但ActivityRecognation會每3分鐘打一次電話。
如果用戶正在運行然後setInterval(2*60*1000);
並檢查下一次位置更新不在/ 2分鐘後。但ActivityRecognation會每3分鐘打一次電話。
如果用戶正在運行,則每隔1分鐘發送一次位置 如果用戶正在開車,則每15分鐘發送一次位置。
我試圖在onConnected
布爾值false在類級別爲false和true。但它總是變成真實的,因爲整個意圖服務在3分鐘後被調用。
if (startLocationFirst){
requestLocatonSetting(5*60*60*1000,3*60*60*1000,LocationRequest.PRIORITY_HIGH_ACCURACY);
LocationAPIclient.connect();// RequestLocation and GoogleAPIClient won't call until device comes from another ActivityRecognation State running,walking etc. And keep Updating location every 5 hours.
}
問題我有
- ActivityRecognation獲取用戶狀態,每3分鐘,但直到它從另一個ActivityRecognation國家不應該進入
startLocationFirst
布爾和不斷更新的位置爲套內startLocationFirst
電流
這裏是IntentService With FusedLocation
public class Activity_Recognized_Service extends IntentService implements GoogleApiClient.OnConnectionFailedListener, GoogleApiClient.ConnectionCallbacks, LocationListener {
/**
* Creates an IntentService. Invoked by your subclass's constructor.
*
* @param name Used to name the worker thread, important only for debugging.
*/
public static final String TAG = "###RECOGNISED SRVCE###";
Timer timer;
GoogleApiClient LocationAPIclient;
LocationRequest mLocationRequest;
Location mCurrentLocation;
boolean startLocationFirst=true;
public Activity_Recognized_Service() {
super("Activity_Recognized_Service");
}
public Activity_Recognized_Service(String name) {
super(name);
}
@Override
protected void onHandleIntent(@Nullable Intent intent) {
Log.d(TAG, "On Handle Intent");
if (ActivityRecognitionResult.hasResult(intent)) {
Log.d(TAG, "ActivityRecognition Has Result");
ActivityRecognitionResult result = ActivityRecognitionResult.extractResult(intent);
handleDetectedActivities(result.getProbableActivities());
Navigation_Drawer nav = new Navigation_Drawer();
nav.UserMovementResult(result);
}
}
@Override
public void onCreate() {
super.onCreate();
Log.d(TAG,"On Create Calling");
if (LocationAPIclient == null) {
Log.d(TAG, "Location API is NULL Value Of This ");
LocationAPIclient = new GoogleApiClient.Builder(this)
.addApi(LocationServices.API)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.build();
}
}
private void handleDetectedActivities(List<DetectedActivity> probableActivities) {
for (DetectedActivity activity : probableActivities) {
switch (activity.getType()) {
case DetectedActivity.IN_VEHICLE:
Log.d(TAG, "In Vehicle " + activity.getConfidence());
if (activity.getConfidence() >= 75) {
//Send Notification To User
NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
builder.setContentText("In Vehicle");
builder.setSmallIcon(R.drawable.elaxer_x);
builder.setContentTitle("Elaxer");
NotificationManagerCompat.from(this).notify(0, builder.build());
requestLocatonSetting(10*60*1000,8*60*1000,LocationRequest.PRIORITY_HIGH_ACCURACY); //5 hours= hours * 60 min*60 sec* 1000 milliseconds
//requestLocatonSetting(6*60*1000,6*60*1000,LocationRequest.PRIORITY_HIGH_ACCURACY); //TEST
LocationAPIclient.connect();
if (startLocationFirst){
Log.d(TAG,"Start Location Update For Car");
}
}
break;
case DetectedActivity.ON_BICYCLE:
Log.d(TAG, "On Bicycle " + activity.getConfidence());
if (activity.getConfidence() >= 75) {
//Send Notification To User
NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
builder.setContentText("On Bicycle");
builder.setSmallIcon(R.drawable.elaxer_x);
builder.setContentTitle("Elaxer");
NotificationManagerCompat.from(this).notify(0, builder.build());
requestLocatonSetting(7*60*1000,5*60*1000,LocationRequest.PRIORITY_HIGH_ACCURACY); //5 hours= hours * 60 min*60 sec* 1000 milliseconds
//requestLocatonSetting(6*60*1000,6*60*1000,LocationRequest.PRIORITY_HIGH_ACCURACY); //TEST
LocationAPIclient.connect();
}
break;
case DetectedActivity.ON_FOOT:
Log.d(TAG, "On Foot " + activity.getConfidence());
if (activity.getConfidence() >= 75) {
//Send Notification To User
NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
builder.setContentText("On Foot");
builder.setSmallIcon(R.drawable.elaxer_x);
builder.setContentTitle("Elaxer");
NotificationManagerCompat.from(this).notify(0, builder.build());
}
break;
case DetectedActivity.RUNNING:
Log.d(TAG, "On Running " + activity.getConfidence());
if (activity.getConfidence() >= 75) {
//Send Notification To User
NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
builder.setContentText("Running");
builder.setSmallIcon(R.drawable.elaxer_x);
builder.setContentTitle("Elaxer");
NotificationManagerCompat.from(this).notify(0, builder.build());
requestLocatonSetting(3*60*1000,2*60*1000,LocationRequest.PRIORITY_HIGH_ACCURACY); //5 hours= hours * 60 min*60 sec* 1000 milliseconds
//requestLocatonSetting(6*60*1000,6*60*1000,LocationRequest.PRIORITY_HIGH_ACCURACY); //TEST
LocationAPIclient.connect();
}
break;
case DetectedActivity.STILL:
Log.d(TAG, "On Still " + activity.getConfidence());
if (activity.getConfidence() >= 75) {
//Send Notification To User
NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
builder.setContentText("Still");
builder.setSmallIcon(R.drawable.elaxer_x);
builder.setContentTitle("Elaxer");
NotificationManagerCompat.from(this).notify(0, builder.build());
requestLocatonSetting(5*60*60*1000,3*60*60*1000,LocationRequest.PRIORITY_HIGH_ACCURACY); //5 hours= hours * 60 min*60 sec* 1000 milliseconds
// requestLocatonSetting(3*60*1000,2*60*1000,LocationRequest.PRIORITY_HIGH_ACCURACY); //TEST
LocationAPIclient.connect();
}
break;
case DetectedActivity.TILTING:
Log.d(TAG, "On Tilting " + activity.getConfidence());
if (activity.getConfidence() >= 75) {
//Send Notification To User
NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
builder.setContentText("Tilting");
builder.setSmallIcon(R.drawable.elaxer_x);
builder.setContentTitle("Elaxer");
NotificationManagerCompat.from(this).notify(0, builder.build());
requestLocatonSetting(3*60*1000,2*60*1000,LocationRequest.PRIORITY_HIGH_ACCURACY); //5 hours= hours * 60 min*60 sec* 1000 milliseconds
//requestLocatonSetting(6*60*1000,6*60*1000,LocationRequest.PRIORITY_HIGH_ACCURACY); //TEST
LocationAPIclient.connect();
}
break;
case DetectedActivity.WALKING:
Log.d(TAG, "On Walking " + activity.getConfidence());
if (activity.getConfidence() >= 75) {
//Send Notification To User
NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
builder.setContentText("Let's Walk");
builder.setSmallIcon(R.drawable.elaxer_x);
builder.setContentTitle("Elaxer");
NotificationManagerCompat.from(this).notify(0, builder.build());
requestLocatonSetting(3*60*1000,2*60*1000,LocationRequest.PRIORITY_HIGH_ACCURACY); //5 hours= hours * 60 min*60 sec* 1000 milliseconds
LocationAPIclient.connect();
}
break;
case DetectedActivity.UNKNOWN:
Log.d(TAG, "UnKnown " + activity.getConfidence());
break;
}
}
}
public void setTimer(int Minutes) {
Log.d(TAG, "==================================================");
Log.d(TAG, "Set Timeer Starts It will Run Every " + Minutes);
int MilliSeconds = 60000 * Minutes;
final Handler handler = new Handler();
timer = new Timer();
TimerTask doAsynchronousTask = new TimerTask() {
@Override
public void run() {
handler.post(new Runnable() {
public void run() {
try {
//CODE THAT YOU WANT TO EXECUTE AT GIVEN INTERVAL
} catch (Exception e) {
// TODO Auto-generated catch block
}
}
});
}
};
timer.schedule(doAsynchronousTask, 0, MilliSeconds);
Log.d(TAG, "==================================================");
}
@Override
public void onConnected(@Nullable Bundle bundle) {
Log.d(TAG, "On Connected Running");
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
return;
}
mCurrentLocation = LocationServices.FusedLocationApi.getLastLocation(LocationAPIclient);
if (mCurrentLocation!=null){
Log.d(TAG,"Last Known Location Is not Null ");
new Location_sendeToServer_AsyncTask(this).execute(String.valueOf(mCurrentLocation.getLatitude()),String.valueOf(mCurrentLocation.getLongitude()),String.valueOf(mCurrentLocation.getAccuracy()));
}
else {
Log.d(TAG,"Last Known Location Is NULL Start Location Updates");
LocationServices.FusedLocationApi.requestLocationUpdates(LocationAPIclient,mLocationRequest,this);
}
}
@Override
public void onConnectionSuspended(int i) {
}
@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
}
@Override
public void onLocationChanged(Location location) {
Log.d(TAG,"On Location Changed Calling");
mCurrentLocation=location;
new Location_sendeToServer_AsyncTask(this).execute(String.valueOf(mCurrentLocation.getLatitude()),String.valueOf(mCurrentLocation.getLongitude()),String.valueOf(mCurrentLocation.getAccuracy()));
Log.d(TAG,"Stopping Location Update");
// LocationServices.FusedLocationApi.removeLocationUpdates(LocationAPIclient,this);
}
public void requestLocatonSetting(int Interval,int FastestInterval,int LocationAccuracy){
mLocationRequest=new LocationRequest();
mLocationRequest.setInterval(Interval);
mLocationRequest.setFastestInterval(FastestInterval);
mLocationRequest.setPriority(LocationAccuracy);
}
}
此問題不適用於官方消息。任何人都可以回答 – androidXP