2

로 업데이트 한 후 컴파일되지 않습니다 :ActivityDetectionBroadcastReceiver이 내 onReceive 기능입니다 GooglePlayServices 26.0.2

@Override 
public void onReceive(Context context, Intent intent) { 
    ArrayList<DetectedActivity> updatedActivities = 
      intent.getParcelableArrayListExtra(Constants.ACTIVITY_EXTRA); 
    int type = 0x0; 
    Integer confidence = 0; 
    Collections.sort(updatedActivities, new Comparator<DetectedActivity>() { 
     @Override 
     public int compare(DetectedActivity lhs, DetectedActivity rhs) { 
      if(lhs.getConfidence() > rhs.getConfidence()){ 
       return -1; 
      }else if(lhs.getConfidence() > rhs.getConfidence()){ 
       return 1; 
      } 
      return 0; 
     } 
    }); 
    String rawData = "("; 
    for (DetectedActivity detectedActivity : updatedActivities){ 
     if(detectedActivity.getConfidence() >= 25){ 
      if(type==PSMotionService.unknown || type==PSMotionService.stationary) { 
       rawData += detectedActivity.getType() + ":" + detectedActivity.getConfidence() + ","; 
       Log.i("", "autopilot type detected activity: " + detectedActivity); 
       if (confidence < detectedActivity.getConfidence()) { 
        confidence = detectedActivity.getConfidence(); 
       } 
       if (detectedActivity.getType() == DetectedActivity.STILL) { 
        type |= PSMotionService.stationary; 
       } else if (detectedActivity.getType() == DetectedActivity.IN_VEHICLE) { 
        type |= PSMotionService.automotive; 
       } else if (detectedActivity.getType() == DetectedActivity.ON_BICYCLE) { 
        type |= PSMotionService.bicycling; 
       } else if (detectedActivity.getType() == DetectedActivity.ON_FOOT || detectedActivity.getType() == DetectedActivity.WALKING) { 
        type |= PSMotionService.walking; 
       } else if (detectedActivity.getType() == DetectedActivity.RUNNING) { 
        type |= PSMotionService.running; 
       } else if (detectedActivity.getType() == DetectedActivity.UNKNOWN) { 
        type |= PSMotionService.unknown; 
       } 
      } 
     } 
    } 
    rawData += ")"; 
    Long timestamp = System.currentTimeMillis()/1000; 
    Integer confidenceFlag = 0; 
    if(confidence >= 25 && confidence < 75){ 
     confidenceFlag = 1; 
    }else if(confidence >=75){ 
     confidenceFlag = 2; 
    } 
    Log.i("", "autopilot type is:" + type + "... timestamp: " + timestamp + "....confidence" + confidence + "...confidenceFlag:" + confidenceFlag); 
    Log.i("", "autopilot-----------------------------------------------END"); 
    Motion activity = new Motion(timestamp, type, confidenceFlag); 
    Utils.appendLog("NEW MOTION: [" + activity.getTimestamp() + ", " + activity.getType() + ", " + activity.getConfidence() + "]" + rawData, "D", Constants.TRACKER); 
    if(PSTrip.getActiveTrip() != null){ 
     PSMotionService.getInstance(context).motionsTrip.add(activity); 
     Log.i("", "autopilot added to trip: size is:" + PSMotionService.getInstance(context).motionsTrip.size()); 
     if(PSApplicationClass.getInstance().pref.getGeoEnabled(context)) { 
      appendMotionActivity(context, type, activity); 
     } 
    }else{ 
     Log.i("", "autopilot test to add to buffer"); 
     appendMotionActivity(context, type, activity); 
    } 
    Log.i("", "autopilot-----------------------------------------------END AAAAALLLLLLL"); 
} 

그리고이 같은 의도에서 DetectedActivity 목록을 추출합니다 : I를

 ArrayList<DetectedActivity> updatedActivities = 
      intent.getParcelableArrayListExtra(Constants.ACTIVITY_EXTRA); 

하지만 지금 이 문제를 얻으십시오 :

/Users/alinrosu/Workspace/passenger-android/passenger/src/main/java/nl/hgrams/passenger/listeners/ActivityDetectionBroadcastReceiver.java 
Error:(31, 51) error: incompatible types: inferred type does not conform to upper bound(s) 
inferred: DetectedActivity 
upper bound(s): Parcelable 
Error:Execution failed for task ':passenger:compileDebugJavaWithJavac'. 
> Compilation failed; see the compiler error output for details. 

어떻게 DetectedActivity 목록을 추출 할 수 있습니까? 이 문제가 발생하는 이유는 무엇입니까?

답변

1

문제는 Java 8의 언어 수준 설정을 사용하고있어 Java 7 이하에서 자동으로 적용되는 일부 제한 사항을 강화하는 것입니다. 자세한 내용은 Why does this Java 8 program not compile?을 참조하십시오.

나는 이것을 테스트하기 위해 뭔가를 가지고 있지 않기 때문에이 작동하는지 내가 확실히 말할 수는 없지만, 당신이 먼저 캐스팅을 시도 할 수 있습니다 :

ArrayList<DetectedActivity> updatedActivities = 
    (ArrayList<DetectedActivity>)intent.getParcelableArrayListExtra(Constants.ACTIVITY_EXTRA); 

문제가 해결되지 않으면 당신이 배열을 사용할 때

이제
ArrayList<Parcelable> updatedActivities = intent.getParcelableArrayListExtra(Constants.ACTIVITY_EXTRA); 

것은,이 같은 각 요소를 캐스팅해야합니다 : 그것은이 방법으로 할

for (Parcelable p : updatedActivities) { 
    // cast to correct type 
    DetectedActivity detectedActivity = (DetectedActivity)p; 
    // do whatever with "detectedActivity"... 
} 
+0

덕분에 많이, 두번째 m 소수 민족 –

관련 문제