come creare e salvare una schermata con una surfaceview?

Ho un app che voglio essere in grado di catturare uno screenshot

Ecco il mio codice :

public class Screenshot {

    private final View view;

    /** Create snapshots based on the view and its children. */
    public Screenshot(View root) {
            this.view = root;
    }

    /** Create snapshot handler that captures the root of the whole activity. */
    public Screenshot(Activity activity) {
            final View contentView = activity.findViewById(android.R.id.content);
            this.view = contentView.getRootView();
    }

    /** Take a snapshot of the view. */
    public Bitmap snap() {
            Bitmap bitmap = Bitmap.createBitmap(this.view.getWidth(), this.view.getHeight(), Config.ARGB_8888);
            Canvas canvas = new Canvas(bitmap);
            view.draw(canvas);
            return bitmap;
    }

}

ma il contenuto del surfaceView viene salvato come nero.!!!

Please help me, Grazie…

InformationsquelleAutor natuan241 | 2014-08-02

 

One Reply
  1. 6

    Spero che tu abbia usato questa soluzione che è stato postato qui Ottenere la schermata di surfaceView in Android

    questa cosa è spiegata qui Prendere Screenshot di SurfaceView

    La SurfaceView superficie è indipendente della superficie di Visualizzare elementi sono disegnati. In modo da catturare la Vista dei contenuti non includono la SurfaceView………

    Spero che questo Prendere screenshot a livello di programmazione non cattura il contenuto di surfaceVIew codice in grado di aiutare i più

    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;
        }
    }          

    provare anche questo

    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();
                }
            }

    e si può anche passare attraverso questi riferimenti che ti dà più idea

    Come catturare una schermata di surfaceview con sfondo

    Prendendo l’immagine di una SurfaceView in android

    Come prendere uno screenshot di Android Superficie Vista?

    Come a livello di prendere uno screenshot di Android?

    • @user3640268 wow.grazie così tanto ! Proverò..

Lascia un commento