android - 如何捕获android设备屏幕内容?

标签 android screen-capture

Possible Duplicate:
How to programatically take a screenshot on Android?

如何捕获android设备屏幕内容并使用快照数据制作图像文件?我应该使用哪个 API,或者在哪里可以找到相关资源?

顺便说一句: 不是相机快照,而是设备屏幕

最佳答案

使用以下代码:

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

这里的MyView 是我们需要通过它包含在屏幕中的View。您也可以通过这种方式从任何 View 中获取 DrawingCache(无需 getRootView())。


还有另一种方法..
如果我们将ScrollView作为 Root View ,那么最好使用以下代码,

LayoutInflater inflater = (LayoutInflater) this.getSystemService(LAYOUT_INFLATER_SERVICE);
FrameLayout root = (FrameLayout) inflater.inflate(R.layout.activity_main, null); // activity_main is UI(xml) file we used in our Activity class. FrameLayout is root view of my UI(xml) file.
root.setDrawingCacheEnabled(true);
Bitmap bitmap = getBitmapFromView(this.getWindow().findViewById(R.id.frameLayout)); // here give id of our root layout (here its my FrameLayout's id)
root.setDrawingCacheEnabled(false);

这里是 getBitmapFromView() 方法

public static Bitmap getBitmapFromView(View view) {
        //Define a bitmap with the same size as the view
        Bitmap returnedBitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(),Bitmap.Config.ARGB_8888);
        //Bind a canvas to it
        Canvas canvas = new Canvas(returnedBitmap);
        //Get the view's background
        Drawable bgDrawable =view.getBackground();
        if (bgDrawable!=null) 
            //has background drawable, then draw it on the canvas
            bgDrawable.draw(canvas);
        else 
            //does not have background drawable, then draw white background on the canvas
            canvas.drawColor(Color.WHITE);
        // draw the view on the canvas
        view.draw(canvas);
        //return the bitmap
        return returnedBitmap;
    }

它将显示整个屏幕,包括隐藏在 ScrollView 中的内容


2016 年 4 月 20 日更新

还有一种更好的截屏方式。
这里我截取了WebView

WebView w = new WebView(this);
    w.setWebViewClient(new WebViewClient()
    {
        public void onPageFinished(final WebView webView, String url) {

            new Handler().postDelayed(new Runnable(){
                @Override
                public void run() {
                    webView.measure(View.MeasureSpec.makeMeasureSpec(
                                    View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED),
                            View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
                    webView.layout(0, 0, webView.getMeasuredWidth(),
                            webView.getMeasuredHeight());
                    webView.setDrawingCacheEnabled(true);
                    webView.buildDrawingCache();
                    Bitmap bitmap = Bitmap.createBitmap(webView.getMeasuredWidth(),
                            webView.getMeasuredHeight(), Bitmap.Config.ARGB_8888);

                    Canvas canvas = new Canvas(bitmap);
                    Paint paint = new Paint();
                    int height = bitmap.getHeight();
                    canvas.drawBitmap(bitmap, 0, height, paint);
                    webView.draw(canvas);

                    if (bitmap != null) {
                        try {
                            String filePath = Environment.getExternalStorageDirectory()
                                    .toString();
                            OutputStream out = null;
                            File file = new File(filePath, "/webviewScreenShot.png");
                            out = new FileOutputStream(file);

                            bitmap.compress(Bitmap.CompressFormat.PNG, 50, out);
                            out.flush();
                            out.close();
                            bitmap.recycle();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                }
            }, 1000);
        }
    });

希望这会有所帮助..!

关于android - 如何捕获android设备屏幕内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3067586/

相关文章:

java - 以编程方式将文件从android设备保存到windows

android - 我们可以将触摸板或触控板值模拟到 android 平板电脑吗?

java - Android 向上导航和操作栏中的按钮

java - 并行执行两个 AsyncTask

wpf - 如何防止(禁用)WPF 应用程序的视频捕获

iphone - 可以检测用户是否在 iOS 上按下屏幕捕获按钮?

android - 用于 Android 4.4 屏幕录制的 API?

macos - 在 cron 上的屏幕截图显示背景而不是窗口内容

windows - 在Windows 10中,我们如何判断一个窗口属于哪个虚拟桌面呢?

android - 从 Android 1.6 到 Android 2.2 的升级和应用程序不起作用