zxingzxing 二维码连续扫描扫描框,怎么让surfaceview只占屏幕的1/2

Android 二维码扫描怎样实现第二次扫描_百度知道
Android 二维码扫描怎样实现第二次扫描
在扫描出现问题事弹出dialog,当用户点击确定按钮后重新开始扫描。private void showErrorDialog() {
closeCamera();
viewfinderView.setVisibility(View.GONE);
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle(getString(R.string.app_name));
builder.setMessage(&扫描确认出错,请重新扫描柜子上的二维码!&);
builder.setPositiveButton(android.R.string.ok, new OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
restartCamera();
builder.setOnCancelListener(new OnCancelListener() {
public void onCancel(DialogInterface dialog) {
CaptureCodeActivity.this.finish();
builder.show();
其他类似问题
为您推荐:
提问者采纳
首先看一下扫描界面CaptureCodeActivity.java代码:package&com.haier.qr.import&java.io.IOEimport&java.io.Simport&java.util.Mimport&java.util.Vimport&android.app.Aimport&android.app.AlertDimport&android.content.DialogIimport&android.content.DialogInterface.OnCancelLimport&android.content.DialogInterface.OnClickLimport&android.content.Iimport&android.graphics.Bimport&android.os.Bimport&android.os.Himport&android.text.TextUimport&android.util.Limport&android.view.SurfaceHimport&android.view.SurfaceHolder.Cimport&android.view.SurfaceVimport&android.view.Vimport&android.view.Wimport&android.view.WindowMimport&android.widget.Timport&com.google.zxing.BarcodeFimport&com.google.zxing.DecodeHintTimport&com.google.zxing.Rimport&com.haier.cabinet.customer.R;import&com.haier.cabinet.customer.activity.DeliveryBoxListAimport&mon.util.AppTimport&com.haier.qr.code.zxing.camera.CameraMimport&com.haier.qr.code.zxing.decoding.CaptureActivityHimport&com.haier.qr.code.zxing.decoding.FinishLimport&com.haier.qr.code.zxing.decoding.InactivityTimport&com.haier.qr.code.zxing.view.ViewfinderV/**&*&Initial&the&camera&*&&*&@author&jdsjlzx&*/public&class&CaptureCodeActivity&extends&Activity&implements&Callback,View.OnClickListener&{ private&static&final&String&TAG&=&CaptureCodeActivity.class
.getSimpleName(); private&CameraManager&cameraM private&CaptureActivityHandler& private&ViewfinderView&viewfinderV private&boolean&hasS private&Map&DecodeHintType,&?&&decodeH private&Vector&BarcodeFormat&&decodeF private&String&characterS private&InactivityTimer&inactivityT private&boolean&isFlashlightO /** &*&声音震动管理器。如果扫描成功后可以播放一段音频,也可以震动提醒,可以通过配置来决定扫描成功后的行为。 &*/ private&BeepManager&beepM /** &*&闪光灯调节器。自动检测环境光线强弱并决定是否开启闪光灯 &*/ private&AmbientLightManager&ambientLightM public&CameraManager&getCameraManager()&{
return&cameraM } /**&Called&when&the&activity&is&first&created.&*/ @Override public&void&onCreate(Bundle&savedInstanceState)&{
super.onCreate(savedInstanceState);
Window&window&=&getWindow();
window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
setContentView(R.layout.activity_capture);
hasSurface&=&
inactivityTimer&=&new&InactivityTimer(this);
beepManager&=&new&BeepManager(this);
ambientLightManager&=&new&AmbientLightManager(this);
//按钮监听事件
findViewById(R.id.capture_flashlight).setOnClickListener(this); } @Override protected&void&onResume()&{
super.onResume();
Log.d(TAG,&&onResume&);
cameraManager&=&new&CameraManager(getApplication());
viewfinderView&=&(ViewfinderView)&findViewById(R.id.viewfinder_view);
viewfinderView.setCameraManager(cameraManager);
viewfinderView.setVisibility(View.VISIBLE);
SurfaceView&surfaceView&=&(SurfaceView)&findViewById(R.id.preview_view);
SurfaceHolder&surfaceHolder&=&surfaceView.getHolder();
if&(hasSurface)&{
initCamera(surfaceHolder);
//&防止sdk8的设备初始化预览异常
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
//&Install&the&callback&and&wait&for&surfaceCreated()&to&init&the
//&camera.
surfaceHolder.addCallback(this);
decodeFormats&=&
characterSet&=&
//&加载声音配置,其实在BeemManager的构造器中也会调用该方法,即在onCreate的时候会调用一次
beepManager.updatePrefs();
//&启动闪光灯调节器
ambientLightManager.start(cameraManager);
//&恢复活动监控器
inactivityTimer.onResume(); }
@Override protected&void&onPause()&{
Log.d(TAG,&&onPause&);
if&(handler&!=&null)&{
handler.quitSynchronously();
handler&=&
inactivityTimer.onPause();
ambientLightManager.stop();
beepManager.close();
//&关闭摄像头
cameraManager.closeDriver();
if&(!hasSurface)&{
SurfaceView&surfaceView&=&(SurfaceView)&findViewById(R.id.preview_view);
SurfaceHolder&surfaceHolder&=&surfaceView.getHolder();
surfaceHolder.removeCallback(this);
super.onPause(); } @Override protected&void&onDestroy()&{
inactivityTimer.shutdown();
super.onDestroy(); } /** &*&A&valid&barcode&has&been&found,&so&give&an&indication&of&success&and&show &*&the&results. &*& &*&@param&rawResult &*&&&&&&&&&&&&The&contents&of&the&barcode. &*&@param&scaleFactor &*&&&&&&&&&&&&amount&by&which&thumbnail&was&scaled &*&@param&barcode &*&&&&&&&&&&&&A&greyscale&bitmap&of&the&camera&data&which&was&decoded. &*/ public&void&handleDecode(Result&rawResult,&Bitmap&barcode,&float&scaleFactor)&{
Log.d(TAG,&&handleDecode&);
inactivityTimer.onActivity();
beepManager.playBeepSoundAndVibrate();
String&resultString&=&rawResult.getText();
if&(TextUtils.isEmpty(resultString))&{
Toast.makeText(CaptureCodeActivity.this,&&Scan&failed!&,
Toast.LENGTH_SHORT).show();
//扫码完成,处理结果(跳转到箱子列表)
/*Intent&resultIntent&=&new&Intent();
Bundle&bundle&=&new&Bundle();
bundle.putString(&result&,&resultString);
bundle.putParcelable(&bitmap&,&barcode);
resultIntent.putExtras(bundle);
this.setResult(RESULT_OK,&resultIntent);*/
String&terminalNo&=&getIntent().getStringExtra(&terminal_no&);
if&(resultString.equals(terminalNo))&{
AppToast.makeToast(this,&&确认成功!&);
Intent&intent&=&new&Intent(this,&DeliveryBoxListActivity.class);
intent.putExtra(&terminal_no&,&terminalNo);
intent.putExtra(&box_list&,&(Serializable)&getIntent().getSerializableExtra(&box_list&));
startActivity(intent);
CaptureCodeActivity.this.finish();
/*AppToast.makeToast(this,&&确认失败,请重新扫描确认&);*/
showErrorDialog();
} private&void&initCamera(SurfaceHolder&surfaceHolder)&{
if&(surfaceHolder&==&null)&{
throw&new&IllegalStateException(&No&SurfaceHolder&provided&);
if&(cameraManager.isOpen())&{
Log.w(TAG,
&initCamera()&while&already&open&--&late&SurfaceView&callback?&);
cameraManager.openDriver(surfaceHolder);
//&Creating&the&handler&starts&the&preview,&which&can&also&throw&a
//&RuntimeException.
if&(handler&==&null)&{
handler&=&new&CaptureActivityHandler(this,&decodeFormats,
decodeHints,&characterSet,&cameraManager);
}&catch&(IOException&ioe)&{
Log.w(TAG,&ioe);
displayFrameworkBugMessageAndExit();
}&catch&(RuntimeException&e)&{
//&Barcode&Scanner&has&seen&crashes&in&the&wild&of&this&variety:
//&java.?lang.?RuntimeException:&Fail&to&connect&to&camera&service
Log.w(TAG,&&Unexpected&error&initializing&camera&,&e);
displayFrameworkBugMessageAndExit();
} } private&void&displayFrameworkBugMessageAndExit()&{
AlertDialog.Builder&builder&=&new&AlertDialog.Builder(this);
builder.setTitle(getString(R.string.app_name));
builder.setMessage(getString(R.string.msg_camera_framework_bug));
builder.setPositiveButton(android.R.string.yes,&new&FinishListener(this));
builder.setOnCancelListener(new&FinishListener(this));
builder.show(); } @Override public&void&surfaceChanged(SurfaceHolder&holder,&int&format,&int&width,
int&height)&{ } @Override public&void&surfaceCreated(SurfaceHolder&holder)&{
if&(holder&==&null)&{
Log.e(TAG,
&***&WARNING&***&surfaceCreated()&gave&us&a&null&surface!&);
if&(!hasSurface)&{
hasSurface&=&
initCamera(holder);
} } @Override public&void&surfaceDestroyed(SurfaceHolder&holder)&{
hasSurface&=& } publi珐範粹既诔焕达唯惮沥c&ViewfinderView&getViewfinderView()&{
return&viewfinderV } public&Handler&getHandler()&{
return& } public&void&drawViewfinder()&{
viewfinderView.drawViewfinder(); } @Override public&void&onClick(View&v)&{
switch&(v.getId())&{
case&R.id.capture_flashlight:
if&(isFlashlightOpen)&{
cameraManager.setTorch(false);&//&关闭闪光灯
isFlashlightOpen&=&
cameraManager.setTorch(true);&//&打开闪光灯
isFlashlightOpen&=&
} } private&void&showErrorDialog()&{
closeCamera();
viewfinderView.setVisibility(View.GONE);
AlertDialog.Builder&builder&=&new&AlertDialog.Builder(this);
builder.setTitle(getString(R.string.app_name));
builder.setMessage(&扫描确认出错,请重新扫描二维码!&);
builder.setPositiveButton(android.R.string.ok,&new&OnClickListener()&{
public&void&onClick(DialogInterface&dialog,&int&which)&{
restartCamera();
builder.setOnCancelListener(new&OnCancelListener()&{
public&void&onCancel(DialogInterface&dialog)&{
CaptureCodeActivity.this.finish();
builder.show(); }
void&restartCamera(){
Log.d(TAG,&&hasSurface&&&+&hasSurface);
viewfinderView.setVisibility(View.VISIBLE);
SurfaceView&surfaceView&=&(SurfaceView)&findViewById(R.id.preview_view);
SurfaceHolder&surfaceHolder&=&surfaceView.getHolder();
initCamera(surfaceHolder);
//&恢复活动监控器
inactivityTimer.onResume(); }
void&closeCamera(){
if&(handler&!=&null)&{
handler.quitSynchronously();
handler&=&
inactivityTimer.onPause();
//&关闭摄像头
cameraManager.closeDriver(); }}在扫描出现问题事弹出dialog,当用户点击确定按钮后重新开始扫描。private&void&showErrorDialog()&{
closeCamera();
viewfinderView.setVisibility(View.GONE);
AlertDialog.Builder&builder&=&new&AlertDialog.Builder(this);
builder.setTitle(getString(R.string.app_name));
builder.setMessage(&扫描确认出错,请重新扫描柜子上的二维码!&);
builder.setPositiveButton(android.R.string.ok,&new&OnClickListener()&{
public&void&onClick(DialogInterface&dialog,&int&which)&{
restartCamera();
builder.setOnCancelListener(new&OnCancelListener()&{
public&void&onCancel(DialogInterface&dialog)&{
CaptureCodeActivity.this.finish();
builder.show(); }
资深电脑人
二维码扫描的相关知识
其他1条回答
弄两个二维码
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁安卓-基于ZXing的二维码扫描解码Demo
最近在做毕设。需要有一个二维码扫描获取信息的模块。于是谷歌百度之,发现了开源库ZXing,于是果断研究起来。历时3天弄出了一个可直接应用的Demo。 扫描的整体思路是,启用相机获取有效的预览帧处理后交给ZXing解码。解码成功就会返回一个Result,可以用Res
最近在做毕设。需要有一个二维码扫描获取信息的模块。于是谷歌百度之,发现了开源库ZXing,于是果断研究起来。历时3天弄出了一个可直接应用的Demo。
扫描的整体思路是,启用相机获取有效的预览帧处理后交给ZXing解码。解码成功就会返回一个Result,可以用Result的方法获取需要的类型的数据。
运行本代码前,您需要下载ZXING JAR包并导入您的工程。下载地址:http://repo1.maven.org/maven2/com/google/zxing/core/
截至发布前,本工程使用的ZXING版本为core-3.1.0。
本Demo需要以下权限:
必须:&uses-permission android:name="android.permission.CAMERA"/&
可选:&uses-permission android:name="android.permission.FLASHLIGHT"/&
另附源码:import java.io.ByteArrayOutputS
import java.io.IOE
import java.util.HashM
import java.util.H
import java.util.L
import java.util.T
import java.util.TimerT
import android.app.A
import android.content.I
import android.graphics.B
import android.graphics.BitmapF
import android.graphics.ImageF
import android.graphics.R
import android.graphics.YuvI
import android.hardware.C
import android.hardware.Camera.AutoFocusC
import android.hardware.Camera.PreviewC
import android.hardware.Camera.S
import android.os.B
import android.util.DisplayM
import android.view.KeyE
import android.view.SurfaceH
import android.view.SurfaceV
import android.view.ViewGroup.LayoutP
import com.google.zxing.BinaryB
import com.google.zxing.ChecksumE
import com.google.zxing.DecodeHintT
import com.google.zxing.FormatE
import com.google.zxing.NotFoundE
import com.google.zxing.RGBLuminanceS
import com.google.zxing.R
import com.mon.HybridB
import com.google.zxing.qrcode.QRCodeR
public class QRCodeGetterActivity extends Activity implements
SurfaceHolder.Callback
private SurfaceV
private SurfaceH
private int catchW
private int catchH
private Camera.Parameters camP
private boolean isSupportAutoFocus =
private boolean isSupportF
private AutoFocusCallBack autoFocusC
private PreviewCallBack previewC
private boolean canDecode =
private DeCodeFrameP
Timer autoF
Timer handF
class AutoFocusCallBack implements AutoFocusCallback
public void onAutoFocus(boolean success, Camera camera)
canDecode =
class PreviewCallBack implements PreviewCallback
Rect rect = new Rect(0, 0, camParam.getPreviewSize().width,
camParam.getPreviewSize().height);
ByteArrayOutputS
public void onPreviewFrame(byte[] data, Camera camera)
if (!canDecode)
img = new YuvImage(data, ImageFormat.NV21,
camParam.getPreviewSize().width,
camParam.getPreviewSize().height, null);
baos = new ByteArrayOutputStream();
if (pressToJpeg(rect, 100, baos))
bm = BitmapFactory.decodeByteArray(baos.toByteArray(), 0,
baos.size());
Result result = decode.decode(bm);
if (result != null)
if (isSupportAutoFocus)
autoFocus.cancel();
handFocus.cancel();
String addr = result.getText();
Intent i = new Intent();
i.putExtra("QRStringData", addr);
setResult(Activity.RESULT_OK,i);
cam.startPreview();
canDecode =
class AutoFocusTimer extends TimerTask
public void run()
cam.autoFocus(autoFocusCallback);
class NotSupportAutoFocusTimer extends TimerTask
public void run()
canDecode =
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_catch_qr_code);
sv = (SurfaceView) findViewById(R.id.sv);
sh = sv.getHolder();
sh.addCallback(this);
LayoutParams lp = sv.getLayoutParams();
catchHeight = lp.
catchWidth = lp.
sh.setFixedSize(catchWidth, catchHeight);
sh.setKeepScreenOn(true);
decode = new DeCodeFramePicture();
public boolean onKeyUp(int keyCode, KeyEvent event)
super.onKeyUp(keyCode, event);
if (keyCode == KeyEvent.KEYCODE_BACK)
setResult(Activity.RESULT_CANCELED);
protected void onPause()
super.onPause();
if (isSupportAutoFocus)
autoFocus.cancel();
handFocus.cancel();
cam.stopPreview();
cam.release();
protected void onResume()
super.onResume();
cam = Camera.open();
camParam = cam.getParameters();
DisplayMetrics metric = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metric);
if (metric.widthPixels & metric.heightPixels)// 横竖屏问题
cam.setDisplayOrientation(90);
cam.setDisplayOrientation(0);
// 全屏预览,采用最高支持的Size宽高,绕开图像拉伸问题
List szs = camParam.getSupportedPreviewSizes();
Size sz = szs.get(szs.size() - 1);
camParam.setPreviewSize(sz.width, sz.height);
List focusMode = camParam.getSupportedFocusModes();
List flashLightMode = camParam.getSupportedFlashModes();
isSupportFlash = flashLightMode != null ? true :
// 闪光灯方式优选
if (isSupportFlash)
if (flashLightMode.contains(Camera.Parameters.FLASH_MODE_TORCH))
camParam.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
} else if (flashLightMode
.contains(Camera.Parameters.FLASH_MODE_AUTO))
camParam.setFlashMode(Camera.Parameters.FLASH_MODE_AUTO);
} else if (flashLightMode.contains(Camera.Parameters.FLASH_MODE_ON))
camParam.setFlashMode(Camera.Parameters.FLASH_MODE_ON);
// 对焦方式优选
if (focusMode.contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE))
camParam.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
} else if (focusMode.contains(Camera.Parameters.FOCUS_MODE_AUTO))
camParam.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
} else if (focusMode.contains(Camera.Parameters.FOCUS_MODE_MACRO))
camParam.setFocusMode(Camera.Parameters.FOCUS_MODE_MACRO);
isSupportAutoFocus =
List fpsRate = camParam.getSupportedPreviewFpsRange();
camParam.setPreviewFpsRange(fpsRate.get(0)[0], fpsRate.get(0)[1]);
//预览帧速率
camParam.setPreviewFormat(ImageFormat.NV21);
//仅支持NV21
cam.setParameters(camParam);
previewCallback = new PreviewCallBack();
cam.setPreviewCallback(previewCallback);
if (isSupportAutoFocus)
autoFocusCallback = new AutoFocusCallBack();
autoFocus = new Timer();
autoFocus.schedule(new AutoFocusTimer(), );
//自动对焦相机启动5秒后开始,每5秒对焦一次
handFocus = new Timer();
handFocus.schedule(new NotSupportAutoFocusTimer(), );
//手动对焦相机启动3秒后开始,每3秒解析一次
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height)
public void surfaceCreated(SurfaceHolder holder)
cam.setPreviewDisplay(holder);
cam.startPreview();
} catch (IOException e)
e.printStackTrace();
public void surfaceDestroyed(SurfaceHolder holder)
class DeCodeFramePicture
DeCodeFramePicture()
hints = new Hashtable();
hints.put(DecodeHintType.CHARACTER_SET, "utf-8");
reader = new QRCodeReader();
public Result decode(Bitmap bm)
int[] data = new int[bm.getHeight() * bm.getWidth()];
bm.getPixels(data, 0, bm.getWidth(), 0, 0, bm.getWidth(),
bm.getHeight());
RGBLuminanceSource source = new RGBLuminanceSource(bm.getWidth(),
bm.getHeight(), data);
bb = new BinaryBitmap(new HybridBinarizer(source));
return reader.decode(bb, hints);
} catch (ChecksumException e)
e.printStackTrace();
} catch (NotFoundException e)
e.printStackTrace();
} catch (FormatException e)
e.printStackTrace();
你最喜欢的ZXing二维码扫描自由旋转横坚屏解决方法
最近在做二维码扫描的项目,ZXing源码中的扫描是固定使用的横屏的扫描方式
第一次在改的横坚屏切换的时候,直接在mainfest.xml文件中的android:screenOrientation值删除或是改成sensor值,再将
initFromCameraParameters(Camera camera)函数下的
& if (width & height) {
& Log.i(TAG,
& "Display reports
this is incorrect");
& int temp =
& height =
这个if诗句注释,这样扫描框,还有那个红色横线就能随屏幕自由旋转了。
但是运行后发现,只有在默认的横屏下程序者正常的,旋转后相机画面与屏幕总是相关一个角度,在默认横屏下是正常的,在倒着横屏时差180度,在正坚着手机时差90度,倒坚着手机差270度,
后来在apkbus里找到一篇文章/forum.php?mod=viewthread&tid=59675,里面是用C++写的代码,应该是系统内核里的,但是里面提到了怎么修改这个角度值,但是总不能让我去修改每个手机的内核吧,但是这里的提到的角度值给了个启发,能不能判断当前手机的4个方向,再根据每个方向去旋转一下相机角度,将相机与屏幕匹配
后来在网上看到有很多方法将横屏改成坚屏,有个网友会总结下来,地址是.cn/s/blog_82f2fc280100yjrr.html
但是里面提到的方法都是将横屏改成坚屏,没做到自由旋转,里面有一个方法跟我在apkbus里看到的很类似,都是修改旋转角度,如下/?p=655965
在写相机相关应用的时候遇到捕获的画面方向和手机的方向不一致的问题,比如手机是竖着拿的,但是画面是横的,这是由于摄像头默认捕获的画面byte[]是根据横向来的,而你的应用是竖向的,解决办法是调用setDisplayOrientation来设置PreviewDisplay的方向,效果就是将捕获的画面旋转多少度显示。
设置 preview 的顺时针旋转角度。这将影响 preview frames
和拍照之后的相片显示。该方法主要用于垂直模式的应用。注意在旋转之前, front-facing cameras 的 preview
显示是水平 flip 的,这就是说, image 是沿着 camera sensor 的垂直中心轴来反射的
。所以用户可以像照镜子一样看到他们自己。这不会影响传入函数 onPreviewFrame(byte[], Camera) 的、
JPEG 相片的、或记录的 video 的 byte array 的顺序,你可以自己做旋转处理。在
preview 期间是不允许调用该方法的。如果你想要是你的照片和显示出来的角度一致,你可以参考下列代码:
public static void setCameraDisplayOrientation ( Activity activity ,
int cameraId , android.hardware.Camera camera ) {
android.hardware.Camera.CameraInfo info =
new android.hardware.Camera.CameraInfo();
android.hardware.Camera.getCameraInfo ( cameraId , info );
int rotation = activity.getWindowManager ().getDefaultDisplay ().getRotation ();
int degrees = 0 ;
switch ( rotation ) {
case Surface.ROTATION_0 : degrees = 0 ; break ;
case Surface.ROTATION_90 : degrees = 90 ; break ;
case Surface.ROTATION_180 : degrees = 180 ; break ;
case Surface.ROTATION_270 : degrees = 270 ; break ;
int result ;
if ( info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT ) {
result = ( info.orientation + degrees ) % 360 ;
result = ( 360 - result ) % 360 ;
// compensate the mirror
// back-facing
result = ( info.orientation - degrees + 360 ) % 360 ;
camera.setDisplayOrientation ( result );
刚开始我也不知道这个方法加在哪里,后来我查到,android系统在自动旋转屏幕后都会自己运行一个重载方法
&@Override
& & public void
surfaceChanged(SurfaceHolder holder, int format, int width, int
so我把上面的那个方法体就加到这个重载方法里,但是运行后,发现不论怎么旋转手机,相机画面与屏幕总是相差90度,至少不是前面的相差4个值了,因些只需要将最后计算出来的角度值result再旋转90度就OK了,因些就将result
90;(刚开始以为是+90,但是运行后报错)但是运行后报错,因为如果resut是0的时候,-90了就是-90了,但是在developer的reference中查到角度值范围是0-359,因此只好在switch中改成
switch (rotation)
& case Surface.ROTATION_0:
& & & degree =
& case Surface.ROTATION_90:
& & & degree =
& case Surface.ROTATION_180:
& & & degree =
& case Surface.ROTATION_270:
& & & degree =
& default:
运行,哈哈,搞定,欢迎参考
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

我要回帖

更多关于 zxing二维码扫描变形 的文章

 

随机推荐