最近項(xiàng)目需要實(shí)現(xiàn)相機(jī)的自動(dòng)對(duì)焦,一開(kāi)始沒(méi)有什么思路,后來(lái)通過(guò)查閱資料發(fā)現(xiàn)可以例用傳感器來(lái)通知相機(jī)進(jìn)行對(duì)焦,特此記錄一下,話(huà)不多說(shuō),直接上代碼:
MainActivity.class
public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback {
/**
* 用于展示的surfaceView
*/
private SurfaceView surfaceView;
private SurfaceHolder surfaceHolder;
private Camera camera;
SensorCameraHelper helper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
permissionCheck();
}
private void permissionCheck() {
//檢查訪問(wèn)攝像頭權(quán)限
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, 100);
} else {
//擁有權(quán)限
initCameraView();
}
}
private void initCameraView() {
surfaceView = findViewById(R.id.surfaceview);
surfaceHolder = surfaceView.getHolder();
surfaceHolder.addCallback(this);
}
@Override
public void surfaceCreated(final SurfaceHolder surfaceHolder) {
new Thread(new Runnable() {
@Override
public void run() {
try {
if (camera == null)
camera = Camera.open(0);
//關(guān)閉相機(jī)自帶的自動(dòng)對(duì)焦
camera.cancelAutoFocus();
//啟用傳感器輔助自動(dòng)對(duì)焦
helper = new SensorCameraHelper(camera, MainActivity.this);
camera.setPreviewDisplay(surfaceHolder);
camera.setPreviewCallback(new Camera.PreviewCallback() {
@Override
public void onPreviewFrame(byte[] data, Camera camera) {
}
});
camera.setDisplayOrientation(90);
camera.startPreview();
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
@Override
public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {
}
@Override
public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
}
}
SensorCameraHelper.class
public class SensorCameraHelper implements SensorEventListener {
/**
* 上下文
*/
Context mContext;
/**
* Camera對(duì)象
*/
Camera mCamera;
/**
* 傳感管理器
*/
private SensorManager mSensorManager;
/**
* x/y/z軸的加速度數(shù)值
*/
private float[] accelerate = new float[3];
private final float alpha = 0.8f;
public SensorCameraHelper(Camera camera, Context context) {
mCamera = camera;
mContext = context;
init();
registerSensorUtil(); //注冊(cè)需要監(jiān)聽(tīng)的傳感器類(lèi)型
}
private void registerSensorUtil() {
mSensorManager.registerListener(this,
mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), //傳感器TYPE類(lèi)型:加速度
SensorManager.SENSOR_DELAY_UI); //采集頻率
}
private void init() {
mSensorManager = (SensorManager) mContext.getSystemService(SENSOR_SERVICE);
}
@Override
public void onSensorChanged(SensorEvent sensorEvent) {
switch (sensorEvent.sensor.getType()) {
case Sensor.TYPE_ACCELEROMETER: //加速度傳感器
accelerate[0] = alpha * accelerate[0] + (1 - alpha) * sensorEvent.values[0];
accelerate[1] = alpha * accelerate[1] + (1 - alpha) * sensorEvent.values[1];
accelerate[2] = alpha * accelerate[2] + (1 - alpha) * sensorEvent.values[2];
if ((Math.abs(sensorEvent.values[0] - accelerate[0]) > 0.5) ||
(Math.abs(sensorEvent.values[1] - accelerate[1]) > 0.5) ||
(Math.abs(sensorEvent.values[2] - accelerate[2]) > 0.5)) {
mCamera.autoFocus(new Camera.AutoFocusCallback() {
@Override
public void onAutoFocus(boolean b, Camera camera) {
if (b) {
Log.d("fxh", "對(duì)焦成功");
} else {
Log.d("fxh", "對(duì)焦失敗");
}
}
});
}
break;
default:
break;
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int i) {
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<SurfaceView xmlns:android="http:// schemas.android.com/apk/res/android"
android:id="@+id/surfaceview"
android:layout_width="match_parent"
android:layout_height="match_parent">
</SurfaceView>
在此感謝
https://blog.csdn.net/huweigoodboy/article/details/51378751
https://blog.csdn.net/android_aistudy/article/details/77990019
給予的指導(dǎo)