ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java – 截图Android中的黑色

2019-07-06 08:36:02  阅读:203  来源: 互联网

标签:java android screenshot


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

我还尝试在为谷歌地图创建的自定义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);
}

解决方法:

我已经弄清楚了!

/**
 * 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

感谢大家的帮助

标签:java,android,screenshot
来源: https://codeday.me/bug/20190706/1395670.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有