2015-12-30 10 views
10

私はスクリーンショットを撮るアプリを開発しました。 しかし、それはアプリのスナップショットを取るだけです。スナップショットをアプリから取り出したい 私は答えを研究しましたが、まだ回答が見つかりません。 ここに私のコードです。コードのAndroidで画面のスナップショットを撮る方法

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

saveImagetoAppFolderは、アプリのフォルダに画像を保存し機能です。 それは問題ではありません。 画面のスナップショットをとってもらえますか?あなたは(100%)透明にアプリ/アクティビティのセットバックグラウンドを必要とする:

注:私はsaveImageToAppFolderでコードを知らない

+0

そのためのルート権限が必要です – insomniac

+0

もちろん、私はそれを知っています。しかし、どうすればroot権限を得ることができますか? – Dima

+0

あなたのデバイスがルートになっている場合にのみ、rootを使ってスクリーンショットを作成する方法を知りたいですか? – insomniac

答えて

4

のようなルート 電話を持っている場合にのみSCREENCAPバイナリ、をデバイスの画面のスクリーンショットを取るために:

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() 

そして

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

私はそれをどのようにすることができますアプリのフォルダを保存したい場合は? – Dima

+0

ディレクトリ名を使用するか、環境の代わりにEnvironment.getDataDirectory()またはgetFilesDir()を使用してアプリケーションのデータフォルダに保存する場合は、ファイルを他のディレクトリに保存する場合は、sdcard – insomniac

+0

にimg.pngという名前でファイルが保存されます。 getExternalStorage() – insomniac

0

は何ができますが、これを試すことができます。

//最初:

//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(); 

コードは透明な背景を設定し

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

</activity> 

注:この方法で設定された後に透明

<?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> 

については、以下のテーマXMLを作成できますここから赤い詳細を見ることができますURL:How do I create a transparent Activity on Android?

+0

以下を確認することができますこの回答のみスクリーンショットアプリケーションの画面ではない質問 – insomniac

+0

ああのように。これは私の決意です:誰もあなたのアプリケーションの背景を透明に設定できるので、キャプチャされた画像はあなた自身のアクティビティではなく画面に表示されます。 – GiapLee

+0

しかし、アプリケーションには多くのボタンがあります。背景を透明にするにはどうすればいいですか? – Dima

0

を使用し、ビットマップにそのファイルをロードするためにここで画面をキャプチャしてストレージに保存する方法

外部ストレージにファイルを作成する権限を与える

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

これは行動のコードです。

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(); 
} 

}

これは、画面をキャプチャする方法です。

関連する問題