Android 检测车辆是否移动
Android Detect if vehicle moving
我正在开发一个类似于优步的应用程序,如果车辆停止移动(或移动),我们需要计算等待时间
我尝试使用 GPS 定位速度,但它似乎没有帮助。然后我们尝试 Activity 识别 API 也没有立即更新。
我们还有其他方法可以实现吗?。请注意,这与检测速度无关。它是关于检测车辆是否在移动。
谢谢,
阿尼夫
据我所知,您有 3 个选择:
- 您可以实现自己的驾驶检测技术 - 使用 Activity recognition and receiving location updates,尽管 我建议不要这样做 ,不要重新发明轮子,有很好的api已经开发了。
- 您可以使用 Neura 的免费 SDK,它可以在您的用户开始驾驶和结束驾驶时向您发送事件。
看看这个 git project :基本上,当您开始驾驶时,该项目会宣布带有文本到语音的通知,这不是您想要的,但是当 Neura 向您发送事件 start/finish 开车。
很容易接受这个项目并把它变成你自己的。
我强烈推荐使用这个选项。
您可以使用 google 的 FenceApi 来声明驾驶围栏。
虽然这个方法看起来不错,但我遇到了这样一个事实,这个api有时在用户starts/finishes开车时没有告诉我,有时我开始后花了很长时间开车 api 告诉我那件事。
一个。包括对您应用的 build.gradle 文件的依赖:
compile 'com.google.android.gms:play-services-location:+'
compile 'com.google.android.gms:play-services-contextmanager:+'
b。清单定义:
<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 class - 代码附带的解释:
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;
}
}
}
}
我正在开发一个类似于优步的应用程序,如果车辆停止移动(或移动),我们需要计算等待时间
我尝试使用 GPS 定位速度,但它似乎没有帮助。然后我们尝试 Activity 识别 API 也没有立即更新。
我们还有其他方法可以实现吗?。请注意,这与检测速度无关。它是关于检测车辆是否在移动。
谢谢, 阿尼夫
据我所知,您有 3 个选择:
- 您可以实现自己的驾驶检测技术 - 使用 Activity recognition and receiving location updates,尽管 我建议不要这样做 ,不要重新发明轮子,有很好的api已经开发了。
- 您可以使用 Neura 的免费 SDK,它可以在您的用户开始驾驶和结束驾驶时向您发送事件。 看看这个 git project :基本上,当您开始驾驶时,该项目会宣布带有文本到语音的通知,这不是您想要的,但是当 Neura 向您发送事件 start/finish 开车。 很容易接受这个项目并把它变成你自己的。 我强烈推荐使用这个选项。
您可以使用 google 的 FenceApi 来声明驾驶围栏。
虽然这个方法看起来不错,但我遇到了这样一个事实,这个api有时在用户starts/finishes开车时没有告诉我,有时我开始后花了很长时间开车 api 告诉我那件事。
一个。包括对您应用的 build.gradle 文件的依赖:
compile 'com.google.android.gms:play-services-location:+' compile 'com.google.android.gms:play-services-contextmanager:+'
b。清单定义:
<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 class - 代码附带的解释:
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; } } } }