how to create and save a screenshot from a surfaceview?

前端 未结 1 1008
逝去的感伤
逝去的感伤 2020-12-01 19:04

I have an app that I want to be able to capture a screenshot

Here is my code :

public class Screenshot {

    private final View view;

    /** Crea         


        
相关标签:
1条回答
  • 2020-12-01 20:00

    I hope you have used this solution which was posted here Get screenshot of surfaceView in Android

    this thing is explained here Take Screenshot of SurfaceView

    The SurfaceView's surface is independent of the surface on which View elements are drawn. So capturing the View contents won't include the SurfaceView.........

    I hope this Taking screenshot programmatically doesnt capture the contents of surfaceVIew code can help you out more

    public class Cam_View extends Activity implements SurfaceHolder.Callback {
    
        protected static final int CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE = 0;
        private SurfaceView SurView;
        private SurfaceHolder camHolder;
        private boolean previewRunning;
        final Context context = this;
        public static Camera camera = null;
        private RelativeLayout CamView;
        private Bitmap inputBMP = null, bmp, bmp1;
        private ImageView mImage;
    
        @SuppressWarnings("deprecation")
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.camera);
    
            CamView = (RelativeLayout) findViewById(R.id.camview);//RELATIVELAYOUT OR 
                                                                  //ANY LAYOUT OF YOUR XML
    
            SurView = (SurfaceView)findViewById(R.id.sview);//SURFACEVIEW FOR THE PREVIEW 
                                                            //OF THE CAMERA FEED
            camHolder = SurView.getHolder();                           //NEEDED FOR THE PREVIEW
            camHolder.addCallback(this);                               //NEEDED FOR THE PREVIEW
            camHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);//NEEDED FOR THE PREVIEW
            camera_image = (ImageView) findViewById(R.id.camera_image);//NEEDED FOR THE PREVIEW
    
            Button btn = (Button) findViewById(R.id.button1); //THE BUTTON FOR TAKING PICTURE
    
            btn.setOnClickListener(new OnClickListener() {    //THE BUTTON CODE
                public void onClick(View v) {
                      camera.takePicture(null, null, mPicture);//TAKING THE PICTURE
                                                             //THE mPicture IS CALLED 
                                                             //WHICH IS THE LAST METHOD(SEE BELOW)
                }
            });
        }
    
        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width,//NEEDED FOR THE PREVIEW
            int height) {
            if(previewRunning) {
                camera.stopPreview();
            }
            Camera.Parameters camParams = camera.getParameters();
            Camera.Size size = camParams.getSupportedPreviewSizes().get(0);
            camParams.setPreviewSize(size.width, size.height);
            camera.setParameters(camParams);
            try {
                camera.setPreviewDisplay(holder);
                camera.startPreview();
                previewRunning=true;
            } catch(IOException e) {
                e.printStackTrace();
            }
        }
    
        public void surfaceCreated(SurfaceHolder holder) {                  //NEEDED FOR THE PREVIEW
            try {
                camera=Camera.open();
            } catch(Exception e) {
                e.printStackTrace();
                Toast.makeText(getApplicationContext(),"Error",Toast.LENGTH_LONG).show();
                finish();
            }
        }
    
        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {             //NEEDED FOR THE PREVIEW
            camera.stopPreview();
            camera.release();
            camera=null;
        }
    
        public void TakeScreenshot(){    //THIS METHOD TAKES A SCREENSHOT AND SAVES IT AS .jpg
            Random num = new Random();
            int nu=num.nextInt(1000); //PRODUCING A RANDOM NUMBER FOR FILE NAME
            CamView.setDrawingCacheEnabled(true); //CamView OR THE NAME OF YOUR LAYOUR
            CamView.buildDrawingCache(true);
            Bitmap bmp = Bitmap.createBitmap(CamView.getDrawingCache());
            CamView.setDrawingCacheEnabled(false); // clear drawing cache
            ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
            bmp.compress(CompressFormat.JPEG, 100, bos); 
            byte[] bitmapdata = bos.toByteArray();
            ByteArrayInputStream fis = new ByteArrayInputStream(bitmapdata);
    
            String picId=String.valueOf(nu);
            String myfile="Ghost"+picId+".jpeg";
    
            File dir_image = new  File(Environment.getExternalStorageDirectory()+//<---
                            File.separator+"Ultimate Entity Detector");          //<---
            dir_image.mkdirs();                                                  //<---
            //^IN THESE 3 LINES YOU SET THE FOLDER PATH/NAME . HERE I CHOOSE TO SAVE
            //THE FILE IN THE SD CARD IN THE FOLDER "Ultimate Entity Detector"
    
            try {
                File tmpFile = new File(dir_image,myfile); 
                FileOutputStream fos = new FileOutputStream(tmpFile);
    
                byte[] buf = new byte[1024];
                int len;
                while ((len = fis.read(buf)) > 0) {
                    fos.write(buf, 0, len);
                }
                fis.close();
                fos.close();
                Toast.makeText(getApplicationContext(),
                               "The file is saved at :SD/Ultimate Entity Detector",Toast.LENGTH_LONG).show();
                bmp1 = null;
                camera_image.setImageBitmap(bmp1); //RESETING THE PREVIEW
                camera.startPreview();             //RESETING THE PREVIEW
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        private PictureCallback mPicture = new PictureCallback() {   //THIS METHOD AND THE METHOD BELOW
                                     //CONVERT THE CAPTURED IMAGE IN A JPG FILE AND SAVE IT
    
            @Override
            public void onPictureTaken(byte[] data, Camera camera) {
    
                File dir_image2 = new  File(Environment.getExternalStorageDirectory()+
                                File.separator+"Ultimate Entity Detector");
                dir_image2.mkdirs();  //AGAIN CHOOSING FOLDER FOR THE PICTURE(WHICH IS LIKE A SURFACEVIEW
                                      //SCREENSHOT)
    
                File tmpFile = new File(dir_image2,"TempGhost.jpg"); //MAKING A FILE IN THE PATH
                                //dir_image2(SEE RIGHT ABOVE) AND NAMING IT "TempGhost.jpg" OR ANYTHING ELSE
                try { //SAVING
                    FileOutputStream fos = new FileOutputStream(tmpFile);
                    fos.write(data);
                    fos.close();
                    //grabImage();
                } catch (FileNotFoundException e) {
                    Toast.makeText(getApplicationContext(),"Error",Toast.LENGTH_LONG).show();
                } catch (IOException e) {
                    Toast.makeText(getApplicationContext(),"Error",Toast.LENGTH_LONG).show();
                }
    
                String path = (Environment.getExternalStorageDirectory()+
                                File.separator+"Ultimate EntityDetector"+
                                                    File.separator+"TempGhost.jpg");//<---
    
                BitmapFactory.Options options = new BitmapFactory.Options();//<---
                    options.inPreferredConfig = Bitmap.Config.ARGB_8888;//<---
                bmp1 = BitmapFactory.decodeFile(path, options);//<---     *********(SEE BELOW)
                //THE LINES ABOVE READ THE FILE WE SAVED BEFORE AND CONVERT IT INTO A BitMap
                camera_image.setImageBitmap(bmp1); //SETTING THE BitMap AS IMAGE IN AN IMAGEVIEW(SOMETHING
                                            //LIKE A BACKGROUNG FOR THE LAYOUT)
    
                tmpFile.delete();
                TakeScreenshot();//CALLING THIS METHOD TO TAKE A SCREENSHOT
                //********* THAT LINE MIGHT CAUSE A CRASH ON SOME PHONES (LIKE XPERIA T)<----(SEE HERE)
                //IF THAT HAPPENDS USE THE LINE "bmp1 =decodeFile(tmpFile);" WITH THE METHOD BELOW
    
            }
        };
    
        public Bitmap decodeFile(File f) {  //FUNCTION BY Arshad Parwez
            Bitmap b = null;
            try {
                // Decode image size
                BitmapFactory.Options o = new BitmapFactory.Options();
                o.inJustDecodeBounds = true;
    
                FileInputStream fis = new FileInputStream(f);
                BitmapFactory.decodeStream(fis, null, o);
                fis.close();
                int IMAGE_MAX_SIZE = 1000;
                int scale = 1;
                if (o.outHeight > IMAGE_MAX_SIZE || o.outWidth > IMAGE_MAX_SIZE) {
                    scale = (int) Math.pow(
                            2,
                            (int) Math.round(Math.log(IMAGE_MAX_SIZE
                                    / (double) Math.max(o.outHeight, o.outWidth))
                                    / Math.log(0.5)));
                }
    
                // Decode with inSampleSize
                BitmapFactory.Options o2 = new BitmapFactory.Options();
                o2.inSampleSize = scale;
                fis = new FileInputStream(f);
                b = BitmapFactory.decodeStream(fis, null, o2);
                fis.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return b;
        }
    }          
    

    try out this also

    public static Bitmap overlay(Bitmap bmp1,Bitmap bmp2) {
                Bitmap bmOverlay = Bitmap.createBitmap(bmp1.getWidth(), bmp1.getHeight(),      bmp1.getConfig());
                Canvas canvas = new Canvas(bmOverlay);
                canvas.drawBitmap(bmp1, 0,0, null);
    
                canvas.drawBitmap(bmp2, 0, 0, null);
                Log.i("bmOverlay.......",""+bmOverlay);
                bmp3=bmOverlay;
                return bmOverlay;
            }
    
               private void getScreen() {
                Toast.makeText(BookType1.this, "saved", Toast.LENGTH_SHORT).show();
                  File myDir=new File("/sdcard/saved_images");
                    myDir.mkdirs();
                    Random generator = new Random();
                    int n = 10000;
                    n = generator.nextInt(n);
                    String fname = "Image-"+ n +".png";
                    File file = new File (myDir, fname);
    
    
                try 
                {
    
                    FileOutputStream ostream = new FileOutputStream(file);
                    bmp3.compress(CompressFormat.PNG, 100, ostream);
    
    
                    ostream.close();
                } 
                catch (Exception e) 
                {
                    e.printStackTrace();
                }
            }
    

    and you can also go through these references which gives you more idea

    How to capture screenshot of surfaceview with background

    Taking screen shot of a SurfaceView in android

    How to take a screenshot of Android's Surface View?

    How to programmatically take a screenshot in Android?

    0 讨论(0)
提交回复
热议问题