https://zhidao.baidu.com/question/873328177698804372.html
Android相機實時自動對焦的完美實現 http://blog.csdn.net/huweigoodboy/article/details/51378751
如何實現Android手機攝像頭的的自動對焦 http://www.open-open.com/lib/view/open1406536473812.html
android 前置攝像頭可以autofocus方法:
第一:最常見的實現---利用按鍵或拍照前一次性自動聚焦在Activity里申明變量private
AutoFocusCallback myAutoFocusCallback = null;然后
自動聚焦變量回調
myAutoFocusCallback = new AutoFocusCallback()
{
public void onAutoFocus(boolean success, Camera
camera) {
// TODO Auto-generated method stub
if(success)//success表示對焦成功
{
Log.i(tag, "myAutoFocusCallback:
success...");
//myCamera.setOneShotPreviewCallback(null);
}
else
{
//未對焦成功
Log.i(tag, "myAutoFocusCallback: 失敗了...");
}
}
};
在Camera.startPreview()之后,拍照Camera.takePicture()
之前調用myCamera.autoFocus(myAutoFocusCallback)。
第二:
通過TimerTask設置一個定時器來循環,每隔一定時間調用myCamera.autoFocus(myAutoFocusCallback)一次。結果是攝像頭一直在自我聚焦,重復清晰--模糊----清晰---模糊的過程。
第三:通過Handler和Thread,開啟一個線程進行自動聚焦。本質和第二種是一樣的。后續我會寫一個demo發上來。
第四:
通過監聽傳感器來觸發autoFocus。常用的是角度傳感器或加速度傳感器,當監聽的值超過一定閾值時觸發。這也是國外程序員們常用的思路。
第五:設置聚焦方式為myParam.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO);
Continuous auto focus mode intended for video
recording. The camera continuously tries to focus. This is the best
choice for video recording because the focus changes smoothly .
Applications still can call takePicture(Camera.ShutterCallback,
Camera.PictureCallback,
Camera.PictureCallback) in this mode
but the subject may not be in focus. Auto focus starts when the
parameter is set.
Since API level 14, applications can
call autoFocus(AutoFocusCallback) in
this mode. The focus callback will immediately return with a
boolean that indicates whether the focus is sharp or not. The focus
position is locked after autoFocus call. If applications want to
resume the continuous focus, cancelAutoFocus must be called.
Restarting the preview will not resume the continuous autofocus. To
stop continuous focus, applications should change the focus mode to
other modes.
意思是在錄像的時候調用這種聚焦方式好,在拍照情況下這種聚焦方式可能不成功。
設置之后myParam.set("rotation",
90);
這句話的設置不起作用。拍攝得到的照片和預覽的方向是錯90度的。需要得到Bitmap之后,利用Matrix自己旋轉下。
旋轉示例:mBitmap = BitmapFactory.decodeByteArray(data, 0,
data.length);//data是字節數據,將其解析成位圖myCamera.stopPreview();isPreview = false;
設置FOCUS_MODE_CONTINUOUS_VIDEO)之后,myParam.set("rotation",
90)失效。圖片竟然不能旋轉了,故這里要旋轉下
Matrix matrix = new Matrix();
matrix.postRotate((float)90.0);
Bitmap rotaBitmap = Bitmap.createBitmap(mBitmap,
0, 0, mBitmap.getWidth(), mBitmap.getHeight(), matrix,
false);
設置成FOCUS_MODE_CONTINUOUS_VIDEO之后,再調用Camera.autoFocus()會聚焦失敗。
第六: 就是通過分析onPreviewFrame得到預覽幀視頻,分析亮度變化,來觸Camera.autoFocus()。如果亮度變化,肯定是攝像頭和被拍攝物體之間發生了相對運動,需要觸發autoFocus()。某些手機里自帶的
拍照軟件可能就是采用這種方式。