Affichage des articles dont le libellé est Android. Afficher tous les articles
Affichage des articles dont le libellé est Android. Afficher tous les articles
dimanche 24 juin 2012
lundi 18 juin 2012
Les notifications sous Android
Le but de ce tutoriel est d’apprendre à utiliser les notifications
sous Android et de prévenir les utilisateurs de vos applications d’un
événement particulier ou interagir avec eux.

Nous allons créer un projet qui comprendra deux boutons :
Le fichier “strings.xml” pour rajouter les différentes strings pour le texte des boutons
Voici le résultat que vous allez obtenir.

Je vous met l’icone que j’ai utilisé pour la notifcation
.
Il suffit maintenant d’appeler la méthode dans votre code, ce qui donnera :
Il faut rajouter la permission “Vibration” dans l’AndroidManifest.xml
et les nouveaux textes dans le fichier “Strings.xml”


Qu’est qu’une notification ?
Une notification est une indication qui s’affiche sur la barre qui se situe en haut d’un téléphone Android. Cette notification sert à prévenir un utilisateur de certains évènements, comme la récéption d’un message par exemple.Nous allons créer un projet qui comprendra deux boutons :
- Un pour créer une notification
- Un autre pour en supprimer
- Nom du projet : tuto_notification
- SDK : 2.1
- Nom de l’application : Tuto Notification
- Nom du package : com.tutos.android.notification
- Activité : TutoNotificationHomeActivity
Création de la vue principale
Nous allons modifier le fichier “main.xml” afin d’avoir deux boutons.
|
<?xml version="1.0" encoding="utf-8"?><resources> <string name="add_notification">Ajouter une notification</string><string name="delete_notification">Supprimer une notification</string> <string name="app_name">Tuto Notification</string></resources> |
Rajouter le Listener sur les boutons
Nous allons rajouter des “Listener” sur les boutons pour gérer le clique. Ce qui donnera sur la classe “TutoNotificationHomeActivity”packagecom.tutos.android.notification;importandroid.app.Activity;importandroid.os.Bundle;importandroid.view.View;importandroid.view.View.OnClickListener;importandroid.widget.Button;importandroid.widget.Toast;publicclassTutoNotificationHomeActivityextendsActivity {privateButton addNotificationBtn;privateButton deleteNotificationBtn;@OverridepublicvoidonCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);addNotificationBtn = (Button) findViewById(R.id.add_notification);addNotificationBtn.setOnClickListener(newOnClickListener() {@OverridepublicvoidonClick(View arg0) {Toast.makeText(getBaseContext(),"Ajout d'une notification", Toast.LENGTH_SHORT).show();}});deleteNotificationBtn = (Button) findViewById(R.id.delete_notification);deleteNotificationBtn.setOnClickListener(newOnClickListener() {@OverridepublicvoidonClick(View arg0) {Toast.makeText(getBaseContext(),"Suppression d'une notification", Toast.LENGTH_SHORT).show();}});}}
Création d’une notification.
Nous allons créer une méthode “createNotification” qu’on appelera au clique sur le bouton “Ajouter une notification”. Voici a quoi ressemble cette méthode :
private final void createNotification(){
//Récupération du notification Manager
final NotificationManager notificationManager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
//Création de la notification avec spécification de l'icone de la notification et le texte qui apparait à la création de la notfication
final Notification notification = new Notification(R.drawable.notification, notificationTitle, System.currentTimeMillis());
//Definition de la redirection au moment du clique sur la notification. Dans notre cas la notification redirige vers notre application
final PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, TutoNotificationHomeActivity.class), 0);
//Récupération du titre et description de la notfication
final String notificationTitle = getResources().getString(R.string.notification_title);
final String notificationDesc = getResources().getString(R.string.notification_desc);
//Notification & Vibration
notification.setLatestEventInfo(this, notificationTitle, notificationDesc, pendingIntent);
notification.vibrate = new long[] {0,200,100,200,100,200};
notificationManager.notify(NOTIFICATION_ID, notification);
}
Il suffit maintenant d’appeler la méthode dans votre code, ce qui donnera :
addNotificationBtn = (Button) findViewById(R.id.add_notification;addNotificationBtn.setOnClickListener(newOnClickListener() {@OverridepublicvoidonClick(View arg0) {createNotification();}
});
<uses-permissionandroid:name="android.permission.VIBRATE"/>
<stringname="notification">Notification www.tutos-
android.com</string><stringname="notification_title">Ma premiere notificationwww.tutos-android.com</string><stringname="notification_desc">Cliquez sur moi je suis une notification</string>
Suppression d’une notification
Nous allons créer une méthode “deleteNotification”, pour supprimer notre notification depuis l’application.
privatevoiddeleteNotification(){finalNotificationManager notificationManager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);//la suppression de la notification se fait grâce a son IDnotificationManager.cancel(NOTIFICATION_ID);}Puis l’appeler dans le code Java au moment du clique
deleteNotificationBtn = (Button) findViewById(R.id.delete_notification);deleteNotificationBtn.setOnClickListener(newOnClickListener() {@OverridepublicvoidonClick(View arg0) {deleteNotification();}});
Conclusion
En espérant que cet tutoriel vous aura aidé à comprendre comment fonctionne les notifications sous Android.mardi 12 juin 2012
Gestion de la rotation sous Android
Philosophie de la rotation
Lors d’une rotation de l’écran, Android supprimera et recréera toutes les activités en cours d’exécution ou en pause.Ce comportement est celui par défaut, vous pouvez adapter la réponse de vos activités aux changements d’orientation.
Finalement c’est aux développeurs de vérifier et corriger l’affichage de votre application dans le mode portrait et landscape.
Création des nouvelles vues
Pour créer vos nouvelles vues qui seront affichées en monde landscape, il suffit de créer un nouveau dossier dans le dossier res. Ce dossier se nommera layout-land.Vous devez donc repenser votre interface pour que la vue en mode landscape soit agréable à utiliser sans surcharger l’écran.
Tester sur l’émulateur
Pour simuler la rotation de l’écran sur l’émulateur, il faut utiliser le raccourci CTRL + F12.Sauvegarde de l’état
Comme précisé plus haut, Android détruit votre vue en cas de changement d’orientation pour construire la nouvelle vue. Donc vous voulez peut être sauvegarder des données avant le changement d’orientation, par exemple si l’utilisateur a commencé à saisir du texte.Pour résoudre ce problème, il suffit d’utiliser la méthode onSaveInstanceState().
Cette méthode est appelée à chaque fois que votre activité est détruite.
Grâce à cette méthode vous pouvez sauvegarder les données que vous souhaitez dans un Bundle afin de pouvoir récupérer l’état de votre activité.
Cette récupération est possible, car dans le onCreate, la méthode onRestoreInstanceState() est appelée afin de récupérer l’état de votre vue, donc dans cette méthode vous pouvez utiliser toutes les valeurs que vous avez stocké dans la méthode précédente.
Limitation
La méthode onSaveInstanceState, possède ses limites car on peut stocker peu d’information dans un Bundle et dans certains cas on aurait besoin de stocker beaucoup plus.On peut contourner ce problème en utilisant la méthode onRetainNonConfigurationInstance() qui vous permet de renvoyer un objet que vous pouvez récupérer grâce à la méthode getLastNonConfigurationInstance().
Surcharger la rotation
Dans certains cas, il est indispensable de surcharger le comportement par défaut de la rotation sur votre application.Pour cela il suffit simplement de :
- Utiliser l’attribut android:configChanges de l’élément activity dans le fichier AndroidManifest.xml pour citer les modifications de configuration que vous voulez gérer. Il peut prendre les valeurs suivantes :
- Puis dans votre activité, il vous faut implémenter la méthode onConfigurationChanged() pour gérer les configurations que vous avez cité dans votre manifest.
Bloquer la vue
Pour finir vous pouvez bloquer votre vue dans un mode ou un autre. Cette méthode est déconseillée par Google, car bloquer une vue en portrait réduit significativement l’expérience utilisateur et encore plus pour les tablettes, car pour les tablettes la vue par défaut est landscape et non portrait.Pour utiliser cette manipulation, il suffit d’ajouter android:screenOrientation=”portrait ou landscape”. Cela permet de verrouiller votre activité dans le sens souhaité.
Best Practice – Gérer les tablettes
Si vous souhaitez gérer la rotation dans tous les cas, pour que votre application s’affiche naturellement pour les utilisateurs de tablette et ceux de téléphone. Vous pouvez utiliser le code suivant :
int x = AXIS_X;
int y = AXIS_Y;
case(Display.getRotation())
Surface.ROTATION_0: //Ici votre code
break;
Surface.ROTATION_90: x=AXIS_Y; y = AXIS_MINUS_X;
//Ici votre code
break;
Surface.ROTATION_180: y=AXIS_MINUS_Y;
//Ici votre code
break;
Surface.ROTATION_270: x=AXIS_MINUS_Y; y = AXIS_X;
//Ici votre code
break;
Conclusion
Ce tutoriel se fini ici, en espérant qu’il vous a aidé à mieux comprendre comment gérer la rotation dans vos applications.jeudi 31 mai 2012
Faite parler votre Android
Dans ce Tuto je vais faire parler mon Android Phone avec une liste aléatoire de phrases et de mots grâce à la synthèse vocale.
Je crée mon fichier de ma fenêtre avec juste un bouton pour lancer mon action.
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <Button android:id="@+id/again_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:enabled="false" android:text="teste" /> </LinearLayout>Dans ma classe j’implémente l’objet TextToSpeech, qui permet de lancer la synthèse vocale
public class CommandeVocal extends Activity implements TextToSpeech.OnInitListener { private static final String TAG = "TextToSpeechDemo"; //creation de objet TextToSpeech private TextToSpeech mTts; private Button mAgainButton; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.layout_xml); //instanciation de l'objet mTts mTts = new TextToSpeech(this,this ); mAgainButton = (Button) findViewById(R.id.again_button); mAgainButton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { ParleandroidPhone (); } }); }Je crée mon tableau de phrases aléatoire.
private static final Random RANDOM = new Random();
private static final String[] HELLOS = {
"Bonjour",
"Comment tu vas",
"Bienveunue dans notre page truc et astuce informatique",
};
Une méthode importante dans notre classe c’est la méthode onInit qui permet de configurer la langue de notre synthèse vocale.// Implements TextToSpeech.OnInitListener. public void onInit(int status) { // vérification de la disponibilité de la synthèse vocale. if (status == TextToSpeech.SUCCESS) { //le choix de la langue ici français int result = mTts.setLanguage(Locale.FRANCE); // vérification ici si cette langue est supporté par le terminal et si elle existe if (result == TextToSpeech.LANG_MISSING_DATA || result == TextToSpeech.LANG_NOT_SUPPORTED) { //renvoi une erreur sur la console logcat. Log.e(TAG, "Language is not available."); } else { mAgainButton.setEnabled(true); ParleandroidPhone (); } } else { // si la synthèse vocal n'est pas disponible Log.e(TAG, "Could not initialize TextToSpeech."); }Puis ma Methode ParleandroidPhone qui lance aléatoirement une phrase
private void ParleandroidPhone () {
// choix aléatoire de la phrase.
int helloLength = HELLOS.length;
String hello = HELLOS[RANDOM.nextInt(helloLength)];
mTts.speak(hello, TextToSpeech.QUEUE_FLUSH, null);
}
[Android] uploader une fichier sur un serveur web
Un petit tuto pour apprendre à uploader une fichier depuis votre application android vers un serveur web.
Pour ce genre de tâche qui peut être longue, Android conseille d’implémenter un Service plutôt qu’une activité : un service tourne en tâche de fond et ne bloque pas l’application.
Pour ce tuto :
Pour ce genre de tâche qui peut être longue, Android conseille d’implémenter un Service plutôt qu’une activité : un service tourne en tâche de fond et ne bloque pas l’application.
Pour ce tuto :
- créez une nouvelle application UploadFile et une classe UploadFile.
- ajouter la permission internet pour l’application
- créez le fichier main.xml pour la layout de la classe UploadFile
- créez script PHP upload.php qui va traiter la réception du fichier.
package com.projet.UploadFile;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
public class UploadFile extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
HttpURLConnection connection = null;
DataOutputStream outputStream = null;
DataInputStream inputStream = null;
String pathToOurFile = "/sdcard/nom_fichier";
String urlServer = "http://10.0.2.2:80/upload.php";
String lineEnd = "\r\n";
String twoHyphens = "--";
String boundary = "******";
int bytesRead, bytesAvailable, bufferSize;
byte[] buffer;
int maxBufferSize = 1*1024*1024;
try
{
FileInputStream fileInputStream = new FileInputStream(new File(pathToOurFile) );
URL url = new URL(urlServer);
connection = (HttpURLConnection) url.openConnection();
// Allow Inputs & Outputs
connection.setDoInput(true);
connection.setDoOutput(true);
connection.setUseCaches(false);
// Enable POST method
connection.setRequestMethod("POST");
connection.setRequestProperty("Connection", "Keep-Alive");
connection.setRequestProperty("Content-Type", "multipart/form- data;boundary="+boundary);
outputStream = new DataOutputStream( connection.getOutputStream() );
outputStream.writeBytes(twoHyphens + boundary + lineEnd);
outputStream.writeBytes("Content-Disposition: form-data; name=\"uploadedfile\";filename=\"" + pathToOurFile +"\"" + lineEnd);
outputStream.writeBytes(lineEnd);
bytesAvailable = fileInputStream.available();
bufferSize = Math.min(bytesAvailable, maxBufferSize);
buffer = new byte[bufferSize];
// Read file
bytesRead = fileInputStream.read(buffer, 0, bufferSize);
while (bytesRead > 0)
{
outputStream.write(buffer, 0, bufferSize);
bytesAvailable = fileInputStream.available();
bufferSize = Math.min(bytesAvailable, maxBufferSize);
bytesRead = fileInputStream.read(buffer, 0, bufferSize);
}
outputStream.writeBytes(lineEnd);
outputStream.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);
// Responses from the server (code and message)
int serverResponseCode = connection.getResponseCode();
String serverResponseMessage = connection.getResponseMessage();
fileInputStream.close();
outputStream.flush();
outputStream.close();
}
catch (Exception ex)
{
//Exception handling
Log.d("MainActivity", "Print " + ex.toString());
}
}
}
Le fichier de layout main.xml :
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello" />
</LinearLayout>
Le fichier upload.php a été placé dans le Répertoires www de votre serveur web:
<?php
$target_path = "./";
$target_path = $target_path . basename( $_FILES['uploadedfile']['name']);
if(move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)) {
echo "The file ". basename( $_FILES['uploadedfile']['name']).
" has been uploaded";
} else{
echo "There was an error uploading the file, please try again!";
}
?>
mardi 29 mai 2012
[Android]Les services sous Android
Un service est une composante essentielle d’une application. Il est nécessaire lorsque votre application souhaite effectuer des opérations ou des calculs en dehors de l’interaction utilisateur. Donc comme vous l’aurez compris un servicene dispose pas d’interface graphique.
Rien de mieux qu’un exemple, votre lecteur de musique vous permet d’écouter la musique tout en surfant sur internet, lisant vos mails et cette fonctionnalité n’est possible qu’à l’aide des services.
Il existe deux types de services :
Il existe deux types de services :
- LocalService : Services qui s’exécutent dans le même processus que votre application.
- RemoteService : Ils s’exécutent dans des processus indépendants de votre application.
Cycle de vie d’un service
Un service n’a pas de durée définie , il est là pour exécuter sa tâche et il fonctionnera tant que c’est nécessaire.
On va présenter les différentes méthodes qui correspondent au cycle de vie d’un service. Ces méthodes seront à surcharger quand vous créerez votre service :
On va présenter les différentes méthodes qui correspondent au cycle de vie d’un service. Ces méthodes seront à surcharger quand vous créerez votre service :
- OnCreate() : Cette méthode est appelée à la création du service et est en général utilisée pour initialiser ce qui sera nécessaire à votre service.
- OnStart(Intent i) : Le service démarre. Valable uniquement pour les versions du SDK inférieur à 2.0.
- OnStartCommand(Intent i, int flags, int startId) : Le service démarre. Valable uniquement pour les versions du SDK supérieur à 2.0.
- OnDestroy() : Appelé à la fermeture du service.
Mon premier Service
Nous allons faire un exemple pour mieux comprendre, dans ce dernier nous allons créer unservice qui affichera un toast contenant les coordonnées du téléphone. Le toast s’affichera quand les coordonnées seront mises à jour.
Nous allons créer un projet qui s’appellera MonPremierService, avec la version 2.1 du SDK.
- Nom de l’application : Mon Premier Service
- Package : com.tuto.android
- Activité : HomeActivity
Dans notre classe HomeActivity, nous allons juste créer un bouton qui lancera le servicequand on cliquera dessus :
Dans le fichier main.xml, on met le code suivant :
1
2
3
4
5
6
7
8
9
10
11
12
13
| <?xml version="1.0" encoding="utf-8"?> android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" ><Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/btn1" android:id="@+id/serviceBtn" /></LinearLayout> |
et voici le code à mettre dans l’activité correspondante
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
| package com.tuto.android;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;public class HomeActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Button serviceBtn = (Button) findViewById(R.id.serviceBtn); serviceBtn.setOnClickListener( new OnClickListener() { @Override public void onClick(View actuelView) { startService(new Intent(HomeActivity.this, MonPremierService.class)); } }); }} |
Passons à notre service, pour le créer il suffit d’implémenter une classe qui hérite de la classe Service. Voici notre exemple :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
| package com.tuto.android;import android.app.Service;import android.content.Context;import android.content.Intent;import android.location.Location;import android.location.LocationListener;import android.location.LocationManager;import android.os.Bundle;import android.os.IBinder;import android.widget.Toast;public class MonPremierService extends Service{ private LocationManager locationMgr = null; private LocationListener onLocationChange = new LocationListener() { @Override public void onStatusChanged(String provider, int status, Bundle extras) { } @Override public void onProviderEnabled(String provider) { } @Override public void onProviderDisabled(String provider) { } @Override public void onLocationChanged(Location location) { Double latitude = location.getLatitude(); Double longitude = location.getLongitude(); Toast.makeText(getBaseContext(), "Voici les coordonnées de votre téléphone : " + latitude + " " + longitude, Toast.LENGTH_LONG).show(); } }; @Override public IBinder onBind(Intent arg0) { return null; } @Override public void onCreate() { locationMgr = (LocationManager) getSystemService(Context.LOCATION_SERVICE); locationMgr.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 10000, 0, onLocationChange); locationMgr.requestLocationUpdates(LocationManager.GPS_PROVIDER, 10000, 0, onLocationChange); super.onCreate(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { return super.onStartCommand(intent, flags, startId); } @Override public void onDestroy() { super.onDestroy(); locationMgr.removeUpdates(onLocationChange); } |
- Dans le OnCreate, On s’abonne au changement de géolocalisation, et dans leOnDestroy on se désabonne.
- On crée une instance de la classe LocationListener, pour récupérer les nouvelles coordonnées.
- Dans la méthode OnLocationChanged, on affiche les coordonnées à l’aide d’un Toast.
- La méthode onBind sert quand on veut faire communiquer le service avec un autreservice, ou avec une activité ..etc.
Pour finir il faut déclarer le service dans le fichier AndroidManifest.xml, dans la partie Application
1
| <service android:name="com.tuto.android.MonPremierService"/> |
sans oublier les permissions suivantes :
1
2
3
4
5
| <uses-permission android:name="android.permission.INTERNET" /><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /><uses-permission android:name="android.permission.ACCESS_GPS" /><uses-permission android:name="android.permission.ACCESS_ASSISTED_GPS" /><uses-permission android:name="android.permission.LOCATION" /> |
Ce qui donnera
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| <?xml version="1.0" encoding="utf-8"?> package="com.tuto.android" android:versionCode="1" android:versionName="1.0"> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".HomeActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <service android:name="com.tuto.android.MonPremierService"/> </application> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_GPS" /> <uses-permission android:name="android.permission.ACCESS_ASSISTED_GPS" /> <uses-permission android:name="android.permission.LOCATION" /></manifest> |
sans oublier le fichier strings.xml
1
2
3
4
5
| <?xml version="1.0" encoding="utf-8"?><resources> <string name="btn1">Lancer le service de géolocalisation</string> <string name="app_name">Mon Premier Service</string></resources> |
Donc pour tester il suffit de :
- Lancer sur le projet.
- Cliquer sur le bouton.
- Mettre à jour les coordonnées de géolocalisation.
- Un Toast devrait apparaitre avec les coordonnées de géolocalisation
Voilà ce que vous devez obtenir :
Sur l’image çi-dessous, on voit bien que le service est lancé (propriétés applications dans les paramètres du téléphones).

Conclusion
Voilà ce tutoriel se finit ici, en espérant qu’il vous a aidé à comprendre comment fonctionne les services sous android.

