最近项目需要实现相机的自动对焦,一开始没有什么思路,后来通过查阅资料发现可以例用传感器来通知相机进行对焦,特此记录一下,话不多说,直接上代码:
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() {
//检查访问摄像头权限
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, 100);
} else {
//拥有权限
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);
//关闭相机自带的自动对焦
camera.cancelAutoFocus();
//启用传感器辅助自动对焦
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对象
*/
Camera mCamera;
/**
* 传感管理器
*/
private SensorManager mSensorManager;
/**
* x/y/z轴的加速度数值
*/
private float[] accelerate = new float[3];
private final float alpha = 0.8f;
public SensorCameraHelper(Camera camera, Context context) {
mCamera = camera;
mContext = context;
init();
registerSensorUtil(); //注册需要监听的传感器类型
}
private void registerSensorUtil() {
mSensorManager.registerListener(this,
mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), //传感器TYPE类型:加速度
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", "对焦成功");
} else {
Log.d("fxh", "对焦失败");
}
}
});
}
break;
default:
break;
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int i) {
}
}
activity_main.xml
android:id="@+id/surfaceview"
android:layout_width="match_parent"
android:layout_height="match_parent">
在此感谢
给予的指导