2016-06-22 7 views
2

Я пытаюсь реализовать. Сделайте снимок экрана моей камеры. Поверхностный вид через код. Я могу делать это, но скриншот всегда выглядит черным. Вот код. Я искал много ссылок и реализовал свой код. но все же скриншот выглядит черным. как это решить. пожалуйста, направляйте меня. спасибоКак сделать снимок экрана для Android Surface view

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

У меня есть код вашего кода. это мой скриншот. enter image description here

это скриншот мой мобильный снимок экрана .. кнопка дома - кнопка скриншота. enter image description here

один раз кнопка щелкнув. что снимок экран будет черным фону, enter image description here

обновленного кодирование:

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

Отправлено на этот пост http://stackoverflow.com/questions/18289544/taking-screenshot-programmatically-doesnt-capture-the-contents-of-surfaceview – Radhey

+0

@Radhey Я пробовал это сообщение also.but screenshot black.please Направьте меня спасибо – Raj

+0

Я хотел бы снять снимок экрана для размещения отверстий, например, в виде камеры и наложения на камеру. – Raj

ответ

-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")); 

здесь mContentView является родительским видом вашей точки зрения поверхности. примените это и сообщите мне, если вы не получаете снимки экрана изображения.

+0

извините @radthey, я проверю и обновляю вас. MContentView - это андроид.SurfaceView или RelativeLayout. – Raj

+0

Это родительский вид, который вы хотите захватить, скажем, если вы хотите захватить только поверхностный вид, тогда вы можете установить родительский вид этого поверхностного вида как mContentView. mContentView - это мое мнение, которое вы можете изменить, соответственно, хотите захватить. – Radhey

+0

по-прежнему экран снимок черный. пожалуйста, найдите выше. Я добавил скриншот.thanks – Raj