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リストを抽出します:

 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. 

DetectActivityリストをどのように抽出できますかこの問題が発生していませんか?

答えて

1

問題は、Java 8の言語レベルの設定を使用しているため、Java 7以降の自動キャストの制限が緩和されていることです。詳細については、Why does this Java 8 program not compile?を参照してください。

私はこれをテストするために何かを持っていないので、これが動作する場合、私は確かに言うことはできませんが、あなたが最初にそれをキャストしようとすることができ:

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

それが動作しない場合それをこのように実行します。

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

どうもありがとう、二メートル:あなたは配列を使用する場合

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

さて、あなたはこのように、各要素をキャストする必要がありますエトドが働いた –

関連する問題