[JAVA] Faire une capture d’écran d’une Android Activity et la partager

Une fonctionnalité intéressante à implémenter à votre application Android est d’ajouter un bouton de partage. Dans ce petit tutoriel je vais partager le code que j’ai implémenté et qui permet de faire une capture d’écran de l’activité courante et la partager vers les réseaux sociaux, par SMS, mail etc…

1. Manifest

La première étape de est de modifier le fichier Manifest (VOTREPROJET/AndroidManifest.xml). Ajoutez simplement la ligne suivante :

[java]
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
[/java]

Cette ligne permettra d’enregistrer la capture d’écran.

2. Le code Java

La capture d’écran est faite au format bitmap.

[java]
// Capture d’ecran
Bitmap bitmap;
View v1 = v.getRootView();
v1.setDrawingCacheEnabled(true);
bitmap = Bitmap.createBitmap(v1.getDrawingCache());
v1.setDrawingCacheEnabled(false);
[/java]

La sauvegarde du fichier sur le téléphone (stockage externe) :

[java]
// Creation du dossier de destination
OutputStream output;
File filepath = Environment.getExternalStorageDirectory();
File dir = new File(filepath.getAbsolutePath() + "/Captures de mon Appli/");
dir.mkdirs();

// Creation du fichier
DateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
Calendar cal = Calendar.getInstance();
File file = new File(dir, "capture" + dateFormat.format(cal.getTime()) + ".png");
[/java]

Premièrement on ouvre l’Intent de partage qui regroupe les applications disponibles sur le téléphone de l’utilisateur, ensuite on convertit l’image au format .PNG et on la partage avec l’application (Hangouts, Twitter ou Facebook par exemple)

[java]

try {
// Intent de partage
Intent share = new Intent(Intent.ACTION_SEND);
share.setType("image/jpeg");
output = new FileOutputStream(file);

// Convertion au format PNG
screenshot.compress(Bitmap.CompressFormat.PNG, 100, output);
output.flush();
output.close();

// Recuperation de l’image à partager
Uri uri = Uri.fromFile(file);
share.putExtra(Intent.EXTRA_STREAM, uri);
startActivity(Intent.createChooser(share, getResources().getString(R.string.share_tweet)));
} catch (Exception e) {
e.printStackTrace();
}
[/java]

Voilà, recopiez tout ce code dans la classe Java de votre Activity, appliquez ces actions à un bouton et votre application est prête à partager des captures d’écran!

 

Générer une Android Key Hash de développement par le code

Pour intégrer l’API Facebook à votre application Android, une Android Key Hash de développement (ou de prod) est demandée.

Une solution consiste à télécharger et installer OpenSSL pour générer cette clé mais la solution que j’ai choisi moi, c’est de la générer par le code (en JAVA bien sur).

Voilà la solution :

[java]public static String printKeyHash(Activity context) {
PackageInfo packageInfo;
String key = null;
try {

// Getting application package name, as defined in manifest
String packageName = context.getApplicationContext().getPackageName();

// Retriving Package info
packageInfo = context.getPackageManager().getPackageInfo(packageName,
PackageManager.GET_SIGNATURES);

Log.e("Package Name=", context.getApplicationContext().getPackageName());

for (Signature signature : packageInfo.signatures) {
MessageDigest md = MessageDigest.getInstance("SHA");
md.update(signature.toByteArray());
key = new String(Base64.encode(md.digest(), 0));

// String key = new String(Base64.encodeBytes(md.digest()));
Log.e("Key Hash= ", key);

}
} catch (NameNotFoundException e1) {
Log.e("Name not found", e1.toString());
}

catch (NoSuchAlgorithmException e) {
Log.e("No such an algorithm", e.toString());
} catch (Exception e) {
Log.e("Exception", e.toString());
}

return key;
}[/java]

Pour toute autre recherche sur les fonctionnalités de l’API Facebook en elle-même, la document officielle est très bien faite.

 

X-Ray, visualiser l’architecture et les dépendances d’un projet sous Eclipse

Pour présenter ou tout simplement avoir une vue globale de l’architecture d’un projet, il existe un plugin Eclipse très pratique : X-Ray.

X-Ray c’est quoi ?

X-Ray est un plugin open-source destiné à Eclipse.

Il permet de visualiser :

  • la compléxité d’un projet
  • les dépendances entre les classes
  • les dépendances entre les packages

Etape 1 : Téléchargement

Deux archives sont à télécharger pour utiliser ce plugin.

La première est l’archive “GEF framework plug-in and metadata” utilisée pour générer les graphiques : Télécharger.
Prenez la dernière version disponible et télécharger l’archive “All-In One Update Site”.
xray_download_1

La seconde est l’archive “X-Ray plug-in” : Télécharger.
xray_download_2

Etape 2 : Installation

Pour l’installer, il suffit d’ajouter les différentes fichiers des deux archives téléchargées, aux sources de votre Eclipse.

Pour “GEF framework plug-in and metadata” :

x_ray_gef_content

  • Copiez-Collez les deux fichiers “artifacts.jar” et “content.jar” à la racine de votre eclipse (eclipse/)
  • Copiez-Collez tous les fichiers du dossier plugins dans le dossier plugins de votre eclipse (eclipse/plugins/)
  • Copiez-Collez tous les fichiers du dossier features dans le dossier features de votre eclipse (eclipse/features/)

Pour “X-Ray plug-in” :

xray_plugin_content

  • Copiez-Collez le fichier “org.malnatij.SVPlugin_X.X.jar” dans le dossier plugins de votre eclipse (eclipse/plugins/)

Voilà, le plugin est prêt pour l’utilisation.

Pensez à fermer et ré-ouvrir Eclipse pour voir les changements.

Etape 3 : Utilisation

Ce plugin dispose de quelques fonctionnalités intéressantes que vous découvrirez au fur et à mesure de son utilisation.

La première consiste à analyser l’état d’un projet (Clique droit sur le projet > Analyse with X-Ray)

On obtient une nouvelle vue “X-Ray” avec les infos globales du projet :

xray_recap_packages_classes_methods_lines

  • 3 packages
  • 9 classes
  • 58 méthodes
  • 1021 lignes

Accompagné d’un graphique bien sympa : La complexité du projet

xray_complexity_project

En cliquant sur le petit logo encadré en rouge, on peut modifier le type d’analyse et donc choisir d’analyser:

xray_analyse

  • Les dépendances entre les classes
  • Les dépendances entre les packages
  • La complexité du projet (actuel)

Autre graphique sympa : Les dépendances entre les classes

xray_class_dependency

Si vous avez d’autres plugins utiles, n’hésitez pas à les partager, merci!

Détecter et filtrer des couleurs trop claires ou foncées en JAVA

Dans la dernière application Android que j’ai développé, j’utilise un Color Picker (voir ci-dessous) plutôt sympa mais les couleurs trop claires posent problème. J’ai défini une couleur de police très claire (presque blanche) et si l’utilisateur sélectionne une couleur de fond claire, on n’y voit plus rien!

J’ai donc trouvé une solution et j’ai décidé de partager cette ‘astuce’ avec vous.

colorpicker_android_java

 

Etape 1 : Récupérer/convertir la couleur

Pour commencer, il faut avoir la couleur au format “int(si c’est le cas, passez directement à l’étape 2).

Si vous récupérez une couleur au format hexadécimal, vous devez la convertir en utilisant les deux lignes ci-dessous :

[java]String hex = "#FFFFFF";
int value = Integer.parseInt(myString.replaceFirst("#", ""), 16); [/java]

Etape 2 : Obtenir le taux de luminosité

Le taux de luminosité s’obtient à partir de l’integer d’une couleur.

Si le taux est inférieur à 128, la couleur se rapproche du noir.

Si le taux est supérieur à 128, la couleur se rapproche du blanc.

[java] public static int getBrightness(int rgb)
{
int bri= ( 77 * ((argb>>16)&255)
+ 150 * ((argb>>8)&255)
+ 29 * ((argb)&255))>>8;
return bri;
}[/java]

Il vous suffit alors de tester le taux de luminosité en utilisant la valeur retournée par la méthode “getBrightness“.

Etape 3 : Test de la valeur

Ci-dessous, je filtre les couleurs supérieures à 150 (donc claires, se rapprochant du blanc).

[java] int lum = getBrightness(_col);
if (lum > 150)
{
_msgerreur = "Cette couleur est trop claire, vous n’y verrez rien.";
Toast.makeText(getBaseContext(), "Erreur: " + _msgerreur, Toast.LENGTH_SHORT).show();
}[/java]

 

Bonnes méthodes de nommage des packages en Java

Lorsque vous développez et que vous structurez les différentes parties de votre code dans des packages, il faut respecter une convention d’écriture de ces packages.

Ci-dessous, les critères à respecter :

– le nom du package doit être en minuscule
– le nom du package ne doit pas reprendre des noms déjà utilisés dans le JDK utilisé

Pour faire simple, voilà à quoi doivent correspondre les 3 parties du nom de votre package :

– Le premier mot doit correspondre au suffixe du nom de domaine (.fr, .com, .net, .info, etc…).
– Le deuxième mot doit correspondre au nom de la société.
– Le troisième mot doit correspondre au descriptif du contenu du package.

Bon nommage:

nommage_package_ok_java

Ne surtout pas faire:

nommage_package_nok_java

Pensez à nommer votre package de façon à pouvoir identifier son contenu rapidement…