Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/233.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在android中以编程方式拍摄屏幕截图_Android_Screenshot - Fatal编程技术网

在android中以编程方式拍摄屏幕截图

在android中以编程方式拍摄屏幕截图,android,screenshot,Android,Screenshot,我使用以下代码以编程方式拍摄屏幕截图: public static Bitmap takeScreenshot(View view) { try { // create bitmap screen capture view.setDrawingCacheEnabled(true); Bitmap bitmap = Bitmap.createBitmap(view.getDrawingC

我使用以下代码以编程方式拍摄屏幕截图:

public static Bitmap takeScreenshot(View view)
    {
        try
        {
            // create bitmap screen capture
            view.setDrawingCacheEnabled(true);
            Bitmap bitmap = Bitmap.createBitmap(view.getDrawingCache());
            view.setDrawingCacheEnabled(false);
            return bitmap;
        }
        catch (Throwable e)
        {
            CustomLogHandler.printError(e);
        }
        return null;
    }

private static void copyFile(Bitmap bitmap)
    {
        File dstFile = getShareResultFile();

        //Delete old file if exist.
        if(dstFile.exists()) {
            dstFile.delete();
        }

        FileOutputStream fos = null;
        try
        {
            fos = new FileOutputStream(dstFile);
            bitmap.compress(Bitmap.CompressFormat.JPEG, 0, fos);
            fos.flush();
        }
        catch (Exception e) {
            CustomLogHandler.printError(e);
        }
        finally {
            if (fos != null) {
                try {
                    fos.close();
                } catch (IOException ioe) {
                    CustomLogHandler.printError(ioe);
                }
            }
        }
    }
存在以下几个问题:

  • 后退箭头、标题和共享菜单背景颜色不正确。看起来很乱
  • 工具栏的背景色完全改变了
  • 图像质量太差,可绘制列表项的圆角不平滑
  • 布局的背景不是我设置为父布局背景的背景
  • 我从根视图截图

    此代码可以将视图另存为位图。 但在您使用保存代码更新您的问题之后,我看到您将质量设置为0,您期望的是什么

    @param quality  Hint to the compressor, 0-100. 0 meaning compress for
         *                 small size, 100 meaning compress for max quality. Some
         *                 formats, like PNG which is lossless, will ignore the
         *                 quality setting
    
    只需使用Ctrl键并单击方法名称即可阅读有关参数的文档

    答案设置为第二个参数100而不是0

    bitmap.compress(Bitmap.CompressFormat.JPEG, 0, fos);
    
    首先,您要将其保存为JPEG格式。JPEG是为照片设计的,而您的屏幕截图不是照片

    第二,您正在以质量因子0保存此项。JPEG使用有损压缩算法,质量因子为0表示“请随意使此图像变得非常糟糕,但尽可能压缩它”

    我建议改为:

    bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);
    
    PNG是一种更好的屏幕截图图像格式,其中包含问题中显示的内容。我不认为PNG使用质量因子值;我输入100只是为了表明你想要最好的质量。

    试试这个

    private void captureScreen() {
         View v =  this.getWindow().getDecorView().findViewById(android.R.id.content);
        v.setDrawingCacheEnabled(true);
        Bitmap bitmap = v.getDrawingCache();
        String extr = Environment.getExternalStorageDirectory().toString();
        File file = new File(extr, getString(R.string.free_tiket) + ".jpg");
        FileOutputStream f = null;
        try {
            f = new FileOutputStream(file);
            bitmap.compress(Bitmap.CompressFormat.JPEG, 100, f);
            f.flush();
            f.close();
            MediaStore.Images.Media.insertImage(getContentResolver(), bitmap, "Screen", "screen");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    尝试使用以下方法:

      public static Bitmap loadBitmapFromView(Context context, View v) {
            DisplayMetrics dm = context.getResources().getDisplayMetrics(); 
            v.measure(MeasureSpec.makeMeasureSpec(dm.widthPixels, MeasureSpec.EXACTLY),
                    MeasureSpec.makeMeasureSpec(dm.heightPixels, MeasureSpec.EXACTLY));
            v.layout(0, 0, v.getMeasuredWidth(), v.getMeasuredHeight());
            Bitmap returnedBitmap = Bitmap.createBitmap(v.getMeasuredWidth(),
                    v.getMeasuredHeight(), Bitmap.Config.ARGB_8888);
            Canvas c = new Canvas(returnedBitmap);
            v.draw(c);
    
            return returnedBitmap;
        }
    


    图像保存在外部存储文件夹中。

    请编辑您的问题,并显示您使用此
    位图所做的操作。例如,您是否使用
    compress()
    将其写入磁盘?您是指
    以编程方式
    ?@Merka以编程方式我是指使用代码。现在我想大家都明白了。“但你为什么投反对票?”——我没有投你的问题的赞成票或反对票。“我正在使用bitmap.compress保存到外部存储”--那么您的问题很可能就在那里。请编辑您的问题并显示您正在使用的代码
    compress()
    。如果您正在压缩质量为0的JPG,请将其更改为90或100。即使它不能解决你的问题,它肯定会有帮助。bitmap.compress(bitmap.CompressFormat.JPEG,90,fos);使用100%的质量解决了我的1分、2分和3分。静止背景图像未出现。它是简单的纯黑色。你是对的,问题是保存文件。使用100%的质量解决了我的1分、2分和3分。静止背景图像未出现。它采用简单的纯黑色。而且JPG格式的图像质量比png好,我也很惊讶为什么会这样。@Smeet:我不确定你的问题中“父布局”是什么意思。如果此背景未直接在传递给
    takeScreenshot()
    方法的
    视图
    上实现(或在该
    视图
    的子视图上实现),则它不可能出现在您的图像中。请注意,依赖图形缓存不是一个好的计划;我建议创建一个
    位图
    背景
    画布
    ,并告诉您的
    视图
    画布
    上绘制()
    ;我建议您创建一个以位图为背景的画布,并告诉您的视图在该画布上绘制()-您能建议相同的代码或链接吗?窗口背景与“活动”中的任何视图无关,它与“活动”本身有关。将背景置于视图层次结构中,如
      public static Bitmap loadBitmapFromView(Context context, View v) {
            DisplayMetrics dm = context.getResources().getDisplayMetrics(); 
            v.measure(MeasureSpec.makeMeasureSpec(dm.widthPixels, MeasureSpec.EXACTLY),
                    MeasureSpec.makeMeasureSpec(dm.heightPixels, MeasureSpec.EXACTLY));
            v.layout(0, 0, v.getMeasuredWidth(), v.getMeasuredHeight());
            Bitmap returnedBitmap = Bitmap.createBitmap(v.getMeasuredWidth(),
                    v.getMeasuredHeight(), Bitmap.Config.ARGB_8888);
            Canvas c = new Canvas(returnedBitmap);
            v.draw(c);
    
            return returnedBitmap;
        }
    
    public void takeScreen() {
        Bitmap bitmap = ImageUtils.loadBitmapFromView(this, view); //get Bitmap from the view
        String mPath = Environment.getExternalStorageDirectory() + File.separator + "screen_" + System.currentTimeMillis() + ".jpeg";
        File imageFile = new File(mPath);
        OutputStream fout = null;
        try {
            fout = new FileOutputStream(imageFile);
            bitmap.compress(Bitmap.CompressFormat.JPEG, 90, fout);
            fout.flush();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            fout.close();
        }
    }