2

Ceci est ma fonction OnReceive:ActivityDetectionBroadcastReceiver ne compile pas après la mise à jour 26.0.2 GooglePlayServices

@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"); 
} 

Et j'extraire la liste DetectedActivity de l'intention comme ceci:

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

Mais maintenant, je obtenez ce problème:

/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. 

Comment puis-je extraire la liste DetectedActivity, avec hout obtenir ce problème?

Répondre

1

Le problème est que vous utilisez les paramètres de niveau de langue pour Java 8, ce qui renforce certaines restrictions sur la diffusion automatique qui étaient OK dans Java 7 et moins. Voir Why does this Java 8 program not compile? pour plus de détails.

Je n'ai quelque chose à tester cela avec, donc je ne peux pas dire avec certitude si cela va fonctionner, mais vous pouvez d'abord essayer de le jeter:

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

Si cela ne fonctionne pas , faites-le de cette façon:

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

maintenant, lorsque vous utilisez le tableau, vous aurez besoin de jeter chaque élément, comme ceci:

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

Merci beaucoup, deuxième m ethod a travaillé –