2014-11-21 14 views
10

Sử dụng thiết bị Android của tôi làm cách nào để phát hiện xem người dùng có đang đi bộ, đi xe đạp hoặc lái xe không? Tôi đã kiểm tra Google Fit app. Nó phân biệt giữa chạy, đi xe đạp và lái xe. Tôi bối rối về những thuật toán tôi nên sử dụng để phân biệt giữa các hoạt động này.Phát hiện hoạt động của người dùng (chạy, đạp xe, lái xe) bằng cách sử dụng Android

Tôi biết tôi sẽ phải sử dụng cảm biến gia tốc kế. Nhưng tôi vẫn không thể phân biệt các hoạt động này.

Trả lời

10

Bạn có thể sử dụng GooglePlayServices cho việc này.

Nó cung cấp apis đặc biệt cho ActivityRecognition, trả về hoạt động của Người dùng với mức độ tin cậy cho mỗi.

https://developer.android.com/reference/com/google/android/gms/location/ActivityRecognitionClient.html

http://developer.android.com/training/location/activity-recognition.html

+0

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? –

+0

@MayurMore Được hỗ trợ từ Android 2.2 trở đi ... –

+0

Cả hai liên kết đều trỏ đến một thứ khác ngay bây giờ –

2

Bạn có thể sử dụng DetectActivity để phân biệt giữa các loại hoạt động được xác định trước.

13

Câu hỏi này là khá cũ, nhưng kể từ khi có công nghệ mới trên mạng, tôi nghĩ rằng nó là đáng nói, nếu có ai vẫn đang gặp phải vấn đề này.

tôi có thể đưa ra 3 lựa chọn:

  1. Bạn có thể thực hiện kỹ thuật của riêng bạn để phát hiện đi bộ, lái xe, đi xe đạp - sử dụng Activity recognitionreceiving location updates, mặc dù tôi khuyên bạn không làm như vậy, đừng phát minh lại bánh xe, có apis tốt đã được phát triển rồi, bây giờ là năm 2016.
  2. Bạn có thể sử dụng sdk miễn phí Neura có thể gửi cho bạn sự kiện khi người dùng của bạn bắt đầu/kết thúc lái xe, bắt đầu/kết thúc đi bộ, bắt đầu/kết thúc chạy, read more of the events you can get from Neura.

    Kiểm tra điều này git project: Về cơ bản, dự án có tất cả các sự kiện mà Nuera có thể phát hiện. Rất dễ dàng để chỉ thực hiện dự án này và biến nó thành của riêng bạn.

    Tôi khuyên bạn nên sử dụng tùy chọn Neura sdk này.

  3. 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"); 
    
Các vấn đề liên quan