Autore Topic: App Scanner QR Code  (Letto 1207 volte)

Offline Neoxxx

  • Translate Team
  • Utente junior
  • **
  • Post: 114
    • Mostra profilo
  • Dispositivo Android:
    HTC Desire
  • Sistema operativo:
    Windows 7
App Scanner QR Code
« il: 10 Novembre 2014, 16:12:34 CET »
Ciao a tutti, spero sia la sezione giusta,
devo realizzare una semplice ma ovviamente funzionante app per la lettura dei QR Code usando librerie open source.

Avete qualche suggerimento su come procedere?


Grazie mille

Offline Aaaaabbbb

  • Utente junior
  • **
  • Post: 55
    • Google+
    • pietmau
    • Mostra profilo
  • Dispositivo Android:
    Nexus 7, Samsung GT-S5830i, LG Optimus, Galaxy Tab 3
  • Play Store ID:
    aaaaaaaaaaaa
  • Sistema operativo:
    Win, Ubuntu
Re:App Scanner QR Code
« Risposta #1 il: 10 Novembre 2014, 16:24:54 CET »
Ciao,
Guarda ho recentemente fatto un paio di applicazioni proprio di questo tipo.
Puoi usare Zxing o Zbar.
Soni un po' diverse ma funzionano benissimo entrambe.
Con Zbar puoi incorporare lo scanner nella tua appicazione, con Zxing è un po' più compleeso integrare direttmanete lo scanner ma è facile richiamare con un intent l'applicazione che provvede ad effettuare la scansione e a ritornare il risultato.

Ciao!

Offline Neoxxx

  • Translate Team
  • Utente junior
  • **
  • Post: 114
    • Mostra profilo
  • Dispositivo Android:
    HTC Desire
  • Sistema operativo:
    Windows 7
Re:App Scanner QR Code
« Risposta #2 il: 10 Novembre 2014, 16:48:21 CET »
Ciao, si in effetti avevo visto anche io queste 2 librerie ma a causa della poca documentazione non ci ho capito molto.
Conosco abbastanza bene Java anche se è un po che non lo uso ma sono totalmente nuovo di Android, Zxing mi è sembrata un po troppo complicata con moltissime classi e senza documentazione non riuscirò mai a capirci qualcosa, Zbar invece ho visto che è per Ios. C'è anche per android?

Comunque se mi potessi linkare qualche tutorial o comunque dove ti sei informato mi faresti un grandissimo favore

Offline Aaaaabbbb

  • Utente junior
  • **
  • Post: 55
    • Google+
    • pietmau
    • Mostra profilo
  • Dispositivo Android:
    Nexus 7, Samsung GT-S5830i, LG Optimus, Galaxy Tab 3
  • Play Store ID:
    aaaaaaaaaaaa
  • Sistema operativo:
    Win, Ubuntu
Re:App Scanner QR Code
« Risposta #3 il: 10 Novembre 2014, 16:52:31 CET »
Ciao,
Allora usare Zxing è facilissimo se non vuoi integrare direttamente lo scanner nella tua applicazione, basta un intent, e lei fa tutto.

Altrettanto facile è usare Zbar, non è documentata, ma non ci vuole chissà quale scienza :-) , basta guardare il codice della app di esempio, googola Zbar Android e scaricati la libreria e il codice della applicazione d'esempio.

Ciao!

Offline Neoxxx

  • Translate Team
  • Utente junior
  • **
  • Post: 114
    • Mostra profilo
  • Dispositivo Android:
    HTC Desire
  • Sistema operativo:
    Windows 7
Re:App Scanner QR Code
« Risposta #4 il: 10 Novembre 2014, 17:33:06 CET »
Per Zxing ho visto che si può richiamare un'app esterna ma volevo evitare e aver già tutto nella mia app.

Per Zbar ho provato a scaricare l'SDK ma c'è solo il file jar e non mi fa vedere i sorgenti, come posso fare?

Offline Aaaaabbbb

  • Utente junior
  • **
  • Post: 55
    • Google+
    • pietmau
    • Mostra profilo
  • Dispositivo Android:
    Nexus 7, Samsung GT-S5830i, LG Optimus, Galaxy Tab 3
  • Play Store ID:
    aaaaaaaaaaaa
  • Sistema operativo:
    Win, Ubuntu
Re:App Scanner QR Code
« Risposta #5 il: 10 Novembre 2014, 19:05:46 CET »
Codice (Java): [Seleziona]
import net.sourceforge.zbar.Config;
import net.sourceforge.zbar.ImageScanner;


import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
import android.hardware.Camera;
import android.hardware.Camera.AutoFocusCallback;
import android.hardware.Camera.PreviewCallback;
import android.hardware.Camera.Size;
import android.os.Bundle;
import android.os.Handler;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.FrameLayout;
import android.widget.TextView;
import net.sourceforge.zbar.ImageScanner;
import net.sourceforge.zbar.Image;
import net.sourceforge.zbar.Symbol;
import net.sourceforge.zbar.SymbolSet;
import net.sourceforge.zbar.Config;

public class QRFragment extends Fragment {
        private Camera mCamera;
        private CameraPreview mPreview;
        private Handler autoFocusHandler;
        private FrameLayout preview;
        TextView scanText;
        Button scanButton;
        ImageScanner scanner;
        private Boolean isfragmentvisible=false;

        private boolean barcodeScanned = false;
        private boolean previewing = true;

        static {
                System.loadLibrary("iconv");
        }

        public static QRFragment newInstance(int position) {
                System.loadLibrary("iconv");
                QRFragment frag = new QRFragment();
                Log.e("QRFragment", "newInstance");

                return (frag);
        }

        public static String getTitle(Context ctxt, int position) {
                return myApplication.getContext().getResources()
                                .getString(R.string.qr_fragment_title);
        }


       
       
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                        Bundle savedInstanceState) {
                Log.e("QRFragment", "onCreateView");
                View view = inflater.inflate(R.layout.qrfragment, container, false);
                autoFocusHandler = new Handler();
               

                /* Instance barcode scanner */
                scanner = new ImageScanner();
                scanner.setConfig(0, Config.X_DENSITY, 3);
                scanner.setConfig(0, Config.Y_DENSITY, 3);

               
                preview = (FrameLayout) view
                                .findViewById(R.id.cameraPreview);
               

                scanText = (TextView) view.findViewById(R.id.scanText);

                scanButton = (Button) view.findViewById(R.id.ScanButton);

                scanButton.setOnClickListener(new OnClickListener() {
                        public void onClick(View v) {
                                if (barcodeScanned) {
                                        barcodeScanned = false;
                                        scanText.setText("Scanning...");
                                        mCamera.setPreviewCallback(previewCb);
                                        mCamera.startPreview();
                                        previewing = true;
                                        mCamera.autoFocus(autoFocusCB);
                                }
                        }
                });
                return (view);
        }

        public void onPause() {
                super.onPause();
                releaseCamera();
                Log.e("DashBoardFragment","onPause");
        }

        /** A safe way to get an instance of the Camera object. */
        public static Camera getCameraInstance() {
                Camera c = null;
                try {
                        c = Camera.open();
                } catch (Exception e) {
                }

                if (c == null) {
                        int camerasNumber = Camera.getNumberOfCameras();
                        if (camerasNumber > 0)
                                c = Camera.open(0);
                }

                return c;
        }

        private void releaseCamera() {
                if (mCamera != null) {
                        previewing = false;
                        mCamera.setPreviewCallback(null);
                        mCamera.release();
                        mCamera = null;
                }
                if(mPreview!=null){
                        mPreview.getHolder().removeCallback(mPreview);
                }
        }

        private Runnable doAutoFocus = new Runnable() {
                public void run() {
                        if (previewing)
                                mCamera.autoFocus(autoFocusCB);
                }
        };

        PreviewCallback previewCb = new PreviewCallback() {
                public void onPreviewFrame(byte[] data, Camera camera) {
                        Camera.Parameters parameters = camera.getParameters();
                        Size size = parameters.getPreviewSize();

                        Image barcode = new Image(size.width, size.height, "Y800");
                        barcode.setData(data);

                        int result = scanner.scanImage(barcode);

                        if (result != 0) {
                                previewing = false;
                                mCamera.setPreviewCallback(null);
                                mCamera.stopPreview();

                                SymbolSet syms = scanner.getResults();
                                String qr = new String();
                                for (Symbol sym : syms) {
                                        scanText.setText("barcode result " + sym.getData());
                                        qr=sym.getData().toString();
                                        barcodeScanned = true;
                                }
                                if(!qr.isEmpty() || isfragmentvisible){
                                        Log.e("QRFragment","onPreviewFrame");
                                        //Intent in = new Intent(getActivity(),QRScanResultActivity.class);
                                        //in.putExtra("qr", qr);
                                        //startActivity(in);
                                        attemptCheckin(qr);
                                }
                        }
                }
        };

        // Mimic continuous auto-focusing
        AutoFocusCallback autoFocusCB = new AutoFocusCallback() {
                public void onAutoFocus(boolean success, Camera camera) {
                        autoFocusHandler.postDelayed(doAutoFocus, 1000);
                }
        };

        @Override
        public void onStart() {
                super.onStart();
                System.loadLibrary("iconv");
                Log.e("QRFragment","onStart");
        }
       
        @Override
    public void onResume(){
                super.onResume();
                mCamera = getCameraInstance();
                mPreview = new CameraPreview(getActivity(), mCamera, previewCb,
                                autoFocusCB);
                preview.addView(mPreview);
                Log.e("QRFragment","onResume");
        }
        @Override
        public void setUserVisibleHint(boolean isVisibleToUser) {
                super.setUserVisibleHint(isVisibleToUser);
                if (isVisibleToUser ) {
                        isfragmentvisible=true;
                } else {
                        isfragmentvisible=false;
                }

        }

        private void attemptCheckin(String qr) {
                Log.e("ManualInputFragment","attemptCheckin");
                if(qr==null ||qr.length()<=0){
                        Resources res = getActivity().getResources();
                        Utils.issueNeutralAlert(R.string.error_checking_in, R.string.qr_empty, getActivity());
                        return;
                }
                String key =((PagerActivity)getActivity()).key;
                if(key==null ||key.length()<=0){
                        Utils.issueNeutralAlert(R.string.error_checking_in, R.string.key_is_empty, getActivity());
                        return;
                }
                if(Utils.isInternetAvailable(getActivity()))CheckIn.checkIn(key, qr,getActivity() , new CheckInListener() {
                       
                        @Override
                        public void onCheckInReturned(Boolean success) {
                                if(success){
                                        Utils.issueNeutralAlert(R.string.checked_in, R.string.checked_in_suffessfully, getActivity());
                                        return;
                                }
                               
                        }
                });
                 
        }
}

Codice (Java): [Seleziona]
import java.io.IOException;

import android.app.Activity;
import android.os.Bundle;

import android.util.Log;

import android.view.View;
import android.view.Surface;
import android.view.SurfaceView;
import android.view.SurfaceHolder;

import android.content.Context;

import android.hardware.Camera;
import android.hardware.Camera.PreviewCallback;
import android.hardware.Camera.AutoFocusCallback;
import android.hardware.Camera.Parameters;

/** A basic Camera preview class */
public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {
    private SurfaceHolder mHolder;
    private Camera mCamera;
    private PreviewCallback previewCallback;
    private AutoFocusCallback autoFocusCallback;

    public CameraPreview(Context context, Camera camera,
                         PreviewCallback previewCb,
                         AutoFocusCallback autoFocusCb) {
        super(context);
        mCamera = camera;
        previewCallback = previewCb;
        autoFocusCallback = autoFocusCb;

        /*
         * Set camera to continuous focus if supported, otherwise use
         * software auto-focus. Only works for API level >=9.
         */

        /*
        Camera.Parameters parameters = camera.getParameters();
        for (String f : parameters.getSupportedFocusModes()) {
            if (f == Parameters.FOCUS_MODE_CONTINUOUS_PICTURE) {
                mCamera.setFocusMode(Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
                autoFocusCallback = null;
                break;
            }
        }
        */


        // 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.
        try {
            mCamera.setPreviewDisplay(holder);
        } catch (IOException e) {
            Log.d("DBG", "Error setting camera preview: " + e.getMessage());
        }
    }

    public void surfaceDestroyed(SurfaceHolder holder) {
        // Camera preview released in activity
    }

    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        /*
         * 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){
          // ignore: tried to stop a non-existent preview
        }

        try {
            // Hard code camera surface rotation 90 degs to match Activity view in portrait
            mCamera.setDisplayOrientation(270);

            mCamera.setPreviewDisplay(mHolder);
            mCamera.setPreviewCallback(previewCallback);
            mCamera.startPreview();
            mCamera.autoFocus(autoFocusCallback);
        } catch (Exception e){
            Log.d("DBG", "Error starting camera preview: " + e.getMessage());
        }
    }
}

Offline Neoxxx

  • Translate Team
  • Utente junior
  • **
  • Post: 114
    • Mostra profilo
  • Dispositivo Android:
    HTC Desire
  • Sistema operativo:
    Windows 7
Re:App Scanner QR Code
« Risposta #6 il: 10 Novembre 2014, 19:56:56 CET »
Grazie ora me lo studio un po  :-)