Alternative à la bibliothèque ZXing QR reader pour Java / Android? [fermé]

Existe-t-il une autre bibliothèque autre que Zxing qui peut être utilisée pour créer un lecteur de code QR même si ce n'est pas gratuit.

Bien sûr, un gratuit sera génial. mais je suis également prêt à payer pour obtenir une bibliothèque facile à personnaliser et pour gagner du temps.

Je vous Remercie.

44
demandé sur a fair player 2012-05-28 13:33:36

3 réponses

J'ai trouvé la réponse à ma question ici http://sourceforge.net/news/?group_id=189236

C'est beaucoup plus rapide que zxing et beaucoup plus facile à implémenter.

Je vous Remercie.

Pour iOS:

Pour iOS (zbar.sourceforge.net/iphone) et la documentation (zbar.sourceforge.net/iphone/sdkdoc/install.html)

69
répondu a fair player 2015-02-02 11:18:44

Il N'est pas nécessaire d'installer zxing pour implémenter QR reader, il suffit de créer une classe IntentIntegrator.java et IntentResult.fichier java et appel de votre activité.

Voici le code source pour cela....

Consultez le code source complet ici

import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.List;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.ActivityNotFoundException;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.net.Uri;
import android.util.Log;


public final class IntentIntegrator {

  public static final int REQUEST_CODE = 0x0000c0de; // Only use bottom 16 bits
  private static final String TAG = IntentIntegrator.class.getSimpleName();

  public static final String DEFAULT_TITLE = "Install Barcode Scanner?";
  public static final String DEFAULT_MESSAGE =
      "This application requires Barcode Scanner. Would you like to install it?";
  public static final String DEFAULT_YES = "Yes";
  public static final String DEFAULT_NO = "No";

  private static final String BS_PACKAGE = "com.google.zxing.client.android";

  // supported barcode formats
  public static final Collection<String> PRODUCT_CODE_TYPES = list("UPC_A", "UPC_E", "EAN_8", "EAN_13", "RSS_14");
  public static final Collection<String> ONE_D_CODE_TYPES =
      list("UPC_A", "UPC_E", "EAN_8", "EAN_13", "CODE_39", "CODE_93", "CODE_128",
           "ITF", "RSS_14", "RSS_EXPANDED");
  public static final Collection<String> QR_CODE_TYPES = Collections.singleton("QR_CODE");
  public static final Collection<String> DATA_MATRIX_TYPES = Collections.singleton("DATA_MATRIX");

  public static final Collection<String> ALL_CODE_TYPES = null;

  public static final Collection<String> TARGET_BARCODE_SCANNER_ONLY = Collections.singleton(BS_PACKAGE);
  public static final Collection<String> TARGET_ALL_KNOWN = list(
          BS_PACKAGE, // Barcode Scanner
          "com.srowen.bs.android", // Barcode Scanner+
          "com.srowen.bs.android.simple" // Barcode Scanner+ Simple
          // TODO add more -- what else supports this intent?
      );

  private final Activity activity;
  private String title;
  private String message;
  private String buttonYes;
  private String buttonNo;
  private Collection<String> targetApplications;

  public IntentIntegrator(Activity activity) {
    this.activity = activity;
    title = DEFAULT_TITLE;
    message = DEFAULT_MESSAGE;
    buttonYes = DEFAULT_YES;
    buttonNo = DEFAULT_NO;
    targetApplications = TARGET_ALL_KNOWN;
  }

  public String getTitle() {
    return title;
  }

  public void setTitle(String title) {
    this.title = title;
  }

  public void setTitleByID(int titleID) {
    title = activity.getString(titleID);
  }

  public String getMessage() {
    return message;
  }

  public void setMessage(String message) {
    this.message = message;
  }

  public void setMessageByID(int messageID) {
    message = activity.getString(messageID);
  }

  public String getButtonYes() {
    return buttonYes;
  }

  public void setButtonYes(String buttonYes) {
    this.buttonYes = buttonYes;
  }

  public void setButtonYesByID(int buttonYesID) {
    buttonYes = activity.getString(buttonYesID);
  }

  public String getButtonNo() {
    return buttonNo;
  }

  public void setButtonNo(String buttonNo) {
    this.buttonNo = buttonNo;
  }

  public void setButtonNoByID(int buttonNoID) {
    buttonNo = activity.getString(buttonNoID);
  }

  public Collection<String> getTargetApplications() {
    return targetApplications;
  }

  public void setTargetApplications(Collection<String> targetApplications) {
    this.targetApplications = targetApplications;
  }

  public void setSingleTargetApplication(String targetApplication) {
    this.targetApplications = Collections.singleton(targetApplication);
  }

  /**
   * Initiates a scan for all known barcode types.
   */
  public AlertDialog initiateScan() {
    return initiateScan(ALL_CODE_TYPES);
  }

  /**
   * Initiates a scan only for a certain set of barcode types, given as strings corresponding
   * to their names in ZXing's {@code BarcodeFormat} class like "UPC_A". You can supply constants
   * like {@link #PRODUCT_CODE_TYPES} for example.
   */
  public AlertDialog initiateScan(Collection<String> desiredBarcodeFormats) {
    Intent intentScan = new Intent(BS_PACKAGE + ".SCAN");
    intentScan.addCategory(Intent.CATEGORY_DEFAULT);

    // check which types of codes to scan for
    if (desiredBarcodeFormats != null) {
      // set the desired barcode types
      StringBuilder joinedByComma = new StringBuilder();
      for (String format : desiredBarcodeFormats) {
        if (joinedByComma.length() > 0) {
          joinedByComma.append(',');
        }
        joinedByComma.append(format);
      }
      intentScan.putExtra("SCAN_FORMATS", joinedByComma.toString());
    }

    String targetAppPackage = findTargetAppPackage(intentScan);
    if (targetAppPackage == null) {
      return showDownloadDialog();
    }
    intentScan.setPackage(targetAppPackage);
    intentScan.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    intentScan.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
    activity.startActivityForResult(intentScan, REQUEST_CODE);
    return null;
  }

  private String findTargetAppPackage(Intent intent) {
    PackageManager pm = activity.getPackageManager();
    List<ResolveInfo> availableApps = pm.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
    if (availableApps != null) {
      for (ResolveInfo availableApp : availableApps) {
        String packageName = availableApp.activityInfo.packageName;
        if (targetApplications.contains(packageName)) {
          return packageName;
        }
      }
    }
    return null;
  }

  private AlertDialog showDownloadDialog() {
    AlertDialog.Builder downloadDialog = new AlertDialog.Builder(activity);
    downloadDialog.setTitle(title);
    downloadDialog.setMessage(message);
    downloadDialog.setPositiveButton(buttonYes, new DialogInterface.OnClickListener() {
      @Override
      public void onClick(DialogInterface dialogInterface, int i) {
        Uri uri = Uri.parse("market://details?id=" + BS_PACKAGE);
        Intent intent = new Intent(Intent.ACTION_VIEW, uri);
        try {
          activity.startActivity(intent);
        } catch (ActivityNotFoundException anfe) {
          // Hmm, market is not installed
          Log.w(TAG, "Android Market is not installed; cannot install Barcode Scanner");
        }
      }
    });
    downloadDialog.setNegativeButton(buttonNo, new DialogInterface.OnClickListener() {
      @Override
      public void onClick(DialogInterface dialogInterface, int i) {}
    });
    return downloadDialog.show();
  }


  /**
   * <p>Call this from your {@link Activity}'s
   * {@link Activity#onActivityResult(int, int, Intent)} method.</p>
   *
   * @return null if the event handled here was not related to this class, or
   *  else an {@link IntentResult} containing the result of the scan. If the user cancelled scanning,
   *  the fields will be null.
   */
  public static IntentResult parseActivityResult(int requestCode, int resultCode, Intent intent) {
    if (requestCode == REQUEST_CODE) {
      if (resultCode == Activity.RESULT_OK) {
        String contents = intent.getStringExtra("SCAN_RESULT");
        String formatName = intent.getStringExtra("SCAN_RESULT_FORMAT");
        byte[] rawBytes = intent.getByteArrayExtra("SCAN_RESULT_BYTES");
        int intentOrientation = intent.getIntExtra("SCAN_RESULT_ORIENTATION", Integer.MIN_VALUE);
        Integer orientation = intentOrientation == Integer.MIN_VALUE ? null : intentOrientation;
        String errorCorrectionLevel = intent.getStringExtra("SCAN_RESULT_ERROR_CORRECTION_LEVEL");
        return new IntentResult(contents,
                                formatName,
                                rawBytes,
                                orientation,
                                errorCorrectionLevel);
      }
      return new IntentResult();
    }
    return null;
  }


  /**
   * Shares the given text by encoding it as a barcode, such that another user can
   * scan the text off the screen of the device.
   *
   * @param text the text string to encode as a barcode
   */
  public void shareText(CharSequence text) {
    Intent intent = new Intent();
    intent.addCategory(Intent.CATEGORY_DEFAULT);
    intent.setAction(BS_PACKAGE + ".ENCODE");
    intent.putExtra("ENCODE_TYPE", "TEXT_TYPE");
    intent.putExtra("ENCODE_DATA", text);
    String targetAppPackage = findTargetAppPackage(intent);
    if (targetAppPackage == null) {
      showDownloadDialog();
    } else {
      intent.setPackage(targetAppPackage);
      intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
      intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
      activity.startActivity(intent);
    }
  }

  private static Collection<String> list(String... values) {
    return Collections.unmodifiableCollection(Arrays.asList(values));
  }

}

Et IntentResult.java pour cantaining les informations du code à barres sélectionné ou qr code.

/** * */

public final class IntentResult {

      private final String contents;
      private final String formatName;
      private final byte[] rawBytes;
      private final Integer orientation;
      private final String errorCorrectionLevel;

      IntentResult() {
        this(null, null, null, null, null);
      }

      IntentResult(String contents,
                   String formatName,
                   byte[] rawBytes,
                   Integer orientation,
                   String errorCorrectionLevel) {
        this.contents = contents;
        this.formatName = formatName;
        this.rawBytes = rawBytes;
        this.orientation = orientation;
        this.errorCorrectionLevel = errorCorrectionLevel;
      }

      /**
       * @return raw content of barcode
       */
      public String getContents() {
        return contents;
      }

      /**
       * @return name of format, like "QR_CODE", "UPC_A". See {@code BarcodeFormat} for more format names.
       */
      public String getFormatName() {
        return formatName;
      }

      /**
       * @return raw bytes of the barcode content, if applicable, or null otherwise
       */
      public byte[] getRawBytes() {
        return rawBytes;
      }

      /**
       * @return rotation of the image, in degrees, which resulted in a successful scan. May be null.
       */
      public Integer getOrientation() {
        return orientation;
      }

      /**
       * @return name of the error correction level used in the barcode, if applicable
       */
      public String getErrorCorrectionLevel() {
        return errorCorrectionLevel;
      }

      @Override
      public String toString() {
        StringBuilder dialogText = new StringBuilder(100);
        dialogText.append("Format: ").append(formatName).append('\n');
        dialogText.append("Contents: ").append(contents).append('\n');
        int rawBytesLength = rawBytes == null ? 0 : rawBytes.length;
        dialogText.append("Raw bytes: (").append(rawBytesLength).append(" bytes)\n");
        dialogText.append("Orientation: ").append(orientation).append('\n');
        dialogText.append("EC level: ").append(errorCorrectionLevel).append('\n');
        return dialogText.toString();
      }

    }

Maintenant comment appeler ces classes à partir de votre Activité

  btnScanBarCode.setOnClickListener(new View.OnClickListener() {

                    @Override
                    public void onClick(View v) {
                        // TODO Auto-generated method stub
                    IntentIntegrator integrator = new IntentIntegrator(BarCodeReaderActivity.this);
                integrator.initiateScan();  



                    }
                });

Et dans onActivityResult

 @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        // TODO Auto-generated method stub

        IntentResult scanResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, data);
          if (scanResult != null) {

            // handle scan result
             contantsString =  scanResult.getContents()==null?"0":scanResult.getContents();
             if (contantsString.equalsIgnoreCase("0")) {
                 Toast.makeText(this, "Problem to get the  contant Number", Toast.LENGTH_LONG).show();

             }else {
                 Toast.makeText(this, contantsString, Toast.LENGTH_LONG).show();

            }

          }
          else{
              Toast.makeText(this, "Problem to secan the barcode.", Toast.LENGTH_LONG).show();
          }
    }
23
répondu Dwivedi Ji 2013-12-17 16:57:47

J'ai le même problème. J'ai téléchargé la bibliothèque ZXing et l'ai intégrée dans mon projet. L'intégration est très difficile et junky et je passe beaucoup de temps à nettoyer le projet et à utiliser uniquement la partie QRCode. Maintenant, cela fonctionne, mais il y a un problème connu avec certains appareils Motorola Atrix et DroidX (Android 2.3)où CaptureActivity affiche un écran blanc au lieu de la caméra. C'est un problème avec la bibliothèque mais les gars de ZXing ne le corrigeront pas. Il semble que ce problème est également présent sur Htc Nexus One. C'est un message: https://groups.google.com/forum/#! topic / zxing / BofniyFVZaQ .

@Sean

Je sais que vous êtes le fondateur de ZXing. L'application Barcode scanner est génial, mais l'utiliser comme une bibliothèque dans l'application ne l'est pas. Je suggère de découpler l'application et la bibliothèque et d'y écrire une bonne documentation. Aussi, je ne comprends pas pourquoi vous dropeed le support pour iOS.

12
répondu user1173015 2012-06-27 11:55:55