由于我不拥有用于开发目的的 G1,因此我正在尽力使用模拟器。这就是说,我正在尝试使用 ZXing(Zebra Zrossing)库扫描我的 sdCard 中的 JPEG 图像或 PNG 图像。
我试图更改 Android 项目中的代码,所以它会从 sdCard 中的图像扫描,而不是从相机扫描,没有任何运气。
我接下来所做的可能是我问题的根源。
我尝试在一个新的 Android 项目中使用 JAVASE 代码为“修改后的”CommandLineRunner 提供图像,事情是这样的:
Eclipse 将构建该项目,但不会运行它。虚拟机日志向我抛出了这条消息:
**02-08 20:47:45.916: WARN/dalvikvm(619): VFY: 无法解析静态方法 939: Ljavax/imageio/ImageIO;.read (Ljava/io/File;)Ljava/awt/image/BufferedImage ; 02-08 20:47:45.926: WARN/dalvikvm(619): VFY: 在 0x0004 拒绝操作码 0x71 02-08 20:47:45.926: WARN/dalvikvm(619): VFY: 拒绝 Lcom/magoco/fread/FRead; .decode2 (Ljava/io/File;Ljava/util/Hashtable;Ljava/lang/String;)Ljava/lang/String; 02-08 20:47:45.926: WARN/dalvikvm(619): Verifier 拒绝类 Lcom/magoco/fread/FRead;02-08 20:47:45.926: WARN/dalvikvm(619): 类初始化在 newInstance 调用中失败 (Lcom/magoco/fread/FRead;) 02-08 20:47:45.926: DEBUG/AndroidRuntime(619): 关闭VM 02-08 20:47:45.926: WARN/dalvikvm(619): threadid=3: thread exiting with uncaught exception (group=0x40010e28) 02-08 20:47:45.937: ERROR/AndroidRuntime(619): Uncaught handler:
我在网上搜索了答案,有人说这是 Dalvikvm 上的常见错误,因为可能存在预编译的类或库(真的,在 Eclipse 之外)并且 VM 无法使用它。
我在主要活动中发布我的代码:
package com.magoco.fread;
import java.awt.image.BufferedImage;
import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Hashtable;
import javax.imageio.ImageIO;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.widget.TextView;
import com.google.zxing.DecodeHintType;
import com.google.zxing.MonochromeBitmapSource;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.ReaderException;
import com.google.zxing.Result;
import com.google.zxing.client.result.ParsedResult;
import com.google.zxing.client.result.ResultParser;
public class FRead extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
TextView tv = (TextView) this.findViewById(R.id.BarcodeResult);
try {
tv.setText(this.decodeOneArgument2("", false));
} catch (Exception e) {
e.printStackTrace();
}
}
public String decodeOneArgument2(String argument, boolean dumpResults)
throws Exception {
String barcode = "";
// File inputFile = new File(argument);
File inputFile = new File("sdcard/dcim/pueblo.JPG");
/* TESTING THAT I'VE GOT A FILE */
System.out.println("FILE " + inputFile.toString());
// decode(new URI(argument), hints);
decode2(inputFile, null, barcode);
return barcode;
}
public String decode2(File f, Hashtable<DecodeHintType, Object> hints,
String barcode) throws IOException {
/* IF I COMMENT THE NEXT LINE, IT RUNS BUT OF COURSE NO RESULT */
BufferedImage image;
try {
image = ImageIO.read(f);
} catch (IllegalArgumentException iae) {
throw new FileNotFoundException("Resource not found: " + f);
}
try {
MonochromeBitmapSource source = new BufferedImageMonochromeBitmapSource(
image);
Result result = new MultiFormatReader().decode(source, hints);
ParsedResult parsedResult = ResultParser.parseResult(result);
barcode = " format: " + result.getBarcodeFormat()+ result.getText() + "\nParsed result:\n"+ parsedResult.getDisplayResult();
System.out.println(" format: " + result.getBarcodeFormat()+ result.getText() + "\nParsed result:\n"+ parsedResult.getDisplayResult());
//return result;
} catch (ReaderException e) {
System.out.println(": No barcode found");
return null;
}
return barcode;
}
}
提前致谢
monn3t