Autore Topic: [facile] Come eseguire uno screen shot dalla propria applicazione  (Letto 14117 volte)

Offline Daystrom

  • Utente junior
  • **
  • Post: 90
  • Respect: +13
    • Mostra profilo
    • Starfleet
  • Dispositivo Android:
    HTC Magic + HTC Desire HD + Nexus S
  • Play Store ID:
    Daystrom
  • Sistema operativo:
    WXP
+3
Livello di difficoltà: facile
Versione SDK utilizzata: 2.1
Link al file compresso del progetto eclipse: file in allegato

Ciao 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:

Codice (Java): [Seleziona]
    /**
     * 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;
    }

Codice (Java): [Seleziona]
    /**
     *  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:

Codice (Java): [Seleziona]
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
« Ultima modifica: 14 Maggio 2010, 18:39:47 CEST da Daystrom »

Offline JD

  • Amministratore
  • Utente storico
  • *****
  • Post: 1600
  • Respect: +232
    • leinardi
    • Mostra profilo
  • Dispositivo Android:
    LG Nexus 5
  • Sistema operativo:
    L'ultima Ubuntu
Re:[facile] Come eseguire uno screen shot dalla propria applicazione
« Risposta #1 il: 14 Maggio 2010, 18:26:39 CEST »
0
Ciao Daystrom,
innanzi tutto grazie per il tutorial, non sapevo fosse possibile scattare degli screenshot della propria applicazione :D

Volevo però segnalarti che il file zip sembra essere corrotto (confermato anche da Qlimax): sembra che i files non siano stati correttamente inseriti nelle varie sottodirectory e che il node di ogni file contenga anche il path relativo dello stesso  o_O

Ad esempio il file "ScreenShot.java" si chiama in realtà "ScreenShotDemo\src\src\com\daystrom\screenshotdemo\ScreenShot.java"
« Ultima modifica: 14 Maggio 2010, 18:29:02 CEST da JD »
È stata trovata una soluzione al tuo problema?
Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato ;).
E se hai aperto tu il thread marcalo come risolto cliccando !

Offline Daystrom

  • Utente junior
  • **
  • Post: 90
  • Respect: +13
    • Mostra profilo
    • Starfleet
  • Dispositivo Android:
    HTC Magic + HTC Desire HD + Nexus S
  • Play Store ID:
    Daystrom
  • Sistema operativo:
    WXP
Re:[facile] Come eseguire uno screen shot dalla propria applicazione
« Risposta #2 il: 14 Maggio 2010, 18:34:23 CEST »
0
Ciao Daystrom,
innanzi tutto grazie per il tutorial, non sapevo fosse possibile scattare degli screenshot della propria applicazione :D

Volevo però segnalarti che il file zip sembra essere corrotto (confermato anche da Qlimax): sembra che i files non siano stati correttamente inseriti nelle varie sottodirectory e che il node di ogni file contenga anche il path relativo dello stesso  o_O

Ad esempio il file "ScreenShot.java" si chiama in realtà "ScreenShotDemo\src\src\com\daystrom\screenshotdemo\ScreenShot.java"

Prego, mi sono divertito a farlo...

Per quanto riguarda il file allegato sono io che (lo noto solo adesso) ho impostato due volte src... O:-)
Ho provato a scaricarlo e funziona correttamente, da notare che l'app funziona sia con le versioni 1.5 che 1.6... Purtroppo non posso testarla con versioni superiori.

Offline JD

  • Amministratore
  • Utente storico
  • *****
  • Post: 1600
  • Respect: +232
    • leinardi
    • Mostra profilo
  • Dispositivo Android:
    LG Nexus 5
  • Sistema operativo:
    L'ultima Ubuntu
Re:[facile] Come eseguire uno screen shot dalla propria applicazione
« Risposta #3 il: 14 Maggio 2010, 18:37:28 CEST »
0
L'ho riscaricato e mi risulta ancora corrotto, con cosa l'hai creato? Non vorrei che funzionasse correttamente solo su Windows. Potresti provare a ricrearlo con un altro software (WinZip, WinRar, JZip, etc)?
È stata trovata una soluzione al tuo problema?
Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato ;).
E se hai aperto tu il thread marcalo come risolto cliccando !

Offline Daystrom

  • Utente junior
  • **
  • Post: 90
  • Respect: +13
    • Mostra profilo
    • Starfleet
  • Dispositivo Android:
    HTC Magic + HTC Desire HD + Nexus S
  • Play Store ID:
    Daystrom
  • Sistema operativo:
    WXP
Re:[facile] Come eseguire uno screen shot dalla propria applicazione
« Risposta #4 il: 14 Maggio 2010, 18:41:30 CEST »
0
L'ho riscaricato e mi risulta ancora corrotto, con cosa l'hai creato? Non vorrei che funzionasse correttamente solo su Windows. Potresti provare a ricrearlo con un altro software (WinZip, WinRar, JZip, etc)?

Avevo usato IZarc... Ora l'ho salvato con WinRar... Prova a controllare.

Offline JD

  • Amministratore
  • Utente storico
  • *****
  • Post: 1600
  • Respect: +232
    • leinardi
    • Mostra profilo
  • Dispositivo Android:
    LG Nexus 5
  • Sistema operativo:
    L'ultima Ubuntu
Re:[facile] Come eseguire uno screen shot dalla propria applicazione
« Risposta #5 il: 14 Maggio 2010, 18:50:21 CEST »
0
Ora va bene :)

Se sei alla ricerca di un'alternativa free a WinZip/WinRar prova 7Zip.
È stata trovata una soluzione al tuo problema?
Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato ;).
E se hai aperto tu il thread marcalo come risolto cliccando !

Offline Daystrom

  • Utente junior
  • **
  • Post: 90
  • Respect: +13
    • Mostra profilo
    • Starfleet
  • Dispositivo Android:
    HTC Magic + HTC Desire HD + Nexus S
  • Play Store ID:
    Daystrom
  • Sistema operativo:
    WXP
Re:[facile] Come eseguire uno screen shot dalla propria applicazione
« Risposta #6 il: 14 Maggio 2010, 18:52:38 CEST »
0
Ora va bene :)

Se sei alla ricerca di un'alternativa free a WinZip/WinRar prova 7Zip.

7Zip l'avevo provato ma mi dava problemi con grossi files... E' la prima volta che IZarc mi "molla". Cmq terrò a mente di inviare sul forum solo files rar, così non ci dovrebbero essere problemi.
« Ultima modifica: 14 Maggio 2010, 18:54:24 CEST da Daystrom »

Offline JD

  • Amministratore
  • Utente storico
  • *****
  • Post: 1600
  • Respect: +232
    • leinardi
    • Mostra profilo
  • Dispositivo Android:
    LG Nexus 5
  • Sistema operativo:
    L'ultima Ubuntu
Re:[facile] Come eseguire uno screen shot dalla propria applicazione
« Risposta #7 il: 14 Maggio 2010, 19:02:45 CEST »
0
Ho provato a mettere lo sfondo trasparente per vedere se si riusciva a fotografare la Home ma purtroppo negli screenshot viene comunque nero  :'(.
È stata trovata una soluzione al tuo problema?
Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato ;).
E se hai aperto tu il thread marcalo come risolto cliccando !

Offline Daystrom

  • Utente junior
  • **
  • Post: 90
  • Respect: +13
    • Mostra profilo
    • Starfleet
  • Dispositivo Android:
    HTC Magic + HTC Desire HD + Nexus S
  • Play Store ID:
    Daystrom
  • Sistema operativo:
    WXP
Re:[facile] Come eseguire uno screen shot dalla propria applicazione
« Risposta #8 il: 14 Maggio 2010, 19:52:47 CEST »
0
Ho provato a mettere lo sfondo trasparente per vedere se si riusciva a fotografare la Home ma purtroppo negli screenshot viene comunque nero  :'(.

Ci avevo provato anche io...  :-P :-P :-P :-P :-P

Non so come ma credo che bisognerebbe risalire nella gerarchia delle applicazioni. Intendo dire, ma non so se si possa fare, riuscire a "beccare" le activivies della home...

Offline blackgin

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1387
  • Respect: +164
    • Google+
    • blackgins
    • blackginsoft
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Sistema operativo:
    Mac OSX 10.8
Re:[facile] Come eseguire uno screen shot dalla propria applicazione
« Risposta #9 il: 14 Maggio 2010, 20:55:08 CEST »
0
Senza i permessi di root? O.O Wow! Pubblica un'app che ce n'é il bisogno!
Postate il LogCat LogCat LogCat LogCat LogCat

Offline JD

  • Amministratore
  • Utente storico
  • *****
  • Post: 1600
  • Respect: +232
    • leinardi
    • Mostra profilo
  • Dispositivo Android:
    LG Nexus 5
  • Sistema operativo:
    L'ultima Ubuntu
Re:[facile] Come eseguire uno screen shot dalla propria applicazione
« Risposta #10 il: 14 Maggio 2010, 20:56:46 CEST »
0
Occhio blackgin, leggi bene: permette di fare lo screen solo dei layout dell'applicazione stessa, non di altre applicazioni.
È stata trovata una soluzione al tuo problema?
Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato ;).
E se hai aperto tu il thread marcalo come risolto cliccando !

Offline blackgin

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1387
  • Respect: +164
    • Google+
    • blackgins
    • blackginsoft
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Sistema operativo:
    Mac OSX 10.8
Re:[facile] Come eseguire uno screen shot dalla propria applicazione
« Risposta #11 il: 14 Maggio 2010, 22:03:57 CEST »
0
Ah c'era il trucco xD
Postate il LogCat LogCat LogCat LogCat LogCat

Offline Daystrom

  • Utente junior
  • **
  • Post: 90
  • Respect: +13
    • Mostra profilo
    • Starfleet
  • Dispositivo Android:
    HTC Magic + HTC Desire HD + Nexus S
  • Play Store ID:
    Daystrom
  • Sistema operativo:
    WXP
Re:[facile] Come eseguire uno screen shot dalla propria applicazione
« Risposta #12 il: 14 Maggio 2010, 23:03:39 CEST »
0
Ah c'era il trucco xD

Magari avessi scoperto come fare...  :'(

Ma qualcuno conosce il codice utilizzato dalle apps che hanno bisogno dei permessi di Root?
Chissà che non se ne riesca a ricavare qualcosa...

Offline JD

  • Amministratore
  • Utente storico
  • *****
  • Post: 1600
  • Respect: +232
    • leinardi
    • Mostra profilo
  • Dispositivo Android:
    LG Nexus 5
  • Sistema operativo:
    L'ultima Ubuntu
Re:[facile] Come eseguire uno screen shot dalla propria applicazione
« Risposta #13 il: 14 Maggio 2010, 23:56:20 CEST »
0
Qualche giorno fa avevo perso un'oretta per cercarlo ma non avevo trovato nulla :(.
È stata trovata una soluzione al tuo problema?
Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato ;).
E se hai aperto tu il thread marcalo come risolto cliccando !

Offline ScarfaceIII

  • Utente junior
  • **
  • Post: 112
  • Respect: +13
    • raferalston12
    • Mostra profilo
  • Dispositivo Android:
    Nexus One
  • Sistema operativo:
    GNU/Linux, Ubuntu 10.04 / Windows 7
Re:[facile] Come eseguire uno screen shot dalla propria applicazione
« Risposta #14 il: 15 Maggio 2010, 00:41:28 CEST »
0
Fantastico! a dire il vero sento molto la mancanza di fare screenshot perchè in fase di sviluppo di un'applicazione mi piace tenere traccia degli step che l'hanno fatta arrivare dov'è, ma con tutte le cose a cui devo pensare quando sviluppo, fare screenshot con di DDMS è l'ultima, per cui finisco per non avere mai niente...
è talmente bella e utile come che mi viene voglia di aggiungere un'inutile tasto per fare screenshot solo per prendermi bene e far vedere alla mia ragazza perchè non la cago mai quando sono in laboratorio!!! XD di sicuro ruberò il codice e lo farò mio, può sempre tornare utile! grazie mille