SlideShare a Scribd company logo
1 of 4
Download to read offline
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
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
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
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

More Related Content

Viewers also liked

Familias de instrumentos
Familias de instrumentosFamilias de instrumentos
Familias de instrumentos
mariodelteso
 
PLANTILLAS
PLANTILLASPLANTILLAS
PLANTILLAS
Maaylin3
 
Membuat aplikasi dengan php
Membuat aplikasi dengan phpMembuat aplikasi dengan php
Membuat aplikasi dengan php
Agus Supriatna
 
Asamblea Merka Chapa Chaps
Asamblea Merka Chapa ChapsAsamblea Merka Chapa Chaps
Asamblea Merka Chapa Chaps
Amorevi Vicente
 
FASE DE DISTRIBUCIÓN. MERKA CHAPA CHAPS
FASE DE DISTRIBUCIÓN. MERKA CHAPA CHAPSFASE DE DISTRIBUCIÓN. MERKA CHAPA CHAPS
FASE DE DISTRIBUCIÓN. MERKA CHAPA CHAPS
Amorevi Vicente
 
Presentation1.personal strategic plannig
Presentation1.personal strategic plannigPresentation1.personal strategic plannig
Presentation1.personal strategic plannig
helou2014
 
Termodinamica 6 ed - yunus
Termodinamica   6 ed - yunusTermodinamica   6 ed - yunus
Termodinamica 6 ed - yunus
Pao Zuñiga
 
Eskizofrenia ulertu
Eskizofrenia ulertuEskizofrenia ulertu
Eskizofrenia ulertu
Xuaxtenea
 

Viewers also liked (20)

Christoph Tank, audioguide.me, Local Web Conference 2014
Christoph Tank, audioguide.me, Local Web Conference 2014Christoph Tank, audioguide.me, Local Web Conference 2014
Christoph Tank, audioguide.me, Local Web Conference 2014
 
Familias de instrumentos
Familias de instrumentosFamilias de instrumentos
Familias de instrumentos
 
PLANTILLAS
PLANTILLASPLANTILLAS
PLANTILLAS
 
Membuat aplikasi dengan php
Membuat aplikasi dengan phpMembuat aplikasi dengan php
Membuat aplikasi dengan php
 
Asamblea Merka Chapa Chaps
Asamblea Merka Chapa ChapsAsamblea Merka Chapa Chaps
Asamblea Merka Chapa Chaps
 
Entrepreneurship ala TDA
Entrepreneurship ala TDAEntrepreneurship ala TDA
Entrepreneurship ala TDA
 
FASE DE DISTRIBUCIÓN. MERKA CHAPA CHAPS
FASE DE DISTRIBUCIÓN. MERKA CHAPA CHAPSFASE DE DISTRIBUCIÓN. MERKA CHAPA CHAPS
FASE DE DISTRIBUCIÓN. MERKA CHAPA CHAPS
 
Presentation1.personal strategic plannig
Presentation1.personal strategic plannigPresentation1.personal strategic plannig
Presentation1.personal strategic plannig
 
Events & convention v web
Events & convention v webEvents & convention v web
Events & convention v web
 
Zethiopia Newspaper Jan 2014
Zethiopia Newspaper Jan 2014Zethiopia Newspaper Jan 2014
Zethiopia Newspaper Jan 2014
 
INNOVACIÓN EN LA PRÁCTICA EDUCATIVA
INNOVACIÓN EN LA PRÁCTICA EDUCATIVAINNOVACIÓN EN LA PRÁCTICA EDUCATIVA
INNOVACIÓN EN LA PRÁCTICA EDUCATIVA
 
Termodinamica 6 ed - yunus
Termodinamica   6 ed - yunusTermodinamica   6 ed - yunus
Termodinamica 6 ed - yunus
 
Decreto 2539 de 2005
Decreto 2539 de 2005Decreto 2539 de 2005
Decreto 2539 de 2005
 
3
33
3
 
Txiklea
TxikleaTxiklea
Txiklea
 
Eskizofrenia ulertu
Eskizofrenia ulertuEskizofrenia ulertu
Eskizofrenia ulertu
 
90decadestony
90decadestony90decadestony
90decadestony
 
Consolidado final Operacion Social Catatumbo 04-08-2013
Consolidado final Operacion Social Catatumbo 04-08-2013Consolidado final Operacion Social Catatumbo 04-08-2013
Consolidado final Operacion Social Catatumbo 04-08-2013
 
EDICIÓN DE IMÁGENES
EDICIÓN DE IMÁGENES EDICIÓN DE IMÁGENES
EDICIÓN DE IMÁGENES
 
Al·licient 1
Al·licient 1Al·licient 1
Al·licient 1
 

Similar to Droidcon Italy 2014 on Train - Codelab step

Pycon Jungle
Pycon JunglePycon Jungle
Pycon Jungle
guest6b08a5
 

Similar to Droidcon Italy 2014 on Train - Codelab step (16)

The Hitchhiker's Guide to testable code: semplici regole per scrivere codice ...
The Hitchhiker's Guide to testable code: semplici regole per scrivere codice ...The Hitchhiker's Guide to testable code: semplici regole per scrivere codice ...
The Hitchhiker's Guide to testable code: semplici regole per scrivere codice ...
 
Pillole di C++
Pillole di C++Pillole di C++
Pillole di C++
 
Programmazione a oggetti tramite la macchina del caffé (pt. 2)
Programmazione a oggetti tramite la macchina del caffé (pt. 2)Programmazione a oggetti tramite la macchina del caffé (pt. 2)
Programmazione a oggetti tramite la macchina del caffé (pt. 2)
 
Baby Steps TripServiceKata
Baby Steps TripServiceKataBaby Steps TripServiceKata
Baby Steps TripServiceKata
 
Non Conventional Android Programming (Italiano)
Non Conventional Android Programming (Italiano)Non Conventional Android Programming (Italiano)
Non Conventional Android Programming (Italiano)
 
Xamarin.android
Xamarin.androidXamarin.android
Xamarin.android
 
Groovy & Grails
Groovy & GrailsGroovy & Grails
Groovy & Grails
 
Clean android code
Clean android codeClean android code
Clean android code
 
iContract
iContractiContract
iContract
 
Clean android code - Droidcon Italiy 2014
Clean android code - Droidcon Italiy 2014Clean android code - Droidcon Italiy 2014
Clean android code - Droidcon Italiy 2014
 
A new clustering boids algorithm
A new clustering boids algorithmA new clustering boids algorithm
A new clustering boids algorithm
 
Introduzione alla programmazione android - Android@tulug lezione 3
Introduzione alla programmazione android - Android@tulug lezione 3Introduzione alla programmazione android - Android@tulug lezione 3
Introduzione alla programmazione android - Android@tulug lezione 3
 
Oo Javascript
Oo JavascriptOo Javascript
Oo Javascript
 
Qt Lezione4 Parte2: creare un custom widget plugin per Qt Designer
Qt Lezione4 Parte2: creare un custom widget plugin per Qt DesignerQt Lezione4 Parte2: creare un custom widget plugin per Qt Designer
Qt Lezione4 Parte2: creare un custom widget plugin per Qt Designer
 
Programmazione mobile: ANDROID
Programmazione mobile: ANDROIDProgrammazione mobile: ANDROID
Programmazione mobile: ANDROID
 
Pycon Jungle
Pycon JunglePycon Jungle
Pycon Jungle
 

Droidcon Italy 2014 on Train - Codelab step

  • 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