安卓前置摄像头API

5
我有一个Activity调用另一个具有相机预览的类。 问题是它打开了后置摄像头,而我需要前置摄像头。 如何让默认情况下打开前置摄像头(我在Google上查找过,但无论我尝试什么,应用程序在打开时都会崩溃)。 以下是Activity代码:
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){
    }
}

}

2个回答

10

你当前的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()


谢谢!!!我想在相机预览中心从上到下画两条线,我该怎么做? - elichai2
1
@elichai2 这与您当前的问题无关。 请为此打开一个新问题,并让我们知道您尝试了什么。 - Raghav Sood

0
你可以尝试这个:
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;
}

你还需要在清单文件中添加相机的权限。

<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" />

这篇关于相机预览的文章可能对你有所帮助:http://adblogcat.com/a-camera-preview-with-a-bounding-box-like-google-goggles/ 或者这个问题的解答也可以:http://stackoverflow.com/questions/7294748/how-to-draw-on-top-of-camera-preview - baldguy
你能给我一个例子吗?谢谢! - elichai2
为什么uses-feature中需要设置android:required=false - Peter Zhu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接