È possibile trovare il progetto di esempio che ho creato qui.
https://github.com/cyfung/ActivityRecognitionSample
Nota importante: non si può ottenere i dati così frequenti come richiesto!
partire dal API 21, attività può essere ricevuto meno frequentemente rispetto parametro detectionIntervalMillis se il dispositivo è in modalità di risparmio energetico e lo schermo è spento.
componenti chiave:
creare il GoogleApiClient in onCreate
mGoogleApiClient =
new GoogleApiClient.Builder(this).addApi(ActivityRecognition.API)
.addConnectionCallbacks(this).addOnConnectionFailedListener(this).build();
collegare e scollegare il client API in onStart
e onStop
come suggerito nella documentazione di Google API.
@Override
protected void onStart() {
super.onStart();
mGoogleApiClient.connect();
mStatusView.setText("connecting");
}
@Override
protected void onStop() {
super.onStop();
mGoogleApiClient.disconnect();
mStatusView.setText("disconnected");
}
riconoscimento di attività di avvio (non dovrebbe essere chiamato prima che Google Api connect). Utilizzare PendingIntent.getService
per creare l'intento in sospeso come richiamata.
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
è il metodo standard suggerito di callback per
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));
}
}
Registrare il servizio nel manifesto.
<service
android:name=".ActivityDetectionService"
android:exported="false">
</service>
Per utilizzare l'API, è necessario aggiungere anche i seguenti in manifest.
<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" />
Per tornare i dati all'attività ho usato una BroadcastReceiver creata in onCreate
mBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
...
}
}
registro e annullare la registrazione in onResume
e rispettivamente.
@Override
protected void onResume() {
super.onResume();
registerReceiver(mBroadcastReceiver, newBroadcastIntentFilter());
}
@Override
protected void onPause() {
super.onPause();
unregisterReceiver(mBroadcastReceiver);
}
pezzo di codice faremmo meglio a capire. – dhams
pubblicato/modificato .. – steve
È necessario modificare il titolo e il corpo della domanda per indicare che "attività" non si riferisce a "android.app.Activity", ma piuttosto alla stringa "attività fisica". –