2015-12-02 69 views
2

我正在嘗試進行自拍應用。 我拍攝的圖像,並保存從前置攝像頭。但是在圖庫或文件管理器中圖像沒有打開。 「無法加載圖像」此消息即將到來。如果我將前置攝像頭的標記更改爲後置攝像頭,它就完美了。Android Front相機圖像未正確保存

public class Preview extends SurfaceView implements SurfaceHolder.Callback { 

    private SurfaceHolder mHolder; 
    private Camera mCamera; 
    private Context context; 
    private String TAG = "Preview"; 

    public Preview(Camera mCamera, Context context) { 
     super(context); 

     this.mCamera = mCamera; 
     this.context = context; 

     mHolder = getHolder(); 
     mHolder.addCallback(this); 
     mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 

    } 

    @Override 
    protected void onLayout(boolean changed, int l, int t, int r, int b) { 

    } 

    @Override 
    public void surfaceCreated(SurfaceHolder mHolder) { 
     safeCameraOpen(); 
     if (mCamera != null) { 
      try { 
       mCamera.setPreviewDisplay(mHolder); 
       mCamera.startPreview(); 

      } catch (IOException e) { 
       Log.d(TAG, "Error setting camera preview: " + e.getMessage()); 
       mCamera.release(); 
       mCamera = null; 
      } 
     } else { 
      Log.d(TAG, "Error in camera : "); 
     } 
    } 

    @Override 
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 
     if (mCamera != null) { 
      setCameraDisplayOrientation((Activity) context, mCamera); 
     } 

    } 

    @Override 
    public void surfaceDestroyed(SurfaceHolder holder) { 
     releaseCameraAndPreview(); 
    } 

    // This method is called while clicking for selfie 
    public void captureImage() { 
     mCamera.takePicture(null, null, mPicture); 
    } 

    Camera.PictureCallback mPicture = new Camera.PictureCallback() { 
     @Override 
     public void onPictureTaken(byte[] data, Camera camera) { 
      saveImage(data); 
     } 
    }; 

    public void saveImage(byte[] data) { 
     try { 
      File imageFile = createImageFile(); 

      if (imageFile != null) { 
       FileOutputStream fos = new FileOutputStream(imageFile); 
       fos.write(data); 
       fos.close(); 
       Toast.makeText(context, "New Image saved", Toast.LENGTH_LONG).show(); 

      } else { 
       Toast.makeText(context, "Directory problem", Toast.LENGTH_LONG).show(); 

      } 
     } catch (Exception error) { 
      error.getMessage(); 
      Toast.makeText(context, "Image could not be saved.", Toast.LENGTH_LONG).show(); 
     } 
    } 

    private File createImageFile() throws IOException { 
     // Create an image file name 
     File storageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "Selfie"); 
     if (!storageDir.exists() && !storageDir.mkdirs()) { 

      Log.d(TAG, "Can't create directory to save image."); 
      Toast.makeText(context, "Can't create directory to save image.", Toast.LENGTH_LONG).show(); 
      return null; 

     } 
     File image = File.createTempFile(String.valueOf(System.currentTimeMillis()), /* prefix */ ".jpg", /* suffix */ storageDir /* directory */); 

     return image; 
    } 


    private boolean safeCameraOpen() { 
     boolean qOpened = false; 

     try { 
      releaseCameraAndPreview(); 
      mCamera = openFrontFacing(); 
      qOpened = (mCamera != null); 
     } catch (Exception e) { 

      e.printStackTrace(); 
     } 

     return qOpened; 
    } 

    public void releaseCameraAndPreview() { 
     // mPreview.setCamera(null); 
     if (mCamera != null) { 
      mCamera.stopPreview(); 
      mCamera.release(); 
      mCamera = null; 
     } 
    } 

    private Camera openFrontFacing() { 
     int cameraCount = 0; 
     Camera camera = null; 

     Camera.CameraInfo cameraInfo = new Camera.CameraInfo(); 
     cameraCount = Camera.getNumberOfCameras(); 
     for (int camIdx = 0; camIdx < cameraCount; camIdx++) { 
      Camera.getCameraInfo(camIdx, cameraInfo); 
      if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) { 
       try { 
        camera = Camera.open(camIdx); 
       } catch (RuntimeException e) { 
        Log.e(TAG, "Camera failed to open: " + e.getLocalizedMessage()); 
       } 
      } 
     } 

     return camera; 
    } 
} 
openFrontFacing()方法

如果我改變CAMERA_FACING_FRONTCAMERA_FACING_BACK它可以正常使用。

+1

嘗試在不同的設備上運行該應用程序 –

+0

謝謝,它在其他手機中工作。但是,您能否告訴我任何其他方式來處理其他設備或版本。 – sajal

+0

該特定設備可能存在一個錯誤...無法幫助代碼 –

回答

0

每臺相機都有一些支持的預覽尺寸和圖片尺寸,您必須設置正確的尺寸。它的主題稍長一點,搜索mCamera.getParameters()。getSupportedPictureSizes();和mCamera.getParameters()。getSupportedPreviewSizes();