我使用以下代码进行2D-QR码解码。
package com.test.rim;
import java.util.*;
import net.rim.device.api.barcodelib.*;
import net.rim.device.api.ui.*;
import net.rim.device.api.ui.container.*;
import net.rim.device.api.ui.UiApplication;
import net.rim.device.api.ui.component.Dialog;
import com.google.zxing.*;
final class BarcodeScanScreen extends MainScreen{
BarcodeScanScreen barcodeScanScreen;
BarcodeScanScreen(){
BarcodeDecoderListener listener = new BarcodeDecoderListener(){
public void barcodeDecoded( String rawText )
{
Dialog.alert(rawText);
}
};
Hashtable hints = new Hashtable(1);
Vector formats = new Vector(1);
formats.addElement(BarcodeFormat.QR_CODE);
hints.put(DecodeHintType.POSSIBLE_FORMATS, formats);
BarcodeDecoder decoder = new BarcodeDecoder( hints );
try{
BarcodeScanner scanner = new BarcodeScanner( decoder, listener );
scanner.getVideoControl().setDisplayFullScreen( true );
add( scanner.getViewfinder() );
scanner.startScan();
}catch (Exception e)
{
// Catch errors here
Dialog.alert("Error:" + e.getMessage());
}
}
}
要启动此屏幕,我会在上一屏幕的按钮上触发代码app.pushScreen(new BarcodeScanScreen());
。
当我运行代码时,BarcodeScanScreen
正常启动并且扫描也在继续(因为设备的红灯闪烁)。一旦我将凸轮放在任何有效的2D-QR代码之前,闪烁就会停止。我认为这意味着,任何条形码都能成功解码,因此扫描仪会停止。但是barcodeDecoded()
方法没有被触发,因为屏幕上没有出现警报按摩。我的代码有什么问题?
答案 0 :(得分:1)
我在barcodeDecoded()
中使用此代码,它解决了我的问题。
app.invokeLater(new Runnable() {
public void run() {
try { javax.microedition.media.Manager.playTone(ToneControl.C4, 1000, 100);} catch (MediaException e) { }
app.popScreen(_barcodeScreen);
showDecoded(rawText);
}
});
_barcodeScreen.invalidate();
答案 1 :(得分:0)
您的代码看起来很好,所以我唯一能想到的是Dialog.alert
无法成功运行,因为您的BarcodeScanScreen
无法在其上显示模式对话框 - 视频预览窗口不能有覆盖。在显示警报之前,请尝试停止扫描仪并将视频预览屏幕弹出堆栈。
答案 2 :(得分:0)
问题是您在 BarcodeDecoderListener 中获取数据后没有停止扫描;
首先看一下黑莓样本名称提供的示例代码 BarcodeDemo ;
在您的代码中,而不是执行此操作:
BarcodeDecoderListener listener = new BarcodeDecoderListener()
{
public void barcodeDecoded( String rawText )
{
Dialog.alert(rawText);
}
};
这样做:
BarcodeDecoderListener listener =new BarcodeDecoderListener()
{
public void barcodeDecoded(String rawText)
{
try
{
barcodeScanner.stopScan();
Dialog.alert(rawText);
}
catch (Exception e)
{
//Catch the Exception
}
}
};