2015-12-30 35 views
10

Ho sviluppato un'app che cattura lo screenshot. Ma richiede solo un'istantanea dell'app. Voglio scattare un'istantanea dall'app. Ho cercato le risposte ma non trovo ancora la risposta. Ecco il mio codice.Come scattare un'istantanea dello schermo non solo app in Android con il codice

View view = getWindow().getDecorView().getRootView(); 
view.setDrawingCacheEnabled(true); 
Bitmap bitmap = Bitmap.createBitmap(view.getDrawingCache()); 
view.setDrawingCacheEnabled(false); 
saveImageToAppFolder(bitmap); 

saveImagetoAppFolder è una funzione che consente di salvare l'immagine nella cartella dell'app. Questo non è un problema. Esiste comunque l'istantanea dello schermo?

+0

È necessario disporre dei permessi di root per quello – insomniac

+0

Naturalmente, lo so. Ma come posso ottenere il permesso di root? – Dima

+0

Solo se hai il tuo dispositivo rootato, vuoi sapere come fare lo screenshot usando root? – insomniac

risposta

4

Per prendere screenshot dello schermo del dispositivo, Solo se si dispone di root chiamata il binario screencap come:

Process sh = Runtime.getRuntime().exec("su", null,null); 
OutputStream os = sh.getOutputStream(); 
os.write(("/system/bin/screencap -p " + Environment.getExternalStorageDirectory()+ "/img.png").getBytes("ASCII")); 
os.flush(); 
os.close(); 
sh.waitFor() 

E per caricare il file in una bitmap, Usa

public static Bitmap decodeSampledBitmapFromFile(String path, 
                int reqWidth, int reqHeight) { 

     // First decode with inJustDecodeBounds=true to check dimensions 
     final BitmapFactory.Options options = new BitmapFactory.Options(); 
     options.inJustDecodeBounds = true; 
     BitmapFactory.decodeFile(path, options); 

     // Calculate inSampleSize 
     options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight); 

     // Decode bitmap with inSampleSize set 
     options.inJustDecodeBounds = false; 
     return BitmapFactory.decodeFile(path, options); 
    } 

    public static int calculateInSampleSize(
      BitmapFactory.Options options, int reqWidth, int reqHeight) { 
     // Raw height and width of image 
     final int height = options.outHeight; 
     final int width = options.outWidth; 
     int inSampleSize = 1; 

     if (height > reqHeight || width > reqWidth) { 

      final int halfHeight = height/2; 
      final int halfWidth = width/2; 

      // Calculate the largest inSampleSize value that is a power of 2 and keeps both 
      // height and width larger than the requested height and width. 
      while ((halfHeight/inSampleSize) > reqHeight 
        && (halfWidth/inSampleSize) > reqWidth) { 
       inSampleSize *= 2; 
      } 
     } 

     return inSampleSize; 
    } 
+0

dove vengono salvati i file? Se voglio salvarlo cartella app come posso farlo? – Dima

+0

Il file viene salvato come img.png nella sdcard – insomniac

+0

se si desidera salvarlo in qualsiasi altra directory, utilizzare il nome della directory o se lo si desidera nella cartella dei dati dell'app utilizzare Ambiente.getDataDirectory() o getFilesDir() anziché Ambiente. getExternalStorage() – insomniac

0

non conosco il codice in saveImageToAppFolder è quello, ma si può provare questo:

Nota: è necessario impostare lo sfondo della vostra app/attività a trasparente (100%).

//your code below is extractly 
View view = getWindow().getDecorView().getRootView(); 
view.setDrawingCacheEnabled(true); 
Bitmap bitmap = Bitmap.createBitmap(view.getDrawingCache()); 
view.setDrawingCacheEnabled(false); 

    //try my code for save image file to storage 
    File imgFile = new File(imgPath); 

     FileOutputStream os = new FileOutputStream(imageFile); 
     int imgQuality = 100; 
     bitmap.compress(Bitmap.CompressFormat.JPEG, imgQuality , os); 
     os.flush(); 
     os.close(); 

codice per impostare lo sfondo trasparente:

// prima: creare tema xml sotto per trasparente

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <style name="Theme.Transparent" parent="android:Theme"> 
    <item name="android:windowIsTranslucent">true</item> 
    <item name="android:windowBackground">@android:color/transparent</item> 
    <item name="android:windowContentOverlay">@null</item> 
    <item name="android:windowNoTitle">true</item> 
    <item name="android:windowIsFloating">true</item> 
    <item name="android:backgroundDimEnabled">false</item> 
    </style> 
</resources> 

dopo impostato in questo modo:

<activity android:name=".SampleActivity" android:theme="@style/Theme.Transparent"> 

</activity> 

nota: può più rosso dettagli da qui url: How do I create a transparent Activity on Android?

+0

questa risposta solo schermate lo schermo dell'app non l'intero telefono come nella domanda – insomniac

+0

oh.Questa è la mia decisione: tutti possono impostare il bacground della propria applicazione in modo che l'immagine catturata sia tutto visibile sullo schermo e non sulla propria attività. – GiapLee

+0

Ma l'app ha molti pulsanti e qualcos'altro. Come posso impostare lo sfondo trasparente? – Dima

0

Ecco come è possibile acquisire lo schermo e salvarlo nella memoria

fornire autorizzazioni per la creazione di file nella memoria esterna

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

E questo è il codice per l'attività.

private void takeScreenshot() { 
Date now = new Date(); 
android.text.format.DateFormat.format("yyyy-MM-dd_hh:mm:ss", now); 

try { 
    // image naming and path to include sd card appending name you choose for file 
    String mPath = Environment.getExternalStorageDirectory().toString() + "/" + now + ".jpg"; 

    // create bitmap screen capture 
    View v1 = getWindow().getDecorView().getRootView(); 
    v1.setDrawingCacheEnabled(true); 
    Bitmap bitmap = Bitmap.createBitmap(v1.getDrawingCache()); 
    v1.setDrawingCacheEnabled(false); 

    File imageFile = new File(mPath); 

    FileOutputStream outputStream = new FileOutputStream(imageFile); 
    int quality = 100; 
    bitmap.compress(Bitmap.CompressFormat.JPEG, quality, outputStream); 
    outputStream.flush(); 
    outputStream.close(); 

    openScreenshot(imageFile); 
} catch (Throwable e) { 
    // Several error may come out with file handling or OOM 
    e.printStackTrace(); 
} 

}

Questo è come è possibile catturare lo schermo.