2016-08-12 9 views
0

Я работаю над приложением, аналогичным Uber, и нам нужно вычислить время ожидания, если транспортное средство перестает двигаться (или перемещение Я пробовал использовать GPS-координаты, но это не так похоже, помогает, тогда мы попробовали API распознавания активности, который тоже не дает немедленных обновлений.Android Обнаружение, если транспортное средство движется

Есть ли какой-либо другой способ, которым мы могли бы это достичь? Обратите внимание на то, что он не определяет скорость. перемещение или нет.

Thanks, Aneef

+0

вы можете использовать акселерометр –

+0

Вы упомянули, что вы пытались «узнавания активность API» и он не работает, как ожидалось. Вы имеете в виду, что вы использовали API местоположения сервисов Google Play, и это не сработало? Вы установили его для получения периодических обновлений местоположения? Какой параметр интервала вы установили? Вы проверяли уровень достоверности каждого вида деятельности? Пожалуйста, добавьте дополнительную информацию, чтобы мы могли вам помочь. –

+0

Matan ... да я сделал все tat – Aneef

ответ

7

Насколько я могу видеть, у вас есть 3 варианта:

  1. Вы можете реализовать свой собственный метод для обнаружения вождения - с помощью Activity recognition и receiving location updates, хотя я рекомендую не делать этого, не изобретайте колесо, уже есть хорошая apis.
  2. Вы можете использовать бесплатный sdk Neura, который может отправить вам событие, когда ваш пользователь начнет вождение и закончит вождение. Отметьте это git project: В принципе, проект объявляет уведомления с текстом в речь, когда вы начинаете вождение, чего вы не хотите, но вы можете делать все, что хотите, когда Neura отправляет вам событие для запуска/завершения вождения. Его очень просто взять этот проект и сделать его своим. Я настоятельно рекомендую использовать эту опцию.
  3. Чтобы объявить забор, вы можете использовать FenceApi в google.

    Хотя этот подход кажется хорошим, я столкнулся с тем фактом, что этот api иногда не говорил мне, когда пользователь запускает/заканчивает вождение, и иногда это заняло много времени после того, как я начал водить машину, это событие.

    a. включают зависимость от файла build.gradle вашего приложения:

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

    b. Manifest определения:

    <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: Вам нужно сгенерировать ключ here.

    c. Ваш MainActivity класс - пояснения, присоединенные к коду:

    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; 
          } 
         } 
        } 
    }