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.

¿Es posible?

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

https://stackoverflow.com/a/24849344/1312796

  • ZXing Lector de código de barras: ¿Cómo hacer frontera personalizada alrededor de la pantalla de captura?
  • Incorporación de ZXing en la aplicación de Android
  • ¿Puedo controlar la linterna sin usar android.hardware.Camera?
  • Cómo cambiar correctamente el nombre del paquete en AndroidManifest.xml (por ejemplo, en el proyecto zxing / barcodescanner)
  • ¿Cómo forzar el uso de zxing lib con sólo mi aplicación?
  • Orientación de Android zxing: ResultMetaData es null, Get Rotation / Orientation
  • Crear un código QR y mostrarlo en ImageView
  • Uso de zxing Barcode Scanner dentro de una página web
  • ¿Puedo usar Zxing para fines comerciales?
  • ZXing Android Generar código de barras 1D
  • Zxing usando diseño personalizado
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.