2013-03-21 116 views
0

我正在开发一个android应用程序。我正在使用相机捕捉图像。我正在使用下面的代码打开相机。问题是,摄像机视图在执行后不能打开camera = Camera.open(cameraId)。单击“制作照片”后,只有相机指示灯已打开(相机视图未打开)。我如何显示相机视图?Android摄像头视图未打开

在MakePhotoActivity.java,

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

     // do we have a camera? 
     if (!getPackageManager() 
       .hasSystemFeature(PackageManager.FEATURE_CAMERA)) { 
      Toast.makeText(this, "No camera on this device", Toast.LENGTH_LONG) 
        .show(); 
     } else { 
      cameraId = findFrontFacingCamera(); 
      if (cameraId < 0) { 
       Toast.makeText(this, "No front facing camera found.", 
         Toast.LENGTH_LONG).show(); 
      } else { 
       camera = Camera.open(cameraId); 
      } 
     } 
    } 

public void onClick(View view) { 
     camera.takePicture(null, null, 
       new PhotoHandler(getApplicationContext())); 
    } 

main.xml中,

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 

    <Button 
     android:id="@+id/captureFront" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerInParent="true" 
     android:onClick="onClick" 
     android:text="Make Photo" /> 

</RelativeLayout> 
+0

你尝试过这一些其他的设备上?它可能是您的设备问题 – 2013-03-21 18:55:56

+0

感谢您的答复。我也检查过仿真器,android平板电脑,HTC手机。但相机视图不能打开。 – Manoj 2013-03-21 19:33:54

回答

1

此代码是否帮助?

这是因为虽然面对镜头前。

import android.hardware.Camera; 
import android.hardware.Camera.CameraInfo; 
import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.Toast; 

public class VideoFragment extends Fragment { 

private static final String TAG = "VideoFragment"; 
private SurfaceView preview; 
private SurfaceHolder previewHolder; 
private Camera camera = null; 
private boolean cameraConfigured = false; 
private boolean inPreview = false; 
private int frontFacingCameraID; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    frontFacingCameraID = findFrontFacingCamera(); 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 

    View view = inflater.inflate(R.layout.video, container, false); 

    preview = (SurfaceView) view.findViewById(R.id.surfaceView1); 
    previewHolder = preview.getHolder(); 
    previewHolder.addCallback(surfaceCallback); 

    return view; 
} 

private int findFrontFacingCamera() { 
    int cameraId = -1; 
    // Search for the front facing camera 
    int numberOfCameras = Camera.getNumberOfCameras(); 
    for (int i = 0; i < numberOfCameras; i++) { 
     CameraInfo info = new CameraInfo(); 
     Camera.getCameraInfo(i, info); 
     if (info.facing == CameraInfo.CAMERA_FACING_FRONT) { 
      Log.d(TAG, "Camera found"); 
      cameraId = i; 
      break; 
     } 
    } 
    return cameraId; 
} 

@Override 
public void onResume() { 
    super.onResume(); 

    camera = Camera.open(frontFacingCameraID); 
    startPreview(); 
} 

@Override 
public void onPause() { 
    if (inPreview) { 
     camera.stopPreview(); 
    } 

    camera.release(); 
    camera = null; 
    inPreview = false; 

    super.onPause(); 
} 

private SurfaceHolder.Callback surfaceCallback = new SurfaceHolder.Callback() { 

    @Override 
    public void surfaceDestroyed(SurfaceHolder holder) { 
     // no-op 
    } 

    @Override 
    public void surfaceCreated(SurfaceHolder holder) { 
     // no-op -- wait until surfaceChanged() 
     // TODO understand why this has to be NO-OP 

    } 

    @Override 
    public void surfaceChanged(SurfaceHolder holder, int format, int width, 
      int height) { 
     // TODO understand why these methods have to be called in this 
     // callback method 
     initPreview(width, height); 
     startPreview(); 
    } 
}; 

private void initPreview(int width, int height) { 
    if (camera != null && previewHolder.getSurface() != null) { 
     try { 
      camera.setPreviewDisplay(previewHolder); 
     } catch (Throwable t) { 
      Log.e("PreviewDemo-surfaceCallback", 
        "Exception in setPreviewDisplay()", t); 
      Toast.makeText(getActivity(), t.getMessage(), Toast.LENGTH_LONG) 
        .show(); 
     } 

     if (!cameraConfigured) { 
      Camera.Parameters parameters = camera.getParameters(); 
      Camera.Size size = getBestPreviewSize(width, height, parameters); 

      if (size != null) { 
       parameters.setPreviewSize(size.width, size.height); 
       camera.setParameters(parameters); 
       cameraConfigured = true; 
      } 
     } 
    } 
} 

private void startPreview() { 
    if (cameraConfigured && camera != null) { 
     camera.startPreview(); 
     inPreview = true; 
    } 
} 

private Camera.Size getBestPreviewSize(int width, int height, 
     Camera.Parameters parameters) { 
    Camera.Size result = null; 

    for (Camera.Size size : parameters.getSupportedPreviewSizes()) { 
     if (size.width <= width && size.height <= height) { 
      if (result == null) { 
       result = size; 
      } else { 
       int resultArea = result.width * result.height; 
       int newArea = size.width * size.height; 

       if (newArea > resultArea) { 
        result = size; 
       } 
      } 
     } 
    } 

    return (result); 
} 
} 
+0

感谢您的回复。我将使用此代码。 – Manoj 2013-03-21 19:32:08