2015-09-03 14 views
13

Tôi đang làm việc trên ứng dụng demo để lấy mẫu hoạt động hiện tại bằng Google Fit. Tôi có thể nhận được tốc độ cũng như khoảng cách chính xác. Nhưng nó không trở lại trạng thái "in_vehicle" hoặc "đi xe đạp" rất thường xuyên mặc dù tôi ở trong cùng một tiểu bang. Tìm ảnh chụp màn hình đính kèm cho cùng một. Tôi có tốc độ 59,40KM/H (36,91 M/h) và tại thời điểm đó nó không trả lại trạng thái hoạt động "in_vehicle".Tải Hoạt động Hiện tại từ Google Fit API Android

Vui lòng cung cấp giải pháp/phản hồi cho tương tự.

Code:

@Override 
public void onDataPoint(DataPoint dataPoint) { 
    for (Field field : dataPoint.getDataType().getFields()) { 
     Value val = dataPoint.getValue(field); 
      if(field.getName().trim().toLowerCase().equals("activity")) 
        { 
         if(FitnessActivities.getName(Integer.parseInt(val.toString())).equals("biking")) 
         { 
          strState = "Cycling"; 
         } 
         else if(FitnessActivities.getName(Integer.parseInt(val.toString())).equals("in_vehicle")) 
         { 
          strState = "Automotive"; 
         } 
         else if(FitnessActivities.getName(Integer.parseInt(val.toString())).equals("walking")) 
         { 
          strState = "Walking"; 
         } 
         else 
         { 
          strState = "Not Moving"; 
         } 
        } 
      } 
} 

Cảm ơn.

IMAGE

+0

đoạn mã chúng ta sẽ hiểu rõ hơn. – dhams

+0

đã đăng/chỉnh sửa .. – steve

+0

Bạn nên chỉnh sửa tiêu đề và nội dung của câu hỏi để cho biết rằng "hoạt động" không đề cập đến "android.app.Activity", mà là chỉnh sửa "chuỗi hoạt động thể dục". –

Trả lời

1

Như bạn đã nói bạn đang nhận được tốc độ chính xác. Bạn có thể đặt mã tùy chỉnh được viết bên dưới.

if (strState.equals("Automotive") && speed == 0.00) 
{ 
   strState = "Not Moving"; 
} 
else if (strState.equals("Not Moving") && speed > 5) 
{ 
   strState = "Automotive"; 
} 
else 
{ 
   strState = "strState"; 
} 

Đây có thể không chính xác nhưng sẽ cho bạn kết quả gần đó.

-2

Tôi không quen thuộc với google phù hợp api, vì vậy lời khuyên duy nhất tôi có thể cung cấp cho bạn là để kiểm tra mã của bạn một cách cẩn thận. Là
Integer.parseInt(val.toString())
trả lại đúng int và có thể
FitnessActivities.getName()
bằng "xe đạp", "đi bộ", "in_vehicle" vv

Như tôi có thể nhìn thấy từ đây: https://developers.google.com/fit/rest/v1/reference/activity-types

Đi xe đạp, Trong xe và Đi bộ là 0, 1 và 7. Kiểm tra những gì FitnessActivities.getName (0) đang trở lại ví dụ, cũng kiểm tra là val trả về các giá trị khác nhau hoặc nó trở lại giống nhau bao giờ y thời gian.

Nếu bạn có bất kỳ vấn đề nào với mã của mình, bạn nên biết mã đang hoạt động ở bất kỳ dòng nào, phương thức và chức năng nào đang trả về ... Đồng thời thông báo cho mọi người để họ tìm thấy giải pháp dễ dàng hơn.

4

Bạn có thể tìm thấy dự án mẫu mà tôi đã tạo ở đây.

https://github.com/cyfung/ActivityRecognitionSample

Lưu ý quan trọng: bạn có thể không nhận được dữ liệu như thường xuyên như bạn yêu cầu!

Bắt đầu từ năm API 21, các hoạt động có thể được nhận ít thường xuyên hơn tham số detectionIntervalMillis nếu điện thoại đang ở chế độ tiết kiệm điện năng và màn hình tắt.

thành phần chính:

Tạo GoogleApiClient trong onCreate

mGoogleApiClient = 
     new GoogleApiClient.Builder(this).addApi(ActivityRecognition.API) 
      .addConnectionCallbacks(this).addOnConnectionFailedListener(this).build(); 

Kết nối và ngắt kết nối khách hàng api trong onStartonStop như đề xuất trong tài liệu Google Api.

@Override 
    protected void onStart() { 
    super.onStart(); 
    mGoogleApiClient.connect(); 
    mStatusView.setText("connecting"); 
    } 

    @Override 
    protected void onStop() { 
    super.onStop(); 
    mGoogleApiClient.disconnect(); 
    mStatusView.setText("disconnected"); 
    } 

Bắt đầu nhận dạng hoạt động (không nên gọi trước khi kết nối Google Api). Sử dụng PendingIntent.getService để tạo mục đích đang chờ xử lý dưới dạng gọi lại.

final PendingResult<Status> 
    statusPendingResult = 
    ActivityRecognition.ActivityRecognitionApi 
     .requestActivityUpdates(mGoogleApiClient, DETECT_INTERVAL, PendingIntent 
      .getService(this, 0, new Intent(this, ActivityDetectionService.class), 
          PendingIntent.FLAG_UPDATE_CURRENT)); 
statusPendingResult.setResultCallback(this); 

IntentService là phương pháp tiêu chuẩn được đề xuất cho callback

public class ActivityDetectionService extends IntentService { 

    protected static final String TAG = "activityDetectionService"; 

    public ActivityDetectionService() { 
    super(TAG); 
    } 

    @Override 
    protected void onHandleIntent(Intent intent) { 
    final ActivityRecognitionResult 
     activityRecognitionResult = 
     ActivityRecognitionResult.extractResult(intent); 
    if (activityRecognitionResult == null) { 
     return; 
    } 

    //process the result here, pass the data needed to the broadcast 
    // e.g. you may want to use activityRecognitionResult.getMostProbableActivity(); instead 
    final List<DetectedActivity> 
     probableActivities = 
     activityRecognitionResult.getProbableActivities(); 

    sendBroadcast(MainActivity.newBroadcastIntent(probableActivities)); 
    } 
} 

Đăng ký dịch vụ trong biểu hiện.

<service 
      android:name=".ActivityDetectionService" 
      android:exported="false"> 
    </service> 

Để sử dụng API, bạn cũng cần thêm các thông tin sau vào tệp kê khai.

<uses-permission android:name="com.google.android.gms.permission.ACTIVITY_RECOGNITION"/>

<meta-data 
       android:name="com.google.android.gms.version" 
       android:value="@integer/google_play_services_version" /> 

Để lấy lại dữ liệu đến các hoạt động tôi đã sử dụng một BroadcastReceiver tạo ra trong onCreate

mBroadcastReceiver = new BroadcastReceiver() { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
    ... 
    } 
} 

Đăng ký và unregister trong onResume và tương ứng.

@Override 
    protected void onResume() { 
    super.onResume(); 
    registerReceiver(mBroadcastReceiver, newBroadcastIntentFilter()); 
    } 

    @Override 
    protected void onPause() { 
    super.onPause(); 
    unregisterReceiver(mBroadcastReceiver); 
    } 
+0

Điều đó có rất không chính xác hay không. Nó nói in_vehicle/đi xe đạp khi tôi đang đi bộ. – steve

+0

cho điều này, tôi thực sự không thể giúp đỡ, bạn có thể kiểm tra mã, tôi chỉ sử dụng api –

+0

Đó là vấn đề tôi nêu ra và tôi đang phải đối mặt với api của Google Fit. – steve

Các vấn đề liên quan