p20 - mejor lector qr android 2019
Escaneo de códigos QR sin cámara de pantalla completa (2)
Espero que esto funcione contigo, puedes capturar imágenes desde el fondo sin abrir la aplicación de la cámara
https://stackoverflow.com/a/24849344/1312796
Necesito escanear continuamente los códigos QR en mi aplicación de Android mientras la Vista principal de la aplicación está en la pantalla. La vista principal debe contener una ventana con vista previa de la cámara, pero no una vista previa de la cámara a pantalla completa.
Un ejemplo de uso: Vista principal que contiene una lista de códigos QR escaneados y una vista previa de la cámara. Cuando se escanea un nuevo código QR, se agrega a la lista.
¿Es posible?
No tengo un ejemplo completo, pero puedo darte fragmentos de un proyecto mío donde también coloco las vistas previas de la cámara en una vista más pequeña que la pantalla completa. Solo quiero transmitir la idea.
Lo que necesitas es un FrameLayout que contendrá la vista previa de la cámara
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/absoluteLayout1"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@android:color/transparent"
android:orientation="vertical" >
<FrameLayout
android:id="@+id/camera_preview"
android:layout_width="200dp"
android:layout_height="200dip" >
</FrameLayout>
</RelativeLayout>
Ahora necesitamos un PreviewListener que también es una vista
import java.io.IOException;
import android.content.Context;
import android.hardware.Camera;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
/** A basic Camera preview class */
public class CameraPreviewListener extends SurfaceView implements SurfaceHolder.Callback {
private SurfaceHolder mHolder;
private Camera mCamera;
public CameraPreviewListener(Context context, Camera camera) {
super(context);
mCamera = camera;
// Install a SurfaceHolder.Callback so we get notified when the
// underlying surface is created and destroyed.
mHolder = getHolder();
mHolder.addCallback(this);
// deprecated setting, but required on Android versions prior to 3.0
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
public void surfaceCreated(SurfaceHolder holder) {
// The Surface has been created, now tell the camera where to draw the preview.
mCamera.setPreviewDisplay(holder);
mCamera.startPreview();
}
public void surfaceDestroyed(SurfaceHolder holder) {
// Take care of releasing the Camera preview in your activity.
Log.d("camera", "surfaceDestroyed");
if(holder.equals(mHolder)){
holder.removeCallback(this);
}else{
holder.removeCallback(this);
mHolder.removeCallback(this);
}
}
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
// If your preview can change or rotate, take care of those events here.
// Make sure to stop the preview before resizing or reformatting it.
if (mHolder.getSurface() == null){
// preview surface does not exist
return;
}
// stop preview before making changes
try {
mCamera.stopPreview();
} catch (Exception e){
e.printStackTrace();
// ignore: tried to stop a non-existent preview
}
// set preview size and make any resize, rotate or
// reformatting changes here
// start preview with new settings
try {
mCamera.setPreviewDisplay(mHolder);
mCamera.startPreview();
} catch (Exception e){
Log.d("camera", "Error starting camera preview: " + e.getMessage());
}
}
public void removeCallback(){
mHolder = getHolder();
mHolder.removeCallback(this);
}
}
Finalmente necesitas ensamblar todo en tu actividad.
import android.hardware.Camera;
Camera mCamera = = getCameraInstance();
CameraPreviewListener cpl = new CameraPreviewListener(this, mCamera);
FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview);
preview.addView(cpl);
Para obtener la cámara puedes utilizar el siguiente método.
/** A safe way to get an instance of the Camera object. */
public Camera getCameraInstance() {
Camera c = null;
try {
c = Camera.open(); // attempt to get a Camera instance
Parameters p = c.getParameters();
List<Size> sizes = p.getSupportedPictureSizes();
Size x = null;
if (sizes.size() < 1) {
throw new Exception("there are not supported picture sizes at all !!!");
}
for (Size s : sizes) {
if (s.width == 640 && s.height == 480) {
x = s;
}
}
if (x == null) {
x = sizes.get(0);
p.setPictureSize(x.width, x.height);
} else {
p.setPictureSize(640, 480);
}
p.setJpegQuality(20);
p.setGpsLatitude(MapViewer.latitude);
p.setGpsLongitude(MapViewer.longitude);
c.setParameters(p);
} catch (Exception e) {
// Camera is not available (in use or does not exist)
Log.d(TAG + "(getCameraInstance)", e.getMessage());
}
return c; // returns null if camera is unavailable
}