android条形码编解码

87497718 2012-03-20

对条形码的编解码可以用barcode库和zxing库,但对于android ,barcode库中的BufferedImage不能使用,我所看到的用得较多的是zxing库,地址在http://code.google.com/p/zxing/ 里面有库的源码与几种平台的例子。里面的例子只支持横屏模式下,要支持竖屏得对其进行修改。步骤如下:

1.在DecodeHandler.java中,修改decode方法

PlanarYUVLuminanceSourcesource=CameraManager.get().buildLuminanceSource(data,width,height);

byte[]rotatedData=newbyte[data.length];

for(inty=0;y<height;y++){

for(intx=0;x<width;x++)

rotatedData[x*height+height-y-1]=data[x+y*width];

}

inttmp=width;//Hereweareswapping,that'sthedifferenceto#11

width=height;

height=tmp;

PlanarYUVLuminanceSourcesource=CameraManager.get().buildLuminanceSource(rotatedData,width,height);

2.在CameraManager.java中,注释代码:

//rect.left=rect.left*cameraResolution.x/screenResolution.x;

//rect.right=rect.right*cameraResolution.x/screenResolution.x;

//rect.top=rect.top*cameraResolution.y/screenResolution.y;

//rect.bottom=rect.bottom*cameraResolution.y/screenResolution.y;

修改为

rect.left=rect.left*cameraResolution.y/screenResolution.x;

rect.right=rect.right*cameraResolution.y/screenResolution.x;

rect.top=rect.top*cameraResolution.x/screenResolution.y;

rect.bottom=rect.bottom*cameraResolution.x/screenResolution.y;

3.在CameraConfigurationManager.java中,在setDesiredCameraParameters方法中添加一句

camera.setDisplayOrientation(90);

4.在AndroidManifest.xml中,把Activity的属性android:screenOrientation="landscape"

改为

  android:screenOrientation="portrait"

编译运行即可!

参考:

http://code.google.com/p/zxing/issues/detail?id=178#c46

代码:

https://github.com/pplante/zxing-android

解码实际是对摄像头获得的数据的yuv数据进行解码

注:setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 设置后或者在mainfest配置文件中landscape后,onconfigruationChanged不被调用,所以不能用来判断横竖屏

对于解码要支持横竖屏得涉及方向的判断,这儿有几篇文章可以参考:

yuv数据的转换

通过senser获得屏幕旋转

http://blog.csdn.net/a345017062/article/details/6592527

传感器设计的指南针

http://blog.csdn.net/tinya0913/article/details/6057637

通过orientationeventListener判断手机横竖指向

http://androidbiancheng.blogspot.jp/2011/05/orientationeventlistener.html

package com.AndroidOrientation;import android.app.Activity;
import android.content.Context;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.view.OrientationEventListener;
import android.widget.TextView;
import android.widget.Toast;
public class AndroidOrientation extends Activity{
TextView orientation;
MyOrientationEventListener myOrientationEventListener;   
/** Called when the activity is first created. */   
@Override   
public void onCreate(Bundle savedInstanceState) {       super.onCreate(savedInstanceState);      
 setContentView(R.layout.main);       
orientation = (TextView)findViewById(R.id.orientation);             myOrientationEventListener =  new MyOrientationEventListener(this, SensorManager.SENSOR_DELAY_NORMAL);             
if (myOrientationEventListener.canDetectOrientation()){        myOrientationEventListener.enable();       
}else{        
Toast.makeText(AndroidOrientation.this,  "Can't DetectOrientation!",  Toast.LENGTH_LONG).show();       
}   }     
@Override
protected void onDestroy() { 
// TODO Auto-generated method stub 
super.onDestroy();
 myOrientationEventListener.disable();}
class MyOrientationEventListener extends OrientationEventListener{ public MyOrientationEventListener(Context context, int rate) { 
 super(context, rate); 
 // TODO Auto-generated constructor stub } 
@Override public void onOrientationChanged(int arg0) {  
// TODO Auto-generated method stub  
orientation.setText(String.valueOf(arg0)); 
}     
 }}

  

相关推荐