web-dev-qa-db-ja.com

Androidプログラムでスクリーンショットを撮る

まず、ルートアプリを作成しているので、ルート権限は問題になりません。私は検索して検索しましたが、ここで私のために働いたことのない多くのコードがこれまで私がつなぎ合わせたものであり、かなりうまくいきます。 sortaと言うと、/ sdcard/test.pngに画像を作成しますが、ファイルは0バイトであり、明らかに表示できません。

public class ScreenShot extends Activity{

View content;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.blank);
    content = findViewById(R.id.blankview);
    getScreen();
}

private void getScreen(){
    Bitmap bitmap = content.getDrawingCache();
    File file = new File("/sdcard/test.png");
    try 
    {
        file.createNewFile();
        FileOutputStream ostream = new FileOutputStream(file);
        bitmap.compress(CompressFormat.PNG, 100, ostream);
        ostream.close();
    } 
    catch (Exception e) 
    {
        e.printStackTrace();
    }
}
}

Androidでコードを介してスクリーンショットを撮る方法に関するヘルプは大歓迎です!

=== EDIT ===

以下は、私が画像を使用しているすべてが私のSDカードで作成され、0バイトではなくなりましたが、全体が黒く、何もありません。私はアクティビティを検索ボタンにバインドしているので、電話のどこかで検索を長押しすると、スクリーンショットを撮るはずですが、黒い画像が表示されますか?すべてが透明に設定されているので、画面上にあるものをすべて取得する必要があると思いますが、私はただ黒くなっています

マニフェスト

<activity Android:name=".extras.ScreenShot"
    Android:theme="@Android:style/Theme.Translucent.NoTitleBar"
    Android:noHistory="true" >
    <intent-filter>
        <action Android:name="Android.intent.action.SEARCH_LONG_PRESS" />
        <category Android:name="Android.intent.category.DEFAULT" />
    </intent-filter>
    </activity>

[〜#〜] xml [〜#〜]

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:Android="http://schemas.Android.com/apk/res/Android"
  Android:orientation="vertical"
  Android:layout_width="match_parent"
  Android:layout_height="match_parent"
  Android:background="#00000000"
  Android:id="@+id/screenRoot">    
</LinearLayout>

スクリーンショットクラス

public class ScreenShot extends Activity{

View content;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.screenshot);
    content = findViewById(R.id.screenRoot);
    ViewTreeObserver vto = content.getViewTreeObserver();
    vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
      @Override
      public void onGlobalLayout() {
        content.getViewTreeObserver().removeGlobalOnLayoutListener(this);
        getScreen();
      }
    });
}

private void getScreen(){
    View view = content;
    View v = view.getRootView();
    v.setDrawingCacheEnabled(true);
    Bitmap b = v.getDrawingCache();             
    String extr = Environment.getExternalStorageDirectory().toString();
    File myPath = new File(extr, "test.jpg");
    FileOutputStream fos = null;
    try {
        fos = new FileOutputStream(myPath);
        b.compress(Bitmap.CompressFormat.JPEG, 100, fos);
        fos.flush();
        fos.close();
        MediaStore.Images.Media.insertImage(getContentResolver(), b, "Screen", "screen");
    }catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    finish();
}
}
46
user577732

ここに行きます...私はこれを使用しました:

View v = view.getRootView();
v.setDrawingCacheEnabled(true);
Bitmap b = v.getDrawingCache();
String extr = Environment.getExternalStorageDirectory().toString();
File myPath = new File(extr, getString(R.string.free_tiket)+".jpg");
FileOutputStream fos = null;
try {
    fos = new FileOutputStream(myPath);
    b.compress(Bitmap.CompressFormat.JPEG, 100, fos);
    fos.flush();
    fos.close();
    MediaStore.Images.Media.insertImage( getContentResolver(), b, 
                                         "Screen", "screen");
} catch (FileNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

v izルートレイアウト...ポイントするだけ;)))

26
Jovan

この質問の次の読者のために-

ビューをキャンバスに描画することでこれを行う非常に簡単な方法-

メインのレイアウト参照をこのメソッドに渡します-

 Bitmap file = save(layout);

 Bitmap save(View v)
   {
    Bitmap b = Bitmap.createBitmap(v.getWidth(), v.getHeight(), Bitmap.Config.ARGB_8888);
    Canvas c = new Canvas(b);
    v.draw(c);
    return b;
   }
4
Tarun Varshney
public class MainActivity extends Activity
{
Button btn;

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    btn = (Button) findViewById(R.id.btn);
    btn.setOnClickListener(new OnClickListener()
    {

        @Override
        public void onClick(View v)
        {
            // TODO Auto-generated method stub
            Bitmap bitmap = takeScreenshot();
            saveBitmap(bitmap);

        }
    });
}

public Bitmap takeScreenshot()
{
    View rootView = findViewById(Android.R.id.content).getRootView();
    rootView.setDrawingCacheEnabled(true);
    return rootView.getDrawingCache();
}

public void saveBitmap(Bitmap bitmap)
{
    File imagePath = new File(Environment.getExternalStorageDirectory() + "/screenshot.png");
    FileOutputStream fos;
    try
    {
        fos = new FileOutputStream(imagePath);
        bitmap.compress(CompressFormat.JPEG, 100, fos);
        fos.flush();
        fos.close();
    }
    catch (FileNotFoundException e)
    {
        Log.e("GREC", e.getMessage(), e);
    }
    catch (IOException e)
    {
        Log.e("GREC", e.getMessage(), e);
    }
}
}

外部ストレージへの書き込み許可を忘れないでください!

1

レイアウトが完全に描画されるまで待つ必要があると思います。ViewTreeObserverを使用して、レイアウトが完全に描画されたときにコールバックを取得します。

OnCreateでこのコードを追加します。onGlobalLayout()内からgetScreenのみを呼び出します。

ViewTreeObserver vto = content.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
  @Override
  public void onGlobalLayout() {
    content.getViewTreeObserver().removeGlobalOnLayoutListener(this);
    getScreen();
  }
});

少し似たような質問をしました question once..Androidでスクリーンショットを撮る方法を説明する私の質問をご覧ください。

1
Krishnabhadra

このようなスクリーンショットを撮る........

View view =  findViewById(R.id.rellayout);
        view.getRootView();
        String state = Environment.getExternalStorageState();
        if (Environment.MEDIA_MOUNTED.equals(state)) 
        {
            File picDir  = new File(Environment.getExternalStorageDirectory()+ "/name");
            if (!picDir.exists())
            {
                picDir.mkdir();
            }
            view.setDrawingCacheEnabled(true);
            view.buildDrawingCache(true);
            Bitmap bitmap = view.getDrawingCache();
//          Date date = new Date();
            String fileName = "mylove" + ".jpg";
            File picFile = new File(picDir + "/" + fileName);
            try 
            {
                picFile.createNewFile();
                FileOutputStream picOut = new FileOutputStream(picFile);
                bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), (int)(bitmap.getHeight()/1.2));//Optional
                boolean saved = bitmap.compress(CompressFormat.JPEG, 100, picOut);
                if (saved) 
                {
                    Toast.makeText(getApplicationContext(), "Image saved to your device Pictures "+ "directory!", Toast.LENGTH_SHORT).show();
                } else 
                {
                    //Error
                }
                picOut.close();
            } 
            catch (Exception e) 
            {
                e.printStackTrace();
            }
            view.destroyDrawingCache();
        } else {


        }
0
Singhak