2016-06-22 25 views
2

Ich versuche zu implementieren Machen Sie ein Screenshot Formular meiner Kamera Oberflächenansicht durch Code. Ich kann von diesen Dingen, aber der Screenshot erscheint immer schwarz. Hier ist der Code. Ich habe viele Links gesucht und meinen Code implementiert. aber immer noch Screenshot erscheint schwarz. wie man das löst. Bitte führen Sie mich. dankeSo nehmen Sie Screenshot für Android Oberflächenansicht

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,camera_image; 

    @SuppressWarnings("deprecation") 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.testscreenshot); 

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

ich habe Ihren Code getippt. Das ist mein Screenshot. enter image description here

das ist screenshot meine Handy-Screenshot .. home-Taste ist eine Bildschirmfoto-Schaltfläche. enter image description here

einmal Schaltfläche geklickt. dass Screenshot wird enter image description here

aktualisiert Codierung schwarzem Hintergrund sein:

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,camera_image; 


    @SuppressWarnings("deprecation") 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.testscreenshot); 

     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) 

      } 

     }); 
    } 

    public Bitmap screenShot(View view) { 
     Bitmap bitmap = Bitmap.createBitmap(view.getWidth(), 
       view.getHeight(), Config.ARGB_8888); 
     Canvas canvas = new Canvas(bitmap); 
     view.draw(canvas); 
     return bitmap; 
    } 

    private void openScreenshot(File imageFile) { 
     Intent intent = new Intent(); 
     intent.setAction(Intent.ACTION_VIEW); 
     Uri uri = Uri.fromFile(imageFile); 
     intent.setDataAndType(uri, "image/*"); 
     startActivity(intent); 
    } 

    @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 

     CamView.setDrawingCacheEnabled(true); 
     CamView.buildDrawingCache(true); 

         Bitmap b = Bitmap.createBitmap(CamView.getDrawingCache()); 
         System.out.println("b====================="+b); 
         CamView.setDrawingCacheEnabled(false); 


         //Save bitmap to ur sdcard 

         File mFolder = new File(Environment.getExternalStorageDirectory().toString()+ "/xxx"); 
         File mCapture = new File(mFolder.getAbsolutePath()+ "/Captured"); 

         SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss_SSS"); 
         String dateString = formatter.format(new java.util.Date()); 

         String fileName = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss_SSS'_xxx.jpg'").format(new Date()); 
         File imgFile = new File(mCapture.getAbsolutePath(), fileName); 

         String extr = Environment.getExternalStorageDirectory().toString() + File.separator + "xxx/Captured"; 

         FileOutputStream fos = null; 
         try { 
          if (!mFolder.exists()) { 
           mFolder.mkdir(); 
          } 
          if (!mCapture.exists()) { 
           mCapture.mkdir(); 
          } 
          if (!imgFile.exists()) { 
           imgFile.createNewFile(); 
          } 
          fos = new FileOutputStream(imgFile); 
          b.compress(Bitmap.CompressFormat.PNG, 100, fos); 
          fos.flush(); 
          fos.close(); 
          MediaStore.Images.Media.insertImage(Cam_View.this.getContentResolver(), b, "Screen", "screen"); 
         }catch (FileNotFoundException e) { 
          // TODO Auto-generated catch block 
          e.printStackTrace(); 
         } catch (Exception e) { 
          // TODO Auto-generated catch block 
          e.printStackTrace(); 
         } 



         final Intent shareIntent = new Intent(Intent.ACTION_SEND); 
         shareIntent.setType("image/jpg"); 
         final File photoFile = new File(extr,fileName); 
         shareIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(photoFile)); 
         startActivity(Intent.createChooser(shareIntent, "Share image using")); 


    } 

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

Verweise diesen Beitrag http://stackoverflow.com/questions/18289544/taking-screenshot-programmatic-doesnt-capture-the-contents-of-surfaceview – Radhey

+0

@Radhey Ich habe diesen Beitrag auch versucht.aber Screenshot black.please führe mich dank – Raj

+0

ich würde gerne screenshot für loch layout machen wie als kameraansicht und kameraüberlagerung bild – Raj

Antwort

-1
mContentView.setDrawingCacheEnabled(true); 
mContentView.buildDrawingCache(true); 

       Bitmap b = Bitmap.createBitmap(mContentView.getDrawingCache()); 
       mContentView.setDrawingCacheEnabled(false); 


       //Save bitmap to ur sdcard 

       File mFolder = new File(Environment.getExternalStorageDirectory().toString()+ "/xxx"); 
       File mCapture = new File(mFolder.getAbsolutePath()+ "/Captured"); 

       SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss_SSS"); 
       String dateString = formatter.format(new java.util.Date()); 

       String fileName = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss_SSS'_xxx.jpg'").format(new Date()); 
       File imgFile = new File(mCapture.getAbsolutePath(), fileName); 

       String extr = Environment.getExternalStorageDirectory().toString() + File.separator + "xxx/Captured"; 

       FileOutputStream fos = null; 
       try { 
        if (!mFolder.exists()) { 
         mFolder.mkdir(); 
        } 
        if (!mCapture.exists()) { 
         mCapture.mkdir(); 
        } 
        if (!imgFile.exists()) { 
         imgFile.createNewFile(); 
        } 
        fos = new FileOutputStream(imgFile); 
        b.compress(Bitmap.CompressFormat.PNG, 100, fos); 
        fos.flush(); 
        fos.close(); 
        MediaStore.Images.Media.insertImage(getActivity().getContentResolver(), b, "Screen", "screen"); 
       }catch (FileNotFoundException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } catch (Exception e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 



       final Intent shareIntent = new Intent(Intent.ACTION_SEND); 
       shareIntent.setType("image/jpg"); 
       final File photoFile = new File(extr,fileName); 
       shareIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(photoFile)); 
       startActivity(Intent.createChooser(shareIntent, "Share image using")); 

hier mContentView ist die Mutter Ansicht Ihrer Oberflächenansicht. wenden Sie dies an und lassen Sie mich wissen, wenn Sie keine Screenshots erhalten.

+0

tut mir leid @radthey ich werde überprüfen und aktualisieren Sie .. mContentView ist eine android.view.SurfaceView oder RelativeLayout anzeigen. – Raj

+0

Dies ist die übergeordnete Ansicht, was immer Sie erfassen möchten. Wenn Sie beispielsweise nur die Oberflächenansicht erfassen möchten, können Sie die übergeordnete Ansicht dieser Oberflächenansicht als mContentView festlegen. mContentView ist meine Ansicht, die Sie entsprechend ändern können, die Sie erfassen möchten. – Radhey

+0

noch Screenshot schwarz. Bitte finden Sie oben, dass ich screenshot.thanks angehängt habe – Raj