注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

云水禅心

淡若秋菊何妨瘦, 清到梅花不畏寒.

 
 
 

日志

 
 

修改ZXing二维码扫描为竖屏模式  

2013-11-01 12:41:00|  分类: Android |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

http://blog.sina.com.cn/s/blog_705dc23f0101a78x.html


修改ZXing For Android 为竖屏模式,经过实践,可行方法如下:


1、修改AndroidManifest文件,将CaptureActivity设为portrait:

   代码为:android:configChanges="orientation|keyboardHidden"

           android:screenOrientation="portrait"


2、把摄像头预览景调为竖向,具体如下:

  1)在CameraConfigurationManager类里的setDesiredCameraParameters(Camera camera)方法里添加如下代  码:

//摄像头旋转90度

setDisplayOrientation(camera, 90);

 2)然后在CameraConfigurationManager类里面添加setDisplayOrientation(Camera camera, int angle)方法,方法具体代码如下:


    protected void setDisplayOrientation(Camera camera, int angle) {


        Method downPolymorphic;       


         try { 

             

             downPolymorphic = camera.getClass().getMethod("setDisplayOrientation", new Class[] { int.class });

       

             if (downPolymorphic != null)

                 

                 downPolymorphic.invoke(camera, new Object[] { angle });       

       

         } catch (Exception e1) {   

             e1.printStackTrace();

         }      


}   

3)最后,为了防止摄像头竖过来后图像拉伸的问题,需要在CameraConfigurationManager类中的initFromCameraParameters(Camera camera)方法的Log.d(TAG, "Screen resolution: " + screenResolution);语句后面添加如下代码:

//解决竖屏后图像拉伸问题

    Point screenResolutionForCamera = new Point();   

    screenResolutionForCamera.x = screenResolution.x;   

    screenResolutionForCamera.y = screenResolution.y;   

    // preview size is always something like 480*320, other 320*480

    if (screenResolution.x < screenResolution.y) {  

         screenResolutionForCamera.x = screenResolution.y;  

         screenResolutionForCamera.y = screenResolution.x;

    }

 cameraResolution = getCameraResolution(parameters, screenResolutionForCamera);

3、把CameraManager类中getFramingRectInPreview()方法中的代码做如下修改:

  将://横屏模式

      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;

4、在DecodeHandler类中的decode(byte[] data, int width, int height)方法中,在buildLuminanceSource调用前添加如下代码:

//竖屏

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

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

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

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

    }

    int tmp = width; // Here we are swapping, that's the difference to #11

    width = height;

    height = tmp;

至此,运行程序,竖屏模式完成。


原文中有点错误,已经有网友修正过来了,大家可以查看原文中的评论

429720284评论如下:楼主掉了一句很关键的代码   data = rotatedData;   加在 height = tmp; 后面就可以扫到结果了    把 PlanarYUVLuminanceSource source = CameraManager.get().buildLuminanceSource(data, width, height); 中的data换成 rotatedData   也可以  一个意思  

我用了data = rotatedData;   程序运行报错;后来采用了下面的方法

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

  评论这张
 
阅读(1546)| 评论(1)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018