截图Android中的黑色

时间:2016-04-27 01:10:04

标签: java android screenshot

我一直在研究如何在android中以编程方式截取屏幕截图,但是当它截图时,我会获得一个工具栏和黑屏,而不是屏幕上显示的内容。

我还试图在我为Google地图创建的自定义InfoWindow布局中截取特定的TextView。但是这会在下面的第二行创建一个空指针异常。

TextView v1 = (TextView)findViewById(R.id.tv_code);
v1.setDrawingCacheEnabled(true);

无论如何实际截断屏幕上没有安装android截图库的内容或者在自定义InfoWindow布局中截取TextView

这是我的截图方法:

/**
 * Method to take a screenshot programmatically
 */
private void takeScreenshot(){
    try {
        //TextView I could screenshot instead of the whole screen:
        //TextView v1 = (TextView)findViewById(R.id.tv_code);

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


        ByteArrayOutputStream bytes = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.JPEG, 40, bytes);
        File f = new File(Environment.getExternalStorageDirectory()
                + File.separator + "test.jpg");

        FileOutputStream fo = new FileOutputStream(f);
        fo.write(bytes.toByteArray());
        fo.flush();
        fo.close();

        MediaStore.Images.Media.insertImage(getContentResolver(), f.getAbsolutePath(), f.getName(), f.getName());
        Log.d("debug", "Screenshot saved to gallery");

        Toast.makeText(HuntActivity.this,"Code Saved!",Toast.LENGTH_LONG).show();

    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

编辑:我已将方法更改为源

提供的方法

How can i take/merge screen shot of Google map v2 and layout of xml both programmatically?

然而,它没有截图任何内容。

public void captureMapScreen() {
    GoogleMap.SnapshotReadyCallback callback = new GoogleMap.SnapshotReadyCallback() {

        @Override
        public void onSnapshotReady(Bitmap snapshot) {
            try {
                View mView = getWindow().getDecorView().getRootView();
                mView.setDrawingCacheEnabled(true);
                Bitmap backBitmap = mView.getDrawingCache();
                Bitmap bmOverlay = Bitmap.createBitmap(
                        backBitmap.getWidth(), backBitmap.getHeight(),
                        backBitmap.getConfig());

                Canvas canvas = new Canvas(bmOverlay);
                canvas.drawBitmap(backBitmap, 0, 0, null);
                canvas.drawBitmap(snapshot, new Matrix(), null);

                FileOutputStream out = new FileOutputStream(
                        Environment.getExternalStorageDirectory()
                                + "/"
                                + System.currentTimeMillis() + ".jpg");

                bmOverlay.compress(Bitmap.CompressFormat.JPEG, 90, out);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    };
    mMap.snapshot(callback);
}

4 个答案:

答案 0 :(得分:1)

  

使用此代码

private void takeScreenshot() {
    AsyncTask<Void, Void, Void> asyc = new AsyncTask<Void, Void, Void>() {
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            objUsefullData.showProgress("Please wait", "");

        }

        @Override
        protected Void doInBackground(Void... params) {
            try {
                // create bitmap screen capture
                View v1 = getWindow().getDecorView().getRootView();
                v1.setDrawingCacheEnabled(true);
                bitmapscreen_shot = Bitmap.createBitmap(v1
                        .getDrawingCache());
                v1.setDrawingCacheEnabled(false);
                String state = Environment.getExternalStorageState();
                File folder = null;
                if (state.contains(Environment.MEDIA_MOUNTED)) {
                    folder = new File(
                            Environment.getExternalStorageDirectory()
                                    + "/piccapella");
                } else {
                    folder = new File(
                            Environment.getExternalStorageDirectory()
                                    + "/piccapella");
                }
                boolean success = true;
                if (!folder.exists()) {
                    success = folder.mkdirs();
                }
                if (success) {
                    // Create a media file name
                    String timeStamp = new SimpleDateFormat(
                            "yyyyMMdd_HHmmss", Locale.getDefault())
                            .format(new java.util.Date());
                    imageFile = new File(folder.getAbsolutePath()
                            + File.separator + "IMG_" + timeStamp + ".jpg");
                    /*
                     * Toast.makeText(AddTextActivity.this,
                     * "saved Image path" + "" + imageFile,
                     * Toast.LENGTH_SHORT) .show();
                     */
                    imageFile.createNewFile();
                } else {
                    /*
                     * Toast.makeText(AddTextActivity.this,
                     * "Image Not saved", Toast.LENGTH_SHORT).show();
                     */
                }
                ByteArrayOutputStream ostream = new ByteArrayOutputStream();
                // save image into gallery
                bitmapscreen_shot.compress(CompressFormat.JPEG, 100,
                        ostream);
                FileOutputStream fout = new FileOutputStream(imageFile);
                fout.write(ostream.toByteArray());
                fout.close();
                Log.e("image_screen_shot", "" + imageFile);
            } catch (Throwable e) {
                // Several error may come out with file handling or OOM
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            // TODO Auto-generated method stub
            super.onPostExecute(result);
            objUsefullData.dismissProgress();

        }
    };
    asyc.execute();
}
  

希望这会对你有所帮助

答案 1 :(得分:1)

我已经弄清楚了!

/**
 * Method to take a screenshot programmatically
 */
private void takeScreenshot(){
    GoogleMap.SnapshotReadyCallback callback = new GoogleMap.SnapshotReadyCallback() {
        @Override
        public void onSnapshotReady(Bitmap bitmap) {
            Bitmap b = bitmap;
            String timeStamp = new SimpleDateFormat(
                    "yyyyMMdd_HHmmss", Locale.getDefault())
                    .format(new java.util.Date());

            String filepath = timeStamp + ".jpg";

            try{
                OutputStream fout = null;
                fout = openFileOutput(filepath,MODE_WORLD_READABLE);
                bitmap.compress(Bitmap.CompressFormat.JPEG, 90, fout);
                fout.flush();
                fout.close();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            saveImage(filepath);
        }
    };
    mMap.snapshot(callback);
}

/**
 * Method to save the screenshot image
 * @param filePath  the file path
 */
public void saveImage(String filePath)
{
    File file = this.getFileStreamPath(filePath);

    if(!filePath.equals(""))
    {
        final ContentValues values = new ContentValues(2);
        values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");
        values.put(MediaStore.Images.Media.DATA, file.getAbsolutePath());
        final Uri contentUriFile = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
        Toast.makeText(HuntActivity.this,"Code Saved to files!",Toast.LENGTH_LONG).show();
    }
    else
    {
        System.out.println("ERROR");
    }
}

我已经调整了此链接中的代码,因此它不会共享,而只是保存图像。

Capture screen shot of GoogleMap Android API V2

感谢大家的帮助

答案 2 :(得分:0)

请尝试使用以下代码:

$('.rating').raty('score', score);

答案 3 :(得分:0)

我遇到了这个问题。在v1.setDrawingCacheEnabled(true)之后;我补充说,

v1.buildDrawingCache();

并且延迟调用takeScreenshot();方法。

它是固定的。