Cours android

Manuel pour apprendre à créer des applications avec Google Android


Télécharger Manuel pour apprendre à créer des applications avec Google Android

★★★★★★★★★★3.5 étoiles sur 5 basé sur 1 votes.
Votez ce document:

Télécharger aussi :


Tarik ALAOUI M'HAMDI

4 place des Vernes - 77500 Chelles

Mobile : +33 (0)6.35.99.28.54   - fixe : +33(0)9.81.28.21.88

Développer avec Google Android

 

Livre Blanc - Edition 2011

Présentation d'Android Présentation et historique

Android est un système d'exploitation pour téléphone mobile open source (Licence Apache) Historique :

•  07/2005 : rachat par Google de la startup Android

•  11/2007 : Open Handset Alliance se forme et présente Android

•  10/2008 : Android devient OpenSource, sortie du G1

•  02/2009 : Android market propose des applications payantes

•  04/2009 : Android 1.5, cupcake est dévoilé;+1M de G1 vendus

•  09/2009 : Android 1.6, donut est disponible

•  Fin 2009 : plus de 18 téléphones sont disponibles, ainsi que l'apparition de Tablet PC (par Archos notamment)

•  Janvier 2010 : Android SDK 2.1

•  Mai 2010 : Android SDK 2.2

•  Decembre 2010 : Android SDK 2.3

Segment de marché visé

•Android vise essentiellement le marché des Smartphones (dit terminaux intelligents)

•Android est également utilisé dans d’autres supports tel que :

•  Ordinateur de bord du Roadster Tesla Motors1

•  Electroménager 2 (Micro-onde, machine à laver, …)

•  Domotique avec AutoHTN 3

•  Tablette PC et Netbook (Samsung, Asus, HP, …)

Répartition Android au mois de juin 2011

 

Parts de marchés

 

Pour le mois de mars 2011 les part de marché des os mobiles restent relativement stables :

•  iOs est toujours leader en France sur l?internet mobile avec 63,66%

•  Androidprogresse légèrement et représentent près de 21% des accès mobiles

•  Symbian continue à perdre des pdm à 5,20%

•  BlackBerry est toujours minoritaire en France avec 2,22%

GoogleAndroid a quasiment multiplié par 4 sa part de marché par rapport à mars 2010, principalement au détriment de Symbian OS.

•Les applications Android sont avant tout distribuées via la plateforme Android Market :

•Le coût d’entrée est de 25$ pour disposer d’un compte google developper.

•Le prix d’une application peut être fixé librement par l’éditeur entre 0,99$ et 200$

•Google prélève un revenue-sharing de 30% sur chaque vente

•Presque tous les constructeurs ont des terminaux sous Android OS à l’exception de Nokia (Symbian), Apple (iPhone OS), RIM (Blackberry OS) et palm (WebOS).

•Acer

•Alcatel

•Archos

•Dell

•Google

•HTC

•Huawei

•LG

•Motorola

•Samsung

•Sony Ericsson

•Le développement sous Android est orienté MVC (Model – View – Controller).

•Le language de programmation utilisé est le Java.

•Il est toutefois possible de développer en natif C++ grâce au NDK.

•Le développement se fait essentiellement sur Eclipse à l’aide d’un Plugin ADT fourni par Google.

•Un émulateur est présent dans le SDK pour pouvoir tester et executer ses programmes.

Les différentes versions

 

                        30 avril 2009                                  15 septembre 2009                                                          octobre 2009                       mai 2010            Décembre 2010

 

         Février 2011                      Mai 2011

           Tablet pc                        Tablet pc

Les + de chaque version

•   Android version 1.5 (Cupcake) Android version 2.0/2.1 (Éclair) Sortie le 30 avril 2009         Sortie le 26 octobre 2009

•   Enregistrement et lecture des vidéos • Interface utilisateur revue (lock screen et lanceur d’application)

•   Mise en ligne directe des vidéos sur YouTube    • Fonds d’écran animés

•   Mise en ligne directe!des photos Picasa              • New browser interface avec prise en charge du HTML5

•   Prise en charge du Bluetooth A2DP • Prise en charge du protocole Microsoft Exchange

•   Dossiers dynamiques et widgets pour la home   • New contact lists

•   Copier/coller étendu aux pages web • Prise en charge du Bluetooth 2.1

•   Nouvelle version du clavier virtuel    • Amélioration du clavier virtuel

•   Prise en charge en natif du flash et du zoom numérique pour des

•   Android version 1.6 (Donut)      appareils photosAmélioration du ratio blanc/noir sur les fonds

Sortie le 15 septembre 2009

•   Gestion multi-comptes Gmail et ajout de la synchronisation avec

•   L’application Galerie permet!d’effacer!plusieurs photos à la fois             Facebook

•   Amélioration de l’Android Market

•   Amélioration de la vitesse de la recherche vocale et intégration étendue à plus d’applications natives

•   Prise en charge sur une seule application de la prise de photo et de l’enregistrement vidéo

•   Possibilité de rechercher simultanément dans les favoris, les historiques, les contacts et sur Google depuis la home via le widget recherche • Moteur Text-to-speech

Distribution des applications

•L’extension des applications est le .apk (android package)

•La distribution se fait sur Android Market : publish/Home

Le SDK Android

Le contenu

•Le SDK Android est composé d’un ensemble d’outils et d’API

•  Ddms (Dalvik Debug Monitor Service)

•  adb (Android Debug Bridge)

•  Aapt (Android Asset Packaging Tool)

•  AVD (Android Virtual Devices)

•  Android Emulator

•La liste des API du SDK Android se trouve à cette adresse : http://

Installer le SDK Android

Télécharger le package associé à votre plateforme de développement depuis : http://

 

Ajouter un émulateur (Virtual Device)

 

Ajouter un émulateur (Virtual Device)

 

Pile logicielle

 

Les API spécifiques

•Android propose au développeur une sous partie de Java SE 5 (pas différente de J2ME)

•Les apis suivantes sont proposées :

•  Sous partie de java.* et javax.* (issues du projet Harmony)

•  dalvik.* : classes techniques

•  Sous partie de org.apache.* : surtout  des classes HTTP • .* : parser du XML avec Sax

•  android.* : la plus value d'Android !

•Un projet Android est compilé en bytecode Java (.class) + ressources, transformé en bytecode Dalvik (.dex) avant d'être zippé en distribuable (.apk)

IDE Eclipse

•Pour installer l’IDE :

•Installation du plugin Eclipse Android SDK : android/eclipse/

•Ensuite dans le menu d’Eclipse Help -> Install New Software, cliquez sur le bouton Add…

•Renseigner ensuite dans le champs Location l’url suivante :

 

Installer le plugin Google ADT

Cocher les 2 éléments, puis cliquer sur Next >

L’emulateur Android

 

Limitations de l’émulation

•Il est impossible de simuler les fonctionnalités de l'accéléromètre

•Pour les connexions internet passant par un proxy, l’emulateur ne fonctionne pas.

•Prendre des photos / films.

•D’utiliser la boussole

•Accéder aux informations liés au réseau mobile 3G/EDGE

•Multi-points

•…

Déploiement sur un terminal

•Clic droit sur le projet -> Android Tools -> Export Signed Application Package

 

Créer un certificat

          Pour signer ses packages Apk                                                                                            

Choix du répertoire de destination

 

Process de compilation

 

Architecture d'une application Android

De quoi est composée une application ?

 

Modèle de composants – Les widgets

 

 

Modèles de composants – Les évènements

Libellé

Description

Activities

UI correspondant à une vue

BroadcastReceivers

Réponds au Intents

Services

Process non associés à une vue

ContentProviders

Permet le partage de données

Modèles de composants – ressources

Libellé

Description

res/layout

Vues associées aux Activities

res/drawable

Images

res/anim

Bitmaps, animation des transitions

res/values

Fichiers de Valeurs

res/xml

Fichiers xml

res/raw

Fichiers binaires (sons, vidéos, base sqlite)

Pour accéder aux ressources depuis une classe java :

Resources myResources = getResources();

•  CharSequence styledText = myResources.getText(R.string.stop_message);

•  Drawable icon = myResources.getDrawable(R.drawable.app_icon);

•  int opaqueBlue = myResources.getColor(R.color.opaque_blue);

•  float borderWidth = myResources.getDimension(R.dimen.standard_border);

•  Animation tranOut = AnimationUtils.loadAnimation(this, R.anim.spin_shrink_fade);

•  String[] stringArray = myResources.getStringArray(R.array.string_array);

•  int[] intArray = myResources.getIntArray(R.array.integer_array);

•  AnimationDrawable rocket = (AnimationDrawable)myResources.getDrawable(R.drawable.frame_by_frame);

TP 1 – Hello World


Dans Eclipse correctement configuré : File ? New ? Android Project Le projet est automatiquement créé !

 

•  2 façons pour créer ses vues : en code ou dans un fichier xml

•  Res/layout contiendra donc les fichier xml des vues

•  Res/values pour les dictionnaires de valeurs

•  @+id/nom_du_composant permet d’accéder à l’objet présent dans la vue (TextField, EditText, ListView, …)

•  Les vues sont composées de «!Layout!»

•  FrameLayout : Calque enfant d’un Layout

•  LinearLayout : 1 ligne et 1 colonne

•  RelativeLayout : relatifs à d’autres layout

•  TableLayout : Lignes / colonnes



•  AbsoluteLayout : positionné selon les coordonnées x,y

•Les Layouts peuvent être customisés.

•Pour gérer un style de mise en forme différent en fonction de l’orientation de l’écran, il faut créer 2 fichiers xml :


TP 2 : Les activités dans Android

•Cycle de vie d'une activité avec onCreate, onStart, onPause, onStop, onResume, etc

•Création d'activités (Activity), écran liés par des Intent

•Plusieurs types d'Intent :

•  Les explicites : new Intent(context,MaClasse.class)

•  Les implicites, dont le comportement sera déterminé par la plateforme :  new Intent(Intent.ACTION_VIEW,Uri.parse(url)) 

Activité ? Un écran avec cycle de vie !

•  Une activité est un écran auquel on attache des vues

•  Une activité est régit par son cycle de vie

 

Intents et Actions associées

Intent pour envoyer un mail :

final Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND); emailIntent .setType( "plain/text" );

emailIntent .putExtra( android.content.Intent.EXTRA_EMAIL, new String[]{ "", "" } );

emailIntent .putExtra( android.content.Intent.EXTRA_SUBJECT, "Mail subject" ); emailIntent .putExtra( android.content.Intent.EXTRA_TEXT,

"The message in the e-mail body" );

startActivity( Intent.createChooser(emailIntent, "Title" ) ); Intent pour passer d’une Activity A à une Activity B :

Intent i = new Intent(, nouvelleClasse.class);

Bundle b = new Bundle();

 b.putString("TEXT1", "CECI EST UN EXEMPLE");

i.putExtras(b); startActivity(i, ID_ACTIVITY);

Pour récupérer le contenu du Bundle transmis à l’Intent :

TextView t= (TextView)findViewById(R.id.resultat);

Bundle b = this.getIntent().getExtras();

String s = b.getString("TEXT1");

t.setText(s);

TP 3 : Android et les webservices


Dans le cadre de cette démonstration, nous allons utiliser le flux RSS des :

Nous aurons besoin de créer un modèle Annonce qui servira d’objet pour manipuler chaque annonce présente dans le flux rss :

public class Annonce {

                       String titre;

                         String Description;

                         String urlThumbnail;

                       Bitmap thumbnail;

                        String urlAnnonce;

/* getter & setter */

}

Le flux RSS sera parsé selon la méthode SAX (Simple Api for XML).

On va donc créer une nouvelle classe qui va hériter de .helpers.DefaultHandler.

La classe devra importer les packages suivants :

import .IOException; import ; import .ArrayList;

import .parsers.ParserConfigurationException;

import .parsers.SAXParser; import .parsers.SAXParserFactory;

import .Attributes; import .InputSource; import .SAXException; import .XMLReader; import .helpers.DefaultHandler;

On aura également besoin de déclarer certains variables nécessaires au parcours du document xml :

public class AnnoncesJaunesWS extends DefaultHandler {

                       static final String URL_WS = ";; ArrayList<Annonce> arrList;                        StringBuffer current;         boolean isItem;                   boolean isTitle;                   boolean  isDescription;     boolean isLink;                    Annonce annonce;

/* constructeur + méthodes sax */

}

Le constructeur recevra le nom de la ville concerné par la requête du webservice :

                                                        public PageJauneWS(String city) throws ParserConfigurationException, SAXException, IOException{

                                                URL url = new URL(String.format(URL_WS, city));

                                                   SAXParserFactory spf = SAXParserFactory.newInstance();

                        SAXParser sp = spf.newSAXParser();                             XMLReader xp = sp.getXMLReader();                                  xp.setContentHandler(this);

                                               xp.parse(new InputSource(url.openStream()));

               }

Ensuite, nous devons surcharger les méthodes suivantes :

public void startDocument() throws SAXException{}

public void startElement(String uri, String localName, String qName,Attributes attributes) throws SAXException{}

public void characters(char[] ch, int start, int length) throws SAXException{} public void endElement(String uri, String localName, String qName) throws SAXException{}

public void endDocument() throws SAXException{}


                @Override

public void startDocument() throws SAXException {                                            super.startDocument();

                                        arrList = new ArrayList<Annonce>();

              }

                @Override

public void startElement(String uri, String localName, String qName,                                                                   Attributes attributes) throws SAXException {

                                             super.startElement(uri, localName, qName, attributes);

                                    if(localName == "item"){

                         isItem = true;                                                    if(annonce != null)                                                                                             annonce = null;

                                                            annonce = new Annonce();

                            }

                                        if(localName == "title" && isItem){

                                               isTitle = true;

                                                    current = new StringBuffer("");

                            }

if(localName == "description" && isItem){                                                          isDescription = true;

                                                    current = new StringBuffer("");

                            }

                                       if(localName == "link" && isItem){

                                              isLink = true;

                                                    current = new StringBuffer("");

                            }

                                        if(localName == "thumbnail" && isItem){

                                                          annonce.setUrlThumbnail(attributes.getValue("url"));

                            }

              }

                @Override

                                                                        public void characters(char[] ch, int start, int length) throws SAXException {

super.characters(ch, start, length);                                             if(isTitle || isLink || isDescription)

                                                         current.append(new String(ch, start, length));

              }

                @Override

                                    public void endElement(String uri, String localName, String qName)

                  throws SAXException {

super.endElement(uri, localName, qName);

if(localName == "item"){                                                            isItem = false;

                                                (annonce);

                            }

                                        if(localName == "title" && isItem){

                                                isTitle = false;

                                                      annonce.setTitre(current.toString());

                            }

if(localName == "description" && isItem){                                                          isDescription = false;                                                                  annonce.setDescription(current.toString());

                            }

if(localName == "link" && isItem){                                                                      isLink = false;

                                                      annonce.setUrlAnnonce(current.toString());

                            }

              }

                @Override

public void endDocument() throws SAXException {                                             super.endDocument();

                                            Log.i("PageJaunes", () + "");

              }


Parser un webservice : POST

Pour effectuer une requête en POST, il suffit d’utiliser l’objet HttpClient

HttpClient client = new DefaultHttpClient();

HttpPost post = new HttpPost(address);

List<NameValuePair> pairs = new ArrayList<NameValuePair>(); (new BasicNameValuePair("key1", "value1")); (new BasicNameValuePair("key2", "value2")); post.setEntity(new UrlEncodedFormEntity(pairs));

HttpResponse response = client.execute(post);

Une fois la réponse HttpResponse récupérée, il ne reste plus qu’à utilisé l’exemple précédent en convertissant l’objet response en InputStream();

InputStream is = response.getEntity().getContent();

PERSISTANCE DES DONNEES

SharedPreferences : Ecriture

public static final String MYPREFS = “mySharedPreferences”;



protected void savePreferences(){

// Create or retrieve the shared preference object. int mode = Activity.MODE_PRIVATE; SharedPreferences mySharedPreferences = getSharedPreferences(MYPREFS, mode);

SharedPreferences.Editor editor = (); // Store new primitive types in the shared preferences object.

editor.putBoolean(“isTrue”, true); editor.putFloat(“lastFloat”, 1f); editor.putInt(“wholeNumber”, 2); editor.putLong(“aNumber”, 3l);

editor.putString(“textEntryValue”, “Not Empty”);

// Commit the changes

editor.commit();

}

SharedPreferences : Lecture

public void loadPreferences() {

// Get the stored preferences int mode = Activity.MODE_PRIVATE;

SharedPreferences mySharedPreferences = getSharedPreferences(MYPREFS, mode); // Retrieve the saved values. boolean isTrue = mySharedPreferences.getBoolean(“isTrue”, false); float lastFloat = mySharedPreferences.getFloat(“lastFloat”, 0f); int wholeNumber = mySharedPreferences.getInt(“wholeNumber”, 1); long aNumber = mySharedPreferences.getLong(“aNumber”, 0);

String stringPreference;

stringPreference = mySharedPreferences.getString("textEntryValue",""); }

Les I/O

Ecriture de fichier

String FILE_NAME = “”;

// Create a new output file stream that’s private to this application.

FileOutputStream fos = openFileOutput(FILE_NAME, Context.MODE_PRIVATE);

// Create a new file input stream.

FileInputStream fis = openFileInput(FILE_NAME); lecture de fichier

String OUTPUT_FILE = “”;

FileOutputStream fos = openFileOutput(OUTPUT_FILE, Context.MODE_WORLD_WRITEABLE);

lecture de fichier depuis les ressources

Resources myResources = getResources();

InputStream myFile = myResources.openRawResource(R.raw.myfilename);

DataBase SQLITE

public class MaBaseOpenHelper extends SQLiteOpenHelper {

final static String TABLE = "NEWS";    final static String COLONNE_ID = "id";     final static String COLONNE_TITRE = "titre";              final static String COLONNE_LINK = "link";

final static String COLONNE_DESCRIPTION = "description";                                      

                                                        final static String CREATE_TABLE = "create table "

                                                                         + TABLE + " (" + COLONNE_ID +" integer primary key autoincrement, "

                                                               + COLONNE_TITRE + " text not null, "

                                                              + COLONNE_LINK + " text not null, "

                                                                + COLONNE_DESCRIPTION + " text not null);";

public MaBaseOpenHelper(Context context, String name,                                                    CursorFactory factory, int version) {                           super(context, name, factory, version);                                 // TODO Auto-generated constructor stub

                                     }

                                      @Override

public void onCreate(SQLiteDatabase db) {                             // TODO Auto-generated method stub

                                                        db.execSQL(CREATE_TABLE);

                                     }

                                      @Override

                                                               public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

                                                           // TODO Auto-generated method stub

              db.execSQL("DROP TABLE "+TABLE );                          onCreate(db);

                                     }

}

SQLITE - Suite

SqliteDatabase db;

MaBaseOpenHelper mydb = new MaBaseOpenHelper(getBaseContext(), "", null, 1);

        try{

                 db = mydb.getWritableDatabase();

        }catch(Exception e){

                 db = mydb.getReadableDatabase();

        }

        db.execSQL("INSERT INTO "+TABLE + " ("+COLONNE_TITRE+", "+COLONNE_LINK+", "+COLONNE_DESCRIPTION

                                                                                                                                                                     +") VALUES (\"titre 1\",\"\", \"ceci est un test\")");

        db.execSQL("INSERT INTO "+TABLE + " ("+COLONNE_TITRE+", "+COLONNE_LINK+", "+COLONNE_DESCRIPTION                                       +") VALUES (\"titre 2\",\"\", \"ceci est un test\")");

                db.close();

TP 4 : Persistance des données

•    Création d’une application permettant la sauvegarde et la lecture des données

•    Utilisation de sqlite, I/O SD Card et SharedPreferences.

Fonctions téléphony


•    GPS

•    Envoi de SMS / lecture des SMS reçu

•    Envoi de mail via SMTP

•    intercepter un appel entrant

•    émettre un appel téléphonique

GPS

LocationManager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);

// Ajout d’un listener qui sera actualité à chaque changement de position GPS

LocationListener locationListener = new LocationListener() {

    public void onLocationChanged(Location location) {

Log.i(‘GPS’, location.);

    }

    public void onStatusChanged(String provider, int status, Bundle extras) {}

    public void onProviderEnabled(String provider) {}

    public void onProviderDisabled(String provider) {}

  };

locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener);

Il faut ajouter la permission suivante :

  <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

Pour en savoir plus :

Envoyer un sms via l’Intent SMS

Uri smsUri = Uri.parse("tel:100861");

Intent intent = new Intent(Intent.ACTION_VIEW, smsUri); intent.putExtra("sms_body", "shenrenkui"); intent.setType("vnd.android-dir/mms-sms"); startActivity(intent);

Envoyer un sms via le SmsManager

SmsManager m = SmsManager.getDefault();

String destination = "06761122334";

String text = "Hello, Jenny!";

m.sendTextMessage(destination, null, text, null, null);

Envoyer un Email via les Intents

final Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND); emailIntent .setType( "plain/text" );

emailIntent .putExtra( android.content.Intent.EXTRA_EMAIL, new String[]{ "", "" } ); emailIntent .putExtra( android.content.Intent.EXTRA_SUBJECT, "Mail subject" ); emailIntent .putExtra( android.content.Intent.EXTRA_TEXT,

"The message in the e-mail body" );

startActivity( Intent.createChooser(emailIntent, "Title" ) );

Intercepter un appel téléphonique

import .Activity; import .Bundle; import .Handler; import .Message; import android.telephony.Phone;

import android.telephony.PhoneStateIntentReceiver; import ;

public class ReactOnIncomingCall extends Activity {      final int PHONECALLSTATE_RECONGNIZE_ID = 0x539;

     PhoneStateIntentReceiver myPsir = null;

    Handler myPhoneStateChangedHandler = new Handler(){

          @Override

if( == PHONECALLSTATE_RECONGNIZE_ID){

Phone.State myState = myPsir.getPhoneState();

                    Log.d("PhoneCallStateNotified", myState.toString());

if(myState == Phone.State.RINGING){

                         // faire une action

                    }

               }

          }

    };

    @Override

    public void onCreate(Bundle icicle) {

        super.onCreate(icicle);

        setContentView();

       this.myPsir = new PhoneStateIntentReceiver(this, myPhoneStateChangedHandler);

       this.myPsir.notifyPhoneCallState(PHONECALLSTATE_RECONGNIZE_ID);         this.myPsir.registerIntent();

    }

}


Références

Références

•    

•    

•    

•     /

•     /

•    

•    

•    

•    

est un service édité par :

Tarik ALAOUI M'HAMDI

4 place des Vernes - 77500 Chelles

Mobile : +33 (0)6.35.99.28.54   - fixe : +33(0)9.81.28.21.88 mail : |

web : |

SIRET : 510 589 138 00013 - CODE APE : 6201Z



12