Escaneo de códigos QR sin cámara de pantalla completa
Necesito explorar continuamente 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 cámara, pero no una vista previa de cámara 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 el nuevo código QR, se agrega a la lista.
- PhoneGap BarcodeScanner - ClassNotFound
- Zxing - Cambio de la vista de la cámara -90 grados
- Android: El código QR generado que usa Zxing tiene márgenes (no es apropiado para el área)
- Lectura de códigos de barras Delphi xe7, evento después de la intención que no desencadena
- Cómo reiniciar la cámara de manera eficiente en un fragmento - Barcode Scanner
¿Es posible?
- Escáner de código de barras ZXing para Webapps
- El uso del escáner de código de barras de Zxing causa la excepción de seguridad
- Cómo agregar un logotipo al código QR en android
- Android Genera código QR y código de barras usando Zxing
- Cómo activar el modo de escaneo masivo utilizando la biblioteca Zxing en mi aplicación para escanear códigos de barras múltiples y qrcodes sin mostrar una pantalla de vista previa
- Android con ZXing genera código QR
- Uso de ZXing para crear una aplicación de escaneo de códigos de barras Android
- Incorporar la biblioteca Zxing sin utilizar la aplicación Scanner de códigos de barras
No tengo un ejemplo completo, pero puedo darte fragmentos de un proyecto mío donde también pongo las previsualizaciones de cámara en una vista más pequeña que la pantalla completa. Sólo quiero transmitir la idea.
Lo que usted necesita es un FrameLayout que mantendrá 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 montar 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 puede 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 }
Espero que este trabajo con usted, Usted puede capturar la imagen desde el fondo sin necesidad de abrir la aplicación de la cámara
- Error de entrada con teclado en Galaxy S2 con jQuery Mobile y Phonegap
- Lista de clasificación de Android en orden alfabético