[英]Android Auto focus doesn't work after creating camera view
我正在嘗試創建自己的相機視圖,除了自動對焦之外我還能正常工作,我似乎無法弄清楚為什么它不起作用。 這是我的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" />
如果你在你的清單中添加了<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宏(特寫)對焦模式。
//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);
以下是一些選項:
用戶arsalank2建議使用本答案中描述的“連續自動對焦”。 但是,似乎有些HTC設備不支持此功能。 檢查: parameters.getSupportedFocusModes().contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO)
您可以實現onSensorChanged
偵聽器,並在滿足某些條件時使用回調進行關注, 請參閱 Juan Acevedo的 回答 。
以不同方式處理每種情況,以支持最廣泛的設備。 檢查哪些適用於不同設備的不同型號,因為您無法完全依賴API級別所實現的內容。
我建議使用選項3,因為似乎沒有適用於每個設備的方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.