捕获屏幕编程不起作用

时间:2013-03-18 06:08:08

标签: android screenshot android-screen

我有以下方法捕捉动作项目点击屏幕。它适用于Android< 2.3但不适用于4+。这种屏幕捕获方式有什么问题。

private void captureScreen() {
    View v = mapView.getRootView();
    v.setDrawingCacheEnabled(true);
    Bitmap capturedBitmap = Bitmap.createBitmap(v.getDrawingCache());
    v.setDrawingCacheEnabled(false);

    if(capturedBitmap != null) {
        Intent intent = new Intent(this, ScreenCapturedAlertActivity.class);
        intent.putExtra("capturedImage", capturedBitmap);
        intent.putExtra("name", location.getName());
        startActivity(intent);
    } else {
        Toast.makeText(this, "Screen Capture Failed", Toast.LENGTH_SHORT).show();
    }
}

ScreenCaputureAlertActivity.java>>>

public class ScreenCapturedAlertActivity extends SherlockActivity {

private ImageView capturedImage;
private Bitmap capturedBitmap;
private String name;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);

    setContentView(R.layout.activity_screencaptured_alert);

    capturedBitmap = (Bitmap) getIntent().getParcelableExtra("capturedImage");
    name = getIntent().getStringExtra("name");

    capturedImage = (ImageView) findViewById(R.id.ivCapturedImage);
    capturedImage.setImageBitmap(capturedBitmap);
}

private void saveAndShare(boolean share) {
    String root = Environment.getExternalStorageDirectory().toString();
    File dir = new File(root + "/capture/");
    if(!dir.exists())
        dir.mkdirs();

    FileOutputStream outStream = null;
    Random generator = new Random();
    int n = 10000;
    n = generator.nextInt(n);
    File file = new File(dir, "Capture "+n+".jpg");
    if(file.exists()) {
        file.delete();
    }
    try {
        outStream = new FileOutputStream(file);

        capturedBitmap.compress(Bitmap.CompressFormat.JPEG, 100, outStream);

        outStream.flush();
        outStream.close();

    } catch (FileNotFoundException e) {
        e.printStackTrace();
        Toast.makeText(this, "Save Failed", Toast.LENGTH_SHORT).show();
        return;
    } catch (IOException e) {
        e.printStackTrace();
        Toast.makeText(this, "Save Failed", Toast.LENGTH_SHORT).show();
        return;
    }

    if(share) {
        Uri screenshotUri = Uri.fromFile(file);
        Intent intent = new Intent(Intent.ACTION_SEND);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        intent.putExtra(Intent.EXTRA_STREAM, screenshotUri);
        intent.putExtra(Intent.EXTRA_SUBJECT, "Location of " + name);
        intent.putExtra(Intent.EXTRA_TITLE, getText(R.string.screen_share_message));
        intent.putExtra(Intent.EXTRA_TEXT, getText(R.string.screen_share_message));
        intent.setType("image/*");
        startActivity(Intent.createChooser(intent, "Share with"));
        finish();
    } else {
        Toast.makeText(this, "Save Success", Toast.LENGTH_SHORT).show();

        sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED,Uri.parse("file://" + Environment.getExternalStorageDirectory())));
        finish();
    }
}

public void saveCapture(View view) {
    saveAndShare(false);
}

public void shareCapture(View view) {
    saveAndShare(true);
}

}

2 个答案:

答案 0 :(得分:2)

感谢@KumarBibek的指导。

我得到的错误是

!!! FAILED BINDER TRANSACTION !!!

从链接中选择的答案

开始

Send Bitmap as Byte Array

我在第一项活动中确实喜欢这个:

private void captureScreen() {
    View v = mapView.getRootView();
    v.setDrawingCacheEnabled(true);
    Bitmap capturedBitmap = Bitmap.createBitmap(v.getDrawingCache());
    v.setDrawingCacheEnabled(false);

    ByteArrayOutputStream stream = new ByteArrayOutputStream();
    capturedBitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
    byte[] byteArray = stream.toByteArray();

    if(capturedBitmap != null) {
        Intent intent = new Intent(this, ScreenCapturedAlertActivity.class);
        intent.putExtra("capture", byteArray);
        intent.putExtra("name", location.getName());
        startActivity(intent);
    } else {
        Toast.makeText(this, "Screen Capture Failed", Toast.LENGTH_SHORT).show();
    }

}

在ScreenCapturedAlertActivity中:

byte[] byteArray = getIntent().getByteArrayExtra("capture");
        capturedBitmap = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length);

现在工作得很好。再次感谢@KumarBibek

答案 1 :(得分:1)

尝试将文件保存文件的路径传递给下一个活动,而不是传递整个位图。 Bitmap是一个大型对象,它不应该像那样传递。

由于您已经检查过图像保存得很好,如果您处理路径而不是位图,我认为它可以解决您的问题。