Bạn có thể sử dụng số FenceApi của google để khai báo hàng rào. Ví dụ: đây là mã để phát hiện hàng rào lái xe.
Mặc dù cách tiếp cận này có vẻ tốt, tôi đã phải đối mặt với thực tế rằng api này đã không nói với tôi đôi khi sự kiện xảy ra, và đôi khi phải mất một thời gian dài sau khi tôi bắt đầu đi/chạy khi api nói với tôi về sự kiện đó.
a. bao gồm sự phụ thuộc vào tệp build.gradle của ứng dụng của bạn:
compile 'com.google.android.gms:play-services-location:+'
compile 'com.google.android.gms:play-services-contextmanager:+'
b. định nghĩa 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: Bạn cần phải tạo ra một chìa khóa here.
c. lớp MainActivity của bạn - giải thích gắn liền với các mã:
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(), "Active");
break;
case FenceState.FALSE:
Log.i(fenceState.getFenceKey(), "Not Active");
break;
}
}
}
}
mẫu này chỉ dành cho việc phát hiện lái xe nhà nước, nhưng, bạn có thể gọi là 'createFence' với các phương pháp hoạt động khác như:
createFence(DetectedActivityFence.TILTING, "TiltingFence");
createFence(DetectedActivityFence.WALKING, "WalkingFence");
createFence(DetectedActivityFence.ON_FOOT, "OnFootFence");
createFence(DetectedActivityFence.RUNNING, "RunningFence");
Nghe hay đấy. Có bất kỳ mức API tối thiểu nào được yêu cầu hay chỉ dịch vụ phát lib sẽ thực hiện công việc? –
@MayurMore Được hỗ trợ từ Android 2.2 trở đi ... –
Cả hai liên kết đều trỏ đến một thứ khác ngay bây giờ –