Le site de développement d'Android est assez bien fait et complet. Il y est fourni un grand nombre de tutoriels sur le framework, mais bon... pas tout hein !
Ce qui m'intéressait, c'était de pouvoir récupérer les photos des contacts de ma petite bête. Histoire de me faire les dents sur les différents services accessibles aux développeurs.
Passer le cultissime "Hello Android", j'avais besoin d'un challenge un peu plus grand. J'ai directement pensé à pouvoir utiliser mon smartphone comme télécommande pour pouvoir transformer ma Kangoo Autobots en vieux Nokia 3330, mais très énormément géant, qui irait irradier de bonnes intentions le siège d'une société privée à Cupertino. J'ai vite revu mes prétentions à la baisse.
Et waï, ils ne m'auraient jamais laissé publier cette géniale appli sur l'AppStore (j'aurai vendu mon âme au Diable et porté l'appli, bien entendu... mais pas en Flash).
Alleï, commençons plus simple. La liste des photos des contacts peut-être ? A ton avis !
Donc, je me lance... lecture de la doc, phagocytage des exemples, essais, lecture, recherche sur Google, re-essai, test, re-test, modifications, test, lecture, Google, essai... enfin, du développement quoi !
Après 5 heures, toujours pas de photo de contact sur l'écran. Grrrrrrrrrr.
Suis pas un facile et donc, je ne lâche pas le morceau.
Finalement, après une multitude de copier/coller, de CTRL-D, de "Fermeture soudaine de l'application GetPhotos (du processus benoli.eu.examples.getPhotos). Merci de réessayer." et de pression sur les différentes touches de mon clavier, je suis parvenu à mes fins.
C'est avec un honneur incommensurable (ça ne veut rien dire et c'est tant mieux), que je porte à votre attention le code ci-après, le fruit d'une laborieuse soirée. En espérant qu'il vous sera de bonne utilité.
L'exemple complet est disponible ici : Sources
Les points importants dans cet exemple sont les suivants :
- la fonction qui renvoie un curseur GetPhotos.getContacts() : c'est ici que l'on récupère les données du smartphone. Pour l'exemple, seul l'id et le "display name" sont nécessaires.
Pour les fans de Flash, la resource R.layout.photo_item joue ici le même rôle qu'un ItemRenderer.
Et voilà...
Ce qui m'intéressait, c'était de pouvoir récupérer les photos des contacts de ma petite bête. Histoire de me faire les dents sur les différents services accessibles aux développeurs.
Passer le cultissime "Hello Android", j'avais besoin d'un challenge un peu plus grand. J'ai directement pensé à pouvoir utiliser mon smartphone comme télécommande pour pouvoir transformer ma Kangoo Autobots en vieux Nokia 3330, mais très énormément géant, qui irait irradier de bonnes intentions le siège d'une société privée à Cupertino. J'ai vite revu mes prétentions à la baisse.
Et waï, ils ne m'auraient jamais laissé publier cette géniale appli sur l'AppStore (j'aurai vendu mon âme au Diable et porté l'appli, bien entendu... mais pas en Flash).
Alleï, commençons plus simple. La liste des photos des contacts peut-être ? A ton avis !
Donc, je me lance... lecture de la doc, phagocytage des exemples, essais, lecture, recherche sur Google, re-essai, test, re-test, modifications, test, lecture, Google, essai... enfin, du développement quoi !
Après 5 heures, toujours pas de photo de contact sur l'écran. Grrrrrrrrrr.
Suis pas un facile et donc, je ne lâche pas le morceau.
Finalement, après une multitude de copier/coller, de CTRL-D, de "Fermeture soudaine de l'application GetPhotos (du processus benoli.eu.examples.getPhotos). Merci de réessayer." et de pression sur les différentes touches de mon clavier, je suis parvenu à mes fins.
C'est avec un honneur incommensurable (ça ne veut rien dire et c'est tant mieux), que je porte à votre attention le code ci-après, le fruit d'une laborieuse soirée. En espérant qu'il vous sera de bonne utilité.
L'exemple complet est disponible ici : Sources
Les points importants dans cet exemple sont les suivants :
- la fonction qui renvoie un curseur GetPhotos.getContacts() : c'est ici que l'on récupère les données du smartphone. Pour l'exemple, seul l'id et le "display name" sont nécessaires.
private Cursor getContacts() {- la fonction GetPhotos.populateContactList qui créée et lie l' "adapter" à la vue.
Uri uri = ContactsContract.Contacts.CONTENT_URI;
String[] projection = new String[] {
ContactsContract.Contacts._ID,
ContactsContract.Contacts.DISPLAY_NAME
};
String selection = "";
String[] selectionArgs = null;
String sortOrder = ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC";
return managedQuery(uri, projection, selection, selectionArgs, sortOrder);
}
- Et la fonction PhotoAdapter.bindView() qui est appelée pour chaque enregistrement trouvé.
private void populateContactList() {
Cursor cursor = getContacts();
String[] from = new String[] {
ContactsContract.Contacts.DISPLAY_NAME
};
int[] to = {
R.id.fullname
};
PhotoAdapter pa = new PhotoAdapter(this, R.layout.photo_item,
cursor, from, to);
photoList.setAdapter(pa);
}
Au passage, l'image est redimensionnée pour avoir toujours la même taille. Si le contact ne possède pas d'image, une image "bidon" est créée pour garder un alignement correct au niveau de l'affichage.
public void bindView(View view, Context context, Cursor cursor) {
Bitmap bitmap;
super.bindView(view, context, cursor);
ImageView imageView = (ImageView) view.findViewById(R.id.image);
int id = _cursor.getColumnIndex(ContactsContract.Data._ID);
long contactId = _cursor.getLong(id);
Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId);
InputStream is = Contacts.openContactPhotoInputStream(_context.getContentResolver(), contactUri);
if(is == null)
bitmap = Bitmap.createBitmap(80, 80, Bitmap.Config.ALPHA_8);
else
bitmap = BitmapFactory.decodeStream(is);
int width = bitmap.getWidth();
int height = bitmap.getHeight();
int newWidth = 80;
int newHeight = 80;
float scaleWidth = ((float) newWidth) / width;
float scaleHeight = ((float) newHeight) / height;
Matrix matrix = new Matrix();
matrix.postScale(scaleWidth, scaleHeight);
Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true);
imageView.setImageBitmap(resizedBitmap);
}
Pour les fans de Flash, la resource R.layout.photo_item joue ici le même rôle qu'un ItemRenderer.
Et voilà...
Aucun commentaire:
Enregistrer un commentaire