Suj*_*uji 6 java android android-camera
我正在尝试创建自己的相机视图,除了自动对焦之外我还能正常工作,我似乎无法弄清楚为什么它不起作用.这是我的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;
}
}
Run Code Online (Sandbox Code Playgroud)
在我的清单中,我有以下内容:
<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" />
Run Code Online (Sandbox Code Playgroud)
如果你添加<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);
}
Run Code Online (Sandbox Code Playgroud)
然后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();
}
Run Code Online (Sandbox Code Playgroud)
你可以选择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宏(特写)对焦模式.
小智 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);
Run Code Online (Sandbox Code Playgroud)
以下是一些选项:
\n\n用户arsalank2建议使用“连续自动对焦”,如此答案中所述。不过,似乎某些 HTC 设备不支持此功能。检查:\nparameters.getSupportedFocusModes().contains(Camera.Parameters.FOCUS_MODE_CONTIN\xe2\x80\x8c\xe2\x80\x8bUOUS_VIDEO)
您可以实现一个onSensorChanged侦听器,并在满足某些条件时通过回调来聚焦,请参阅Juan Acevedo的回答。
以不同的方式处理每种情况,以支持尽可能广泛的设备。检查哪些内容适用于不同设备的不同型号,因为您不能完全依赖 API 级别所说的实现内容。
我建议使用选项 3,因为似乎没有一种方法适用于所有设备。
\n| 归档时间: |
|
| 查看次数: |
9737 次 |
| 最近记录: |