2015-04-28 5 views
1

Я пытаюсь сделать снимок экрана SurfaceView, но он всегда является результатом черного экрана. Я искал, но все решения, которые я нашел, не работают на меня. Это мой код.Снимок экрана SurfaceView в Android

Это метод, который я называю, чтобы сделать снимок экрана

private void takePicture(){ 
     if(camera!=null) { 
      camera.takePicture(null, null, jpgCb); 
     } 
    } 

Это Jpg CallBack

jpgCb=new Camera.PictureCallback() { 
     @Override 
     public void onPictureTaken(final byte[] data, final Camera camera) { 
      btnAccept.setVisibility(View.VISIBLE); 
      btnCancel.setVisibility(View.VISIBLE); 
      btnFlash.setEnabled(false); 

      btnAccept.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 

        stopCamera(); 
        new AsyncTask<byte[], String, Void>() { 
         @Override 
         protected void onPreExecute() { 
          progressDialog=new ProgressDialog(CameraActivity.this); 
          progressDialog.setCancelable(false); 
          progressDialog.setTitle(getResources().getString(R.string.saving_process)); 
          progressDialog.show(); 
         } 

         @Override 
         protected void onProgressUpdate(String... values) { 
          progressDialog.setMessage(values[0]); 
         } 

         @Override 
         protected Void doInBackground(byte[]... params) { 
          byte[] data=params[0]; 

          File fileDir=new File(Environment.getExternalStorageDirectory().getAbsolutePath() +File.separator+"folder"+File.separator+folderName); 

          if (!fileDir.exists()) 
           fileDir.mkdirs(); 

          File tmpFile=new File(fileDir,"tmpFile.jpeg"); 

          try{ 
           FileOutputStream fos=new FileOutputStream(tmpFile); 
           fos.write(data); 
           fos.close(); 
          }catch (FileNotFoundException e){ 
           Toast.makeText(getApplicationContext(),"Error",Toast.LENGTH_SHORT).show(); 
          }catch (IOException e){ 
           Toast.makeText(getApplicationContext(),"Error",Toast.LENGTH_SHORT).show(); 
          } 


          BitmapFactory.Options options=new BitmapFactory.Options(); 
          options.inPreferredConfig = Bitmap.Config.ARGB_8888; 

          tmpFile.delete(); 
          takeScreenshot(); 

          return null; 
         } 

         @Override 
         protected void onPostExecute(Void aVoid) { 
          super.onPostExecute(aVoid); 

          try{ 
           pics=loadPics(); 
           setGallery(); 
          }catch (NullPointerException e){ 
           e.printStackTrace(); 
          } 

          Toast.makeText(getApplicationContext(),getResources().getString(R.string.image_saved),Toast.LENGTH_SHORT).show(); 

          if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE){ 
           startCamera(w,h); 
          }else 
           startCamera(); 
          btnAccept.setVisibility(View.GONE); 
          btnCancel.setVisibility(View.GONE); 
          btnFlash.setEnabled(true); 
          progressDialog.dismiss(); 
         } 
        }.execute(data); 
       } 
      }); 

      btnCancel.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        stopCamera(); 
        if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE){ 
         startCamera(w,h); 
        }else 
         startCamera(); 
        btnAccept.setVisibility(View.GONE); 
        btnCancel.setVisibility(View.GONE); 
        btnFlash.setEnabled(true); 
       } 
      }); 
     } 
    }; 

И это метод, который я называю в функцию обратного вызова, который действительно снимает скриншот

public void takeScreenshot(){ 
    cameraContainer.setDrawingCacheEnabled(true); 
    cameraContainer.buildDrawingCache(true); 
    Bitmap bmp=Bitmap.createBitmap(cameraContainer.getDrawingCache()); 
    cameraContainer.setDrawingCacheEnabled(false); 
    ByteArrayOutputStream bos=new ByteArrayOutputStream(); 
    bmp.compress(Bitmap.CompressFormat.JPEG,qualityValue,bos); 
    byte[] bitmapData=bos.toByteArray(); 
    ByteArrayInputStream fis=new ByteArrayInputStream(bitmapData); 

    String fileName=System.currentTimeMillis()+".jpeg"; 
    File fileDir=new File(Environment.getExternalStorageDirectory().getAbsolutePath() +File.separator+"folder"+File.separator+folderName); 

    if (!fileDir.exists()) 
     fileDir.mkdirs(); 

    try{ 
     File tmpFile=new File(fileDir,fileName); 
     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(); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

С этим я могу сохранить «SurfaceView content» в файле и сохранить его, но контент полностью черный.

PS: Это вопрос, который я больше всего найти при попытке решить мою проблему (на самом деле, метод «takeScreenshot» от этого ответа)

EDIT: Это метод stopCamera

private void stopCamera(){ 
    camera.setPreviewCallback(null); 
    camera.stopPreview(); 
    camera.release(); 
    camera=null; 
} 
+0

отредактируйте и добавьте исходный код stopCamera –

+0

Возможный дубликат http://stackoverflow.com/questions/27817577/android-take-screenshot-of-surface-view-shows-black-screen/ – fadden

ответ

0

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

Что бы вы хотели достичь, во всяком случае? У вас уже есть фотография, сохраненная в файле, не так ли?

Смежные вопросы