2013-01-18 200 views
3

我有一个Activity调用另一个具有Camera Preview的类。 问题是,它打开后面的摄像头,我需要前面。 我怎么能做到这一点,在默认情况下,它会打开前端摄像头(我看着谷歌,但我试过的应用程序崩溃时,每当它打开)。 下面是活动时间:Android前置摄像头API

package com.elichai.tfillin; 

import android.app.Activity; 
import android.hardware.Camera; 
import android.os.Bundle; 
import android.widget.FrameLayout; 

public class CameraActivity extends Activity { 

    private Camera mCamera; 
    private CameraPreview mPreview; 

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

     mCamera = getCameraInstance(); 

     mPreview = new CameraPreview(this, mCamera); 
     FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview); 
     preview.addView(mPreview); 
    } 
    public static Camera getCameraInstance(){ 
     Camera c = null; 
     try { 
      c = Camera.open(); 
     } 
     catch (Exception e){ 
     } 
     return c; 
    } 

} 这里是其它类:

package com.elichai.tfillin; 

import java.io.IOException; 
import android.content.Context; 
import android.hardware.Camera; 
import android.hardware.Camera.CameraInfo; 
import android.util.Log; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 

public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback { 
    private SurfaceHolder mHolder; 
    private Camera mCamera; 
    int cameraId=0; 

    @SuppressWarnings("deprecation") 
    public CameraPreview(Context context, Camera camera) { 
     super(context); 
     mCamera = camera; 

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

    public void surfaceCreated(SurfaceHolder holder) { 
     try { 
      mCamera.setPreviewDisplay(holder); 
      mCamera.startPreview(); 
     } catch (IOException e) { 
     } 
    } 

    public void surfaceDestroyed(SurfaceHolder holder) { 
     mCamera.release(); 
    } 

public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 
    mCamera.setDisplayOrientation(90); 
    if (mHolder.getSurface() == null){ 
     return; 
    } 

    try { 
     mCamera.stopPreview(); 
    } catch (Exception e){ 
    } 

    try { 
     mCamera.setPreviewDisplay(mHolder); 
     mCamera.startPreview(); 

    } catch (Exception e){ 
    } 
} 

}

回答

7

您当前Camera.open()中没有任何参数,这意味着它会打开默认摄像头这几乎总是面向后方的。

您应该遍历可用的摄像头并找出面向前方的摄像头的ID并使用它来打开它。喜欢的东西:

private Camera openFrontFacingCamera() 
{ 
    int cameraCount = 0; 
    Camera cam = 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 { 
       cam = Camera.open(camIdx); 
      } catch (RuntimeException e) { 
       Log.e(TAG, "Camera failed to open: " + e.getLocalizedMessage()); 
      } 
     } 
    } 

    return cam; 
} 

然后按如下方式使用它在你的应用程序:

public static Camera getCameraInstance() { 
    Camera c = null; 
    try { 
     c = openFrontFacingCamera(); 
    } 
    catch (Exception e){ 
    } 
    return c; 
} 

看到所有这两种方法做的就是打开并返回相机例如,你可以很容易地通过直接简化代码呼叫openFrontFacingCamera()而不是getCameraInstance()

+0

谢谢!!!!,我想在屏幕中心从上到下画相机预览两行,我怎么做? – elichai2

+1

@ elichai2这与您当前的问题无关。请为此提出一个新问题,并让我们知道您尝试过的内容。 –

+0

还行,但是谢谢 – elichai2

1

你可以试试这个:

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

    return cam; 
} 

而且你还需要在menifest文件中添加权限相机。

<uses-permission android:name="android.permission.CAMERA" /> 
<uses-feature android:name="android.hardware.camera" android:required="false" /> 
<uses-feature android:name="android.hardware.camera.front" android:required="false" /> 
+0

http://adblogcat.com/a-camera-preview-with-a-bounding-box-like-google-goggles/或this http://stackoverflow.com/questions/7294748/how照相机顶部预览将对您有所帮助。 – Rahil2952

+0

谢谢。我会看看那里。 – elichai2

+0

你能举个例子吗?谢谢! – elichai2