2017-08-17 18 views

回答

1

你可以使用谷歌的FenceApi来声明驾驶围栏。

虽然这种方法看起来不错,但我已经面对这样一个事实,即当用户开始/完成驾驶时,这个api并没有告诉我,有时候我开始驾驶后花了很长时间,api告诉我那个事件。

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; 
      } 
     } 
    } 
} 
相关问题