我正在尝试创建自己的相机视图,除了自动对焦之外我还能正常工作,我似乎无法弄清楚它为何无法工作。这是我的CameraView.java代码
public class CameraView extends SurfaceView implements SurfaceHolder.Callback {
private SurfaceHolder surface_Holder;
private Camera main_Camera;
boolean on;
public CameraView(Context context, Camera camera){
super(context);
main_Camera = camera;
main_Camera.setDisplayOrientation(90);
surface_Holder = getHolder();
surface_Holder.addCallback(this);
surface_Holder.setType(SurfaceHolder.SURFACE_TYPE_NORMAL);
}
public boolean isOn(){
return on;
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
try{
main_Camera.setPreviewDisplay(holder);
main_Camera.startPreview();
}catch (Exception e){
Log.d("Error", "Canmera error on surfaceCreated" + e.getMessage());
main_Camera.release();
main_Camera = null;
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
if(holder.getSurface()==null){
return;
}
try{
main_Camera.stopPreview();
}catch (Exception e){
}
try{
main_Camera.setPreviewDisplay(surface_Holder);
main_Camera.startPreview();
}catch (IOException e){
Log.d("Error", "Camera error on surfaceChanged " + e.getMessage());
}
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
main_Camera.setPreviewCallback(null);
main_Camera.stopPreview();
main_Camera.release();
main_Camera= null;
}
}
在我的清单中,我有以下内容:
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
答案 0 :(得分:8)
如果您在清单中添加<uses-feature android:name="android.hardware.camera.autofocus" />
,则表示相机不会autofocus
。这意味着您允许您的应用程序使用相机硬件或处理自动对焦的软件。
声明的目的是通知任何外部实体您的应用程序所依赖的硬件和软件功能集。
要将相机设置为焦点,可以将此方法添加到CameraView
类:
private void setFocus(String mParameter) {
Camera.Parameters mParameters = mCamera.getParameters();
mParameters.setFocusMode(mParameter);
mCamera.setParameters(mParameters);
}
然后在surfaceChanged()
中调用此方法,如下所示:
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
...//your code here
// Set focus mode to continuous picture
setFocus(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
// Start camera preview
mCamera.startPreview();
}
您可以选择以下focus parameters
:
String FOCUS_MODE_AUTO自动对焦模式。
String FOCUS_MODE_CONTINUOUS_PICTURE连续自动对焦模式 用于拍照。
String FOCUS_MODE_CONTINUOUS_VIDEO打算使用连续自动对焦模式 用于视频录制。
String FOCUS_MODE_EDOF扩展景深(EDOF)。
字符串FOCUS_MODE_FIXED焦点已修复。
String FOCUS_MODE_INFINITY焦点设置为无穷大。
String FOCUS_MODE_MACRO微距(特写)对焦模式。
答案 1 :(得分:5)
//set camera to continually auto-focus
Camera.Parameters params = c.getParameters();
//*EDIT*//params.setFocusMode("continuous-picture");
//It is better to use defined constraints as opposed to String, thanks to AbdelHady
params.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
c.setParameters(params);
答案 2 :(得分:1)
以下是一些选项:
用户arsalank2建议使用&#34;连续自动对焦&#34;如this answer中所述。但是,似乎有些HTC设备不支持此功能。检查:
parameters.getSupportedFocusModes().contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO)
您可以实施onSensorChanged
监听器,并在满足特定条件时关注回调,see this answer Juan Acevedo。
以不同方式处理每种情况,以支持最广泛的设备。检查哪些适用于不同设备的不同型号,因为您可以完全依赖API级别所说的内容。
我建议使用选项3,因为似乎没有适用于每个设备的方法。