Cómo lograr el enfoque automático en las cámaras de teléfonos Android
Según información en Internet, existen las siguientes:
1. El enfoque de las personas extremas: usar un cronómetro, establecer un tiempo fijo y luego continuar concentrándose.
2 Enfoque de los geeks: usar la capa de controlador para implementar, pero la mayoría de la gente todavía lo olvida.
3 En cuanto a mí, una persona vaga: observando la cámara nativa del sistema, sé que esto no requiere un temporizador, y parece imposible que sea lo suficientemente complicado como para implementarlo con un controlador. Incluso si la capa inferior se implementa en C, en teoría, Google definitivamente proporcionará este material empaquetado. Así que fui decididamente a buscar el DOC y encontré esto: El código es el siguiente.
[java] ¿Ver Plaincopyprint?
& ltstrong & gt& ltspan style = " font-size:18px " >La clase pública MainActivity extiende la actividad {
SurfaceView privado SurfaceView
Accesorio de superficie especializado;
Indicador booleano privado = false;
Cadena privada fileUrl =
Cámara cámara;
Cámara. Parámetros de parámetro;
@override
Nulo protegido onCreate(Estado de instancia guardado del paquete){
super oncreate(savedInstanceState);
setContentView. (r . diseño . actividad _ principal);
vista de superficie =(vista de superficie)findViewById(r . id . vista de superficie 1);
Botón Botón =(Botón) findViewById( r . id . tomar foto);
soporte de superficie = vista de superficie .
búfer de empuje de tipo de superficie);
soporte de superficie . setkeepscreenon(true);
vista de superficie setfocusable(true);
establecer color de FONDO (. TRIM _ MEMORY _ BACKGROUND);
titular de superficie . add Callback(new Callback(){
@OVERLAY
Destruir superficie vacía pública (titular de superficie (o ){
//TODO código auxiliar de método generado automáticamente
cámara. detener vista previa();
liberación de cámara();
Camera=null;
}
@overlay
superficie vacía pública creada (soporte de superficie){
// TODO método generado automáticamente stub
if(null==camera){
camera = camera . open();
prueba {
camera . (soporte de superficie);
iniciar cámara();
cámara iniciar vista previa()
} captura (IOException e) { p>
//TODO bloque de captura generado automáticamente
e.printstacktrace();
}
}
}
@Overlay
Superficie vacía pública modificada (soporte de superficie, formato int, ancho int, alto int){
//Lograr enfoque automático
p>camera.autoFocus(new AutoFocusCallback() {
@override
public void onAutoFocus(éxito booleano, cámara cámara){
if (éxito) {
init camera(); // Implementar la inicialización de los parámetros de la cámara
camera . cancelautofocus(); // Solo agregando esta oración se logrará la implementación automática.
}
}
});
}
});
}
//Configuración de inicialización de los parámetros de la cámara
Private void initCamera()
{
parámetros = cámara obtener parámetros(. );
parámetros . setpictureformat(formato de píxeles. JPEG);
//parameters . setpicturesize(vista de superficie. getwidth(), vista de superficie. getheight()); Los teléfonos personalizados no pueden reconocer este método correctamente.
parameters.setFlashMode(parameters. FLASH _ MODE _ TORCH
parameters.setFocusMode(Camera.
Parámetros. FOCUS _ MODE _ continuo _ PICTURE); //1 enfoque continuo
setDispaly(parámetros, cámara);
camera.setParameters(parámetros);
camera.start previo();
camera. cancelautofocus(); // 2 Si desea lograr un enfoque automático, debe agregar esta oración.
}
//Controla la dirección de visualización correcta de la imagen
Private void setDispaly(parámetro cámara.parametro, cámara cámara)
{
if (Integer.parseInt(Build.VERSION.SDK)>= 8){
setDisplayOrientation(cámara, 90°);
}
De lo contrario{
parámetros establecidos en rotación(90);
}
}
//Pantalla Imagen implementada correctamente
private void setDisplayOrientation(Camera Camera, int i) {
Método polimorfismo descendente;
Prueba {
polimorfismo descendente = cámara. getclass(). get método(" setDisplayOrientation ", nueva Clase[]{ int . Clase });
if (downPolymorphic!=null) {
downPolymorphic.invoke(camera, nuevo Objeto[] { I });
}
}
Captura (Excepción e){
Log.e ("camel _ e " , "Error de imagen");
}
}
@override
público booleano onCreateOptionsMenu(menú menú){
//Inflar menú; esto agregará el elemento a la barra de acciones si existe.
getMenuInflater(). inflate(R.menu.main, menu);
Devuelve verdadero
}
} & lt/span>. </strong>