Livello di difficoltà: facileVersione SDK utilizzata: 2.1Link al file compresso del progetto eclipse: file in allegatoCiao a tutti,
da diverso tempo leggo in rete che non esiste la possibilità di fare degli screen shot delle applicazioni direttamente dal cellulare. Ci sono varie apps che lo permettono ma bisogna avere i permessi di root per poterle eseguire. A questo punto mi sono chiesto: "Ma perchè non farlo direttamente nella nostra applicazione?"
Sono convinto che potrebbe essere un buon servizio all'utente finale che, in caso di errori, potrebbe inviare uno screen shot allo sviluppatore senza troppi problemi.
Si tratta del mio primo tutorial, spero che il tutto sia spiegato in modo semplice.
In pratica andiamo a vedere come creare uno screen shot direttamente dalla nostra applicazione e salvarlo nella galleria delle immagini sulla SD card.
Per prima cosa è importante che nel file xml di layout ci sia almeno un oggetto LinearLayout o, almeno, una sottoclasse di View (vedi reference guide:
http://developer.android.com/reference/android/view/View.html).
Ho preparato un progetto eclipse per mostrare come il tutto funziona. Innanzitutto scaricate lo zip e copiate la classe ScreenShot.java nel vostro progetto adattandone il package e chiamate il metodo statico
shot(Context context, View view, String appName) da un qualsiasi punto della vostra applicazione.
Nel mio esempio ho utilizzato i normali menu messi a disposizione da Android utilizzando
onCreateOptionsMenu( final Menu menu ) e
onOptionsItemSelected(final MenuItem item) come segue:
/**
* Create option menu
*/
@Override
public boolean onCreateOptionsMenu( final Menu menu ) {
menu.add(0, 1, 0, "Entire Screen" ).setIcon( android.R.drawable.ic_menu_camera );
menu.add(0, 2, 0, "Text Only" ).setIcon( android.R.drawable.ic_menu_camera );
menu.add(0, 3, 0, "Image Only" ).setIcon( android.R.drawable.ic_menu_camera );
return true;
} /**
* Handles menu item selections
*/
@Override
public boolean onOptionsItemSelected(final MenuItem item) {
Context context = this.getApplicationContext();
View view = null;
String appName = getString(R.string.app_name);
switch (item.getItemId()) {
case 1:
view = (LinearLayout)findViewById(R.layout.main);
ScreenShot.shot(context, view.getRootView(), appName);
return true;
case 2:
view = (LinearLayout)findViewById(R.id.LinearLayout01);
ScreenShot.shot(context, view, appName);
return true;
case 3:
view = (LinearLayout)findViewById(R.id.LinearLayout02);
ScreenShot.shot(context, view, appName);
return true;
}
return false;
}Nel codice vedete tre menu, il primo esegue lo screen shot dell'intera schermata (utilizzando
getRootView()) mentre gli altri due di un singolo LinearLayout. Il primo contiene del semplice testo mentre il secondo un'immagine.
I parametri da passare al metodo shot sono i seguenti:
- context - si tratta dell'application context
- view - il layout di cui volete eseguire lo screen shot
- appName - il nome della vostra applicazione che verrà utilizzato per salvare l'immagine nella SD card.
Di seguito la classe ScreenShot. La classe è molto semplice, ho inserito al suo interno alcuni commenti per facilitarne la lettura:
package src.com.daystrom.screenshotdemo;
import java.io.OutputStream;
import android.content.ContentValues;
import android.content.Context;
import android.graphics.Bitmap;
import android.net.Uri;
import android.provider.MediaStore.Images;
import android.view.Gravity;
import android.view.View;
import android.widget.Toast;
public class ScreenShot {
public static void shot(Context context, View view, String appName) {
try {
// gets the bitmap from the view
view.setDrawingCacheEnabled(true);
Bitmap bm = view.getDrawingCache();
// sets files properties
String filename = String.valueOf(System.currentTimeMillis()) ;
filename = appName+"_"+filename;
ContentValues values = new ContentValues();
values.put(Images.Media.TITLE, filename);
values.put(Images.Media.DATE_ADDED, System.currentTimeMillis());
values.put(Images.Media.MIME_TYPE, "image/jpeg");
// gets image directory
Uri uri = context.getContentResolver().insert(Images.Media.EXTERNAL_CONTENT_URI, values);
// save image
OutputStream outStream = context.getContentResolver().openOutputStream(uri);
bm.compress(Bitmap.CompressFormat.JPEG, 90, outStream);
outStream.flush();
outStream.close();
CharSequence text = "Saving: "+filename;
Toast toast = Toast.makeText(context, text, Toast.LENGTH_LONG);
toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0);
toast.show();
} catch (Exception e) {
CharSequence text = "Fatal error: " + e.getMessage();
Toast toast = Toast.makeText(context, text, Toast.LENGTH_LONG);
toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0);
toast.show();
}
}
}Spero che questo tutorial possa contribuire alla mancanza della possibilità di eseguire screen shot da Android. Personalmente lo trovo comodo e l'ho anche inserito nella mia applicazione Fake Battery, così da avere un esempio funzionante, che potete trovare a questo link:
http://www.anddev.it/index.php/topic,305.0.html Ciao,
Daystrom