安卓ZXing获取条形码图像

18
我在我的Android应用程序中使用Zxing库来生成条形码。
Intent intent = new Intent("com.google.zxing.client.android.ENCODE");

intent.putExtra("ENCODE_FORMAT", "UPC_A");
intent.putExtra("ENCODE_DATA", "55555555555");

startActivityForResult(intent,0);

有没有办法在调用Zxing的应用程序中保存生成的图像?我发现在我的onActivityResult中,我得到了空的意图。

提前感谢您的帮助。


你解决了这个问题吗?我也遇到了同样的问题。 - Stas
我也遇到了同样的问题。我想像你说的那样从onActivityResult中提取生成的图像... - Karim
3个回答

37

将视图缓存保存在位图中,类似于这样:

View myBarCodeView = view.getRootView()
//Else this might return null
myBarCodeView.setDrawingCacheEnabled(true)
//Save it in bitmap
Bitmap mBitmap = myBarCodeView.getDrawingCache()

或者自己绘制条形码或二维码

//Change the writers as per your need
private void generateQRCode(String data) {
    com.google.zxing.Writer writer = new QRCodeWriter();
    String finaldata =Uri.encode(data, "ISO-8859-1");
    try {
        BitMatrix bm = writer.encode(finaldata,BarcodeFormat.QR_CODE, 350, 350);
        mBitmap = Bitmap.createBitmap(350, 350, Config.ARGB_8888);
        for (int i = 0; i < 350; i++) {
            for (int j = 0; j < 350; j++) {
                mBitmap.setPixel(i, j, bm.get(i, j) ? Color.BLACK: Color.WHITE);
            }
        }
    } catch (WriterException e) {
        e.printStackTrace();
    }
    if (mBitmap != null) {
        mImageView.setImageBitmap(mBitmap);
    }
}
public void generateBarCode(String data){
    com.google.zxing.Writer c9 = new Code128Writer();
    try {
        BitMatrix bm = c9.encode(data,BarcodeFormat.CODE_128,350, 350);
        mBitmap = Bitmap.createBitmap(350, 350, Config.ARGB_8888);

        for (int i = 0; i < 350; i++) {
            for (int j = 0; j < 350; j++) {

                mBitmap.setPixel(i, j, bm.get(i, j) ? Color.BLACK : Color.WHITE);
            }
        }
    } catch (WriterException e) {
        e.printStackTrace();
    }
    if (mBitmap != null) {
        mImageView.setImageBitmap(mBitmap);
    }
}

一旦获取位图图像,只需保存即可。

//create a file to write bitmap data
    File f = new File(FilePath, FileName+".png");
    f.createNewFile();

    //Convert bitmap to byte array
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    ImageBitmap.compress(CompressFormat.PNG, 0, bos);
    byte[] bytearray = bos.toByteArray();

    //Write bytes in file
    FileOutputStream fos = new FileOutputStream(f);
    fos.write(bytearray);
    fos.flush();
    fos.close();

你也可以检查我创建的一个来自Github的小库GZxing,用于创建条形码或二维码。

GZxingEncoder   Encoder = GZxingEncoder.getInstance();
Encoder.initalize(this);
//To generate bar code use this
Bitmap bitmap = Encoder.generateBarCode_general("some text")

1
第一段代码片段不会起作用。您无法获取另一个Activity视图的“屏幕截图”。其余部分并不是一个坏主意...只需嵌入编码即可。 - Sean Owen
@Girish Nair 我正在扫描条形码和二维码,那么我该如何检查是需要生成条形码还是二维码呢? - Erum
@ErumHannan:条形码和二维码有点像两种不同的语言,所以你选择说哪一种是你的选择。那么,如何使用警示对话框询问用户是否要生成条形码或二维码呢? - Girish Nair

1

要在ZXing中存储扫描的图像,您需要在CaptureActivity类中覆盖drawResultPoints方法。

 String root = Environment.getExternalStorageDirectory().toString();
 File myDir = new File(root);    
 myDir.mkdirs();
 Random generator = new Random();
 int n = 10000;
 n = generator.nextInt(n);
 String fname = "Image-"+ n +".jpg";
 File file = new File (myDir, fname);
 if (file.exists ()) file.delete (); 
 try {
     FileOutputStream out = new FileOutputStream(file);
     barcode.compress(Bitmap.CompressFormat.JPEG, 90, out);
     out.flush();
     out.close();

 } catch (Exception e) {
   Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_LONG).show();
 }

这将把扫描的图像保存在SD卡的根目录中,您可以自定义它以将其保存在任何特定的文件夹中。它将存储扫描过程中出现的幽灵图像作为所存储的图像。

实际上这非常有用。是的,您可以窃取绘图缓存。但这是一种更可靠的获取扫描位图的方法。 - Eran Goldin
@Rakshi,你能再详细解释一下吗? - Erum
@EranGoldin 是的,这个方法可以很好地保存图像,但我怎样才能获得图像的名称?在onActivityResult中。 - Erum
@ErumHanan,你的名字是什么?你正在获取一个位图,它没有名字。 - Eran Goldin
抱歉,这个怎么用啊?我想要扩展CaptureActivity而不是Activity,但是我无法扩展CaptureActivity。在实现中使用它也不起作用。我无法重写drawResultPoints函数。我在哪里可以找到CaptureActivity类? - Razgriz

1

目前在Intent中没有返回它。没有办法获取它。您可以建议一个补丁程序,使其被返回 - 这可能需要几天的工作时间。或者尝试Girish的方法,直接嵌入编码。


好的!谢谢您的快速回复 :) 就像我说的,我必须使用另一个应用程序。我正在尝试围绕意图构建一些研究内容,因此我将建议一个补丁程序。您能告诉我如何/在哪里建议一个补丁程序吗? - Karim
当然,EncoderActivity在这里:https://code.google.com/p/zxing/source/browse/trunk#trunk%2Fandroid%2Fsrc%2Fcom%2Fgoogle%2Fzxing%2Fclient%2Fandroid%2Fencode 它需要在Intent中返回一些压缩的二进制表示,然后在这里进行处理:https://code.google.com/p/zxing/source/browse/trunk/android-integration/src/com/google/zxing/integration/android/IntentIntegrator.java 最好能够对SVN进行补丁。 - Sean Owen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接