2013-07-04 3 views
1

전 카메라를 사용하여 이미지를 캡처하고 모든 것이 작동하는 작업 코드를 가지고 있지만 이제는 다시 카메라 대신 이미지를 캡처하는 앞면 카메라을 추가하고 싶습니다.앞면 카메라를 사용하여 이미지 캡처

public class CameraExampleActivity extends Activity { 
Camera camera; 
Preview preview; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_camera_example); 

    preview = new Preview(this); 
    ((FrameLayout) findViewById(R.id.preview)).addView(preview); 
} 

public void click(View v) { 
    preview.camera.takePicture(shutterCallback, null, jpegCallback); 
} 

ShutterCallback shutterCallback = new ShutterCallback() 
{ 
    public void onShutter() 
    { 
     Log.d("Log", "Shuttered"); 
    } 
}; 

PictureCallback jpegCallback = new PictureCallback() 
{ 
    public void onPictureTaken(byte[] imgData, Camera camera) 
    { 
     //Compressing the image 640*480 
     //----------------------------------------- 
     Bitmap bmp=BitmapFactory.decodeByteArray(imgData, 0, imgData.length); 
     Bitmap resizedBmp = Bitmap.createScaledBitmap(bmp, 640, 480, false); 

     ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
     resizedBmp.compress(CompressFormat.PNG, 0, bos); 
     byte[] data = bos.toByteArray(); 
     //----------------------------------------- 


     File pictureFileDir = getDir(); 

     if (!pictureFileDir.exists() && !pictureFileDir.mkdirs()) { 

      Toast.makeText(CameraExampleActivity.this, "Can't create directory to save image.",Toast.LENGTH_LONG).show(); 
      return; 
     } 

     String photoFile = "MyPicture.jpg"; 
     String filename = pictureFileDir.getPath() + File.separator + photoFile; 
     File pictureFile = new File(filename); 

     try 
     { 
      FileOutputStream fos = new FileOutputStream(pictureFile); 
      fos.write(data); 
      fos.close(); 
      Toast.makeText(CameraExampleActivity.this, "New Image saved:" + filename,Toast.LENGTH_LONG).show(); 
     } 
     catch (Exception e) { 
      Log.d("Error",""+e); 
     } 
    } 
}; 

private File getDir() 
{ 
    File sdDir = Environment.getExternalStorageDirectory(); 
    return new File(sdDir, "Attendance Image"); 
} 
} 

미리보기 클래스

public class Preview extends SurfaceView implements SurfaceHolder.Callback { 
private static final String TAG = "Preview"; 

SurfaceHolder mHolder; 
public Camera camera; 

Preview(Context context) { 
    super(context); 

    // Install a SurfaceHolder.Callback so we get notified when the 
    // underlying surface is created and destroyed. 
    mHolder = getHolder(); 
    mHolder.addCallback(this); 
    mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
} 

public void surfaceCreated(SurfaceHolder holder) { 
    // The Surface has been created, acquire the camera and tell it where 
    // to draw. 
    camera = Camera.open(); 
    try { 
     camera.setPreviewDisplay(holder); 

     camera.setPreviewCallback(new PreviewCallback() { 

      public void onPreviewFrame(byte[] data, Camera arg1) { 

       FileOutputStream outStream = null; 
       try{ 
        outStream = new FileOutputStream("/sdcard/Image.jpg"); 
        outStream.write(data); 
        outStream.close(); 
       } catch (Throwable e){ 
        Log.d("CAMERA", e.getMessage()); 
       } 

       Preview.this.invalidate(); 
      } 
     }); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

public void surfaceDestroyed(SurfaceHolder holder) { 
    // Surface will be destroyed when we return, so stop the preview. 
    // Because the CameraDevice object is not a shared resource, it's very 
    // important to release it when the activity is paused. 
    camera.stopPreview(); 
    camera = null; 
} 

public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 
    // Now that the size is known, set up the camera parameters and begin 
    // the preview. 
    Camera.Parameters parameters = camera.getParameters(); 
    parameters.setPreviewSize(w, h); 
    camera.setParameters(parameters); 
    camera.startPreview(); 
} 

    } 

답변

4

보다는, 당신이 t open()의 버전을 사용할 필요가 Camera.open()를 사용 akes는 당신이 원하는 카메라의 ID입니다. 이 ID를 찾으려면, CameragetNumberOfCameras()를 호출들을 반복하고, 그 Camera.CameraInfo 표시가 전면라는 하나의 발견 :

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) { 
    Camera.CameraInfo info=new Camera.CameraInfo(); 

    for (int i=0; i < Camera.getNumberOfCameras(); i++) { 
    Camera.getCameraInfo(i, info); 

    if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) { 
     camera=Camera.open(i); 
    } 
    } 
} 

if (camera == null) { 
    camera=Camera.open(); 
} 
관련 문제