选择 ZXing QR reader library for Java/Android?

除了任何其他图书馆 Zxing, 可用于创建代码阅读器 QR,

即使它不是免费的吗?

当然,免费会很棒。 但我也准备支付才能获得一个易于配置和节省时间的库。

谢。
已邀请:

裸奔

赞同来自:

我在这里找到了对我的问题的答案
http://sourceforge.net/news/?group_id=189236
它比它快得多 zxing, 它更容易实现。

谢。

为了 iOS

:

为了 iOS /zbar.sourceforge.net/iphone/ 和文件 /zbar.sourceforge.net/iphone/sdkdoc/install. html/

董宝中

赞同来自:

无需安装 zxing 实施 qr reader, 只需创建类文件

IntentIntegrator.java

和 IntentResult.java 并从您的活动中致电。

以下是此源代码....

https://code.google.com/p/dwiv ... ckout

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// &gt; 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//;
}

}


和 IntentResult.java 保存有关所选条形码或QR码的信息。

/**
*
*/


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//;
}

}


现在如何从您的活动中调用这些课程


btnScanBarCode.setOnClickListener/new View.OnClickListener// {

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



}
}/;


A B. onActivityResult G。


@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//;
}
}


</string></resolveinfo></string></string></string></string></string></string></string></string></string></string></string>

石油百科

赞同来自:

我也有同样的问题。 我下载了图书馆 ZXing 并将其整合到他的项目中。 集成是非常复杂和耗时的,我花了很多时间来清除项目并仅使用部分 QRCode. 现在他工作,但有一些设备有一个众所周知的问题 Motorola Atrix 和 DroidX /Android 2.3/where CaptureActivity 显示白色屏幕而不是相机。 这是图书馆的问题,但是来自的家伙 ZXing 不会纠正它。 似乎这个问题也存在 Htc Nexus One. 这是一条消息:
[/url]
.

@Sean

我知道你是创始人 ZXing. 条形码扫描仪应用程序很棒,但在应用程序中使用它作为库 - 否。 我建议将应用程序与库中的应用程序分开并向它写下良好的文档。 另外,我不明白为什么你拒绝支持 iOS.

要回复问题请先登录注册