1. GDG L-Ab for Droidcon Italy 2014
Torino 6-7 Febbraio
CODELAB ACTIVITY RECOGNITION
Preparare l’ambiente:
Intallare ADT Bundle o Android Studio
Piccola nota:
Abbiamo avuto problemi con Android Studio? Si è vero. Impieghiamo troppo tempo inizialmente a
capire come funziona e cosa può darci in più? Si è vero. Ma tutti gli sforzi iniziali verranno ripagati
senza ombra di dubbio. Si sta spingendo molto in questa direzione, consigliamo vivamente di
iniziare ad utilizzarlo.
Creare un nuovo progetto.
Includere la libreria Google Play Services
Step 1:
Andiamo a studiare l’intent, il cuore della nostra applizaione. Con questo intent chiediamo di fatto cosa sta
facendo l’utente, con una certa precisione che viene recuperata con il metodo getConfidence().
Il metodo getMostProbableActivity() è il metodo che ritorna una DetectedActivity, che verrà poi
utilizzata per recuperare il contesto.
La DetectedActivity viene passata al metodo getType() il quale restituisce un int che potremo utilizzare
nel metodo getNameFromType(int activityType).
Quest’ultimo metodo, ritorna una string contenente il contesto che andremo poi a visualizzare nella
MainActivity.
public class ActivityRecognitionIntentService extends IntentService{
public ActivityRecognitionIntentService() {
super("ActivityRecognitionIntentService");
// TODO Auto-generated constructor stub
}
@Override
protected void onHandleIntent(Intent intent) {
if (ActivityRecognitionResult.hasResult(intent)) {
ActivityRecognitionResult result =
ActivityRecognitionResult.extractResult(intent);
DetectedActivity mostProbableActivity = result.getMostProbableActivity();
int activityType = mostProbableActivity.getType();
String activityName = getNameFromType(activityType);
Message msg = new Message();
msg.obj = activityName;
MainActivity.mHandler.sendMessage(msg);
Giuseppe Cerratti - giuseppe.ciuffo@gmail.com - Giovanni Laquidara - glaquidara@gmail.com
GDG L-AB Team
2. GDG L-Ab for Droidcon Italy 2014
Torino 6-7 Febbraio
Step 2:
Come accennato in precedenza il metodo getNameFromType(int activityType) è il metodo che ritorna
la string con il contesto ricavato dalla DetectedActivity.
private String getNameFromType(int activityType) {
switch(activityType) {
case DetectedActivity.IN_VEHICLE:
return "in_vehicle";
case DetectedActivity.ON_BICYCLE:
return "on_bicycle";
case DetectedActivity.ON_FOOT:
return "on_foot";
case DetectedActivity.STILL:
return "still";
case DetectedActivity.UNKNOWN:
return "unknown";
case DetectedActivity.TILTING:
return "tilting";
}
return "unknown";
Step 3:
Nell’onCreate andiamo ad inizializzare tutte le classi che ci occorreranno per aggiornare periodicamente
l’ActivityRecognition e recuperare la posizione quando il dispositivo è fermo.
@Override
public void onCreate(Bundle savedInstanceState) {
…
mLocationRequest = new LocationRequest();
mLocationClient =
new LocationClient(getBaseContext(), mLocationRequest, mLocationRequest);
mDetectionRequester = new DetectionRequester(getBaseContext());
mDetectionRemover = new DetectionRemover();
Step 4:
In onStart verifichiamo che Google Play Services sia raggiungibile.
public void onStart() {
super.onStart();
mUpdatesRequested = true;
if (servicesConnected()) {
startPeriodicUpdates();
}
mLocationClient.connect();
}
Giuseppe Cerratti - giuseppe.ciuffo@gmail.com - Giovanni Laquidara - glaquidara@gmail.com
GDG L-AB Team
3. GDG L-Ab for Droidcon Italy 2014
Torino 6-7 Febbraio
Step 5:
Iniziamo l’update, richiedendo periodicamente al dispositivo
private void startPeriodicUpdates() {
…
mDetectionRequester.requestUpdates();
}
Step 6:
Una volta scritta, tramite un Handler, nell’apposita TextView la stringa contenente il contesto ritornato,
andiamo a recuperare la posizione corrente, nel caso in cui il messaggio dell’Handler sia uguale a “still”.
mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
String text = (String)msg.obj;
teVi_currentAct.setText(text);
if (text.equals("still")) {
getLocation();
}
}
};
Step 7:
Ciò è possibile grazie al metodo: getLocation() che andrà a recuperare la location attuale.
public void getLocation(){
Location mCurrentLocation = mLocationClient.getLastLocation();
try {
getAddress(mCurrentLocation);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
Step 8:
Ma a noi non interessa semplicemente la nostra posizione, ma la città nella quale ci troviamo. Questa
informazione la recuperiamo andando a fare un Geocode della Location ritornata dal metodo precedente.
Il Geocoder ci fornisce un ArrayList di Address, di possibili indirizzi. Andremo a scegliere il primo che ci viene
ritornato.
Dall’Address possiamo ottenere diverse informazioni. Per recuperare la città ci basterà invocare il metodo
getLocality()Il quale ritornerà una string contenente il nome della città individuata dalla località passata
come parametro.
Attenzione:
Eessendoci possibilità che il Geocoder fallisca è sempre buona norma inserirlo in un
costrutto “try-catch” in modo da non incorrere in arresti anomali piuttosto fastidiosi.
Giuseppe Cerratti - giuseppe.ciuffo@gmail.com - Giovanni Laquidara - glaquidara@gmail.com
GDG L-AB Team
4. GDG L-Ab for Droidcon Italy 2014
Torino 6-7 Febbraio
private void getAddress(Location loc){
Geocoder geo = new Geocoder(getBaseContext(), Locale.getDefault());
String city = null;
try {
List<Address> addresses =
geo.getFromLocation(loc.getLatitude(), loc.getLongitude(), 1);
if (addresses.size() > 0) {
city = addresses.get(0).getLocality();
teVi_loc.setText("Sei arrivato a: "+city);
if (city.equals(teVi_choosedLoc.getText())) {
teVi_loc.setText("Sei arrivato a destinazione");
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
Giuseppe Cerratti - giuseppe.ciuffo@gmail.com - Giovanni Laquidara - glaquidara@gmail.com
GDG L-AB Team