Search code examples
androidgeolocationaccelerometeractivity-recognition

Android Detect if vehicle moving


I'm working on an application similar to Uber, and we need to calculate the wait time if the vehicle stops moving (or moving

I tried using GPS Location speed, but it doesn't seems to be helping. then we tried Activity recognition API that too is not giving immediate updates.

Is there any other way we could achieve this?. please note its not about detecting the speed. its about detecting if the vehicle is moving or not.

Thanks, Aneef


Solution

  • As far as i can see it, you have 3 options :

    1. You can implement your own technique for detecting driving - using Activity recognition and receiving location updates, though i recommend not to do so, don't reinvent the wheel, there are good apis developed already.
    2. You could use a free sdk of Neura which can send you an event when your user starts driving and finishes driving. Check out this git project : Basically, the project announces notifications with text-to-speech when you start driving, which isn't what you want, but you can do whatever you want when Neura sends you an event for start/finish driving. Its very easy to just take this project and make it your own. I highly recommend using this option.
    3. You could use google's FenceApi in order to declare a driving fence.

      Though this approach seems good, i've faced with the fact that this api didn't tell me sometimes when user starts/finishes driving, and sometimes it took a long time after i started driving that the api told me of that event.

      a. include dependency to your app's build.gradle file :

         compile 'com.google.android.gms:play-services-location:+'
      
         compile 'com.google.android.gms:play-services-contextmanager:+'
      

      b. Manifest definitions :

      <uses-permission android:name="com.google.android.gms.permission.ACTIVITY_RECOGNITION" />
      <uses-permission android:name="android.permission.INTERNET" />
      <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
      
      <application
          android:allowBackup="true"
          android:icon="@mipmap/ic_launcher"
          android:label="@string/app_name"
          android:supportsRtl="true"
          android:theme="@style/AppTheme" >
      
          <meta-data
              android:name="com.google.android.awareness.API_KEY"
              android:value="PUT_YOUR_AWARENESS_KEY_HERE" />
      
          <activity android:name=".MainActivity" >
              <intent-filter>
                  <action android:name="android.intent.action.MAIN" />
      
                  <category android:name="android.intent.category.LAUNCHER" />
              </intent-filter>
          </activity>
      </application>
      

      PUT_YOUR_AWARENESS_KEY_HERE : You need to generate a key here.

      c. Your MainActivity class - explanations attached to the code :

      public class MainActivity extends Activity {
      
          private GoogleApiClient mGoogleApiClient;
          private PendingIntent mPendingIntent;
          private FenceReceiver mFenceReceiver;
      
          // The intent action which will be fired when your fence is triggered.
          private final String FENCE_RECEIVER_ACTION = BuildConfig.APPLICATION_ID + "FENCE_RECEIVER_ACTION";
      
          @Override
          protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_main);
              mGoogleApiClient = new GoogleApiClient.Builder(this).addApi(Awareness.API).build();
              mGoogleApiClient.connect();
              // Set up the PendingIntent that will be fired when the fence is triggered.
              mPendingIntent = PendingIntent.getBroadcast(this, 0, new Intent(FENCE_RECEIVER_ACTION), 0);
              // The broadcast receiver that will receive intents when a fence is triggered.
              mFenceReceiver = new FenceReceiver();
              registerReceiver(mFenceReceiver, new IntentFilter(FENCE_RECEIVER_ACTION));
              createFence(DetectedActivityFence.IN_VEHICLE, "InVehicleFence");
          }
      
          @Override
          public void onDestroy() {
              try {
                  unregisterReceiver(mFenceReceiver); //Don't forget to unregister the receiver
              } catch (Exception e) {
                  e.printStackTrace();
              }
              super.onDestroy();
          }
      
          private void createFence(int detectedActivityFence, final String fenceKey) {
              AwarenessFence fence = DetectedActivityFence.during(detectedActivityFence);
              // Register the fence to receive callbacks.
              Awareness.FenceApi.updateFences(
                      mGoogleApiClient, new FenceUpdateRequest.Builder().addFence(fenceKey, fence, mPendingIntent)
                              .build()).setResultCallback(new ResultCallback<Status>() {
                  @Override
                  public void onResult(@NonNull Status status) {
                      if (status.isSuccess()) {
                          Log.i(getClass().getSimpleName(), "Successfully registered.");
                      } else {
                          Log.e(getClass().getSimpleName(), "Could not be registered: " + status);
                      }
                  }
              });
          }
      
          // Handle the callback on the Intent.
          public class FenceReceiver extends BroadcastReceiver {
              @Override
              public void onReceive(Context context, Intent intent) {
                  FenceState fenceState = FenceState.extract(intent);
                  switch (fenceState.getCurrentState()) {
                      case FenceState.TRUE:
                          Log.i(fenceState.getFenceKey(), "Driving");
                          break;
                      case FenceState.FALSE:
                          Log.i(fenceState.getFenceKey(), "Not driving");
                          break;
                  }
              }
          }
      }