美文网首页android开源APPAndroid开发经验谈Android知识
轻松集成二维码扫描,及解决部分手机摄像头倒置问题

轻松集成二维码扫描,及解决部分手机摄像头倒置问题

作者: XiaoDun | 来源:发表于2017-04-28 19:16 被阅读299次
    前言

    最近一个项目需要添加一个二维码扫描登录的功能,那说到二维码扫描,不得不提的是Google一个开源的扫码框架:zxing。

    zxing是基于多种1D/2D条码处理的开源库,是一个完整的项目。它可以通过手机摄像头实现条码的扫描以及解码,功能及其强大。

    开源地址:https://github.com/zxing/zxing/

    那么如果仅仅只是要实现二维码的扫描以及解码的话,不足以用到所有代码,需要在该开源项目的基础上进行简化,提炼出所需要的代码部分。

    源码的具体细节就不多阐述了,网上一大堆的详解,这次主要讲的是在如何快速在项目集成zxing二维码以及在集成时遇到的一些问题。

    集成

    准备好简化后的zxing代码(代码下载地址在文章末尾给出)要想集成至项目相当简单。
    第一步
    将其以library形式导入项目中。


    Paste_Image.png

    第二步
    在你需要调用的地方,跳转至CaptureActivity即可。

     private static final int REQUEST_CODE_SCAN = 0x0000;
     getEditIpAccountFab().setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(getActivity(), CaptureActivity.class);
                    getActivity().startActivityForResult(intent, REQUEST_CODE_SCAN);
    }
    

    第三步:
    接收扫码结果的回传。

    //先取出二维码的内容
    String content = data.getStringExtra(DECODED_CONTENT_KEY);
    
    //在对字符串进行截取,然后解析。我是用#号用来区分IP及端口号(形式:XXXXXXX#XXXX)
     Configure.setString(Configure.SocketClientRemoteIP, content.substring(0,content.indexOf("#")));
     Configure.setString(Configure.SocketClientRemotePort, content.substring(content.indexOf("#")+1,content.indexOf("#",content.indexOf("#")+1)));
    

    二维码解析后无非就是一段字符串,根据个人不同的需求,对字符串进行截取,解析即可。
    完整代码:

        private static final int REQUEST_CODE_SCAN = 0x0000;
        private static final String DECODED_CONTENT_KEY = "codedContent";
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            // 扫描二维码回传
            if (requestCode == REQUEST_CODE_SCAN && resultCode == RESULT_OK) {
                if (data != null) {
                    String content = data.getStringExtra(DECODED_CONTENT_KEY);
                    Configure.setString(Configure.SocketClientRemoteIP, content.substring(0,content.indexOf("#")));
                    Configure.setString(Configure.SocketClientRemotePort, content.substring(content.indexOf("#")+1,content.indexOf("#",content.indexOf("#")+1)));
                    AssistantSocketClient.getInstance().connect();
                    if (!AssistantSocketClient.getInstance().isDisconnected()){
                        mMediaPcSettingController.getConnect_or_discon().setText("断开连接");
                        mMediaPcSettingController.getEditIpAccountFab().setIcon(R.drawable.ic_mode_fork_white_24dp);
                    }
    
                }
            }
        }
    
    问题

    一开始集成完了之后,就马上进行测试,但是发现了一个问题,摄像头居然是颠倒得,于是我就立马上网查找相关资料,发现原来是手机在出厂时摄像头是倒置得,于是马上用了别的机型测试后发现一切正常(吐槽:android不同机型之间得适配真的是麻烦啊。。),那问题还是得解决吧,既然它是倒置那就我们手动将摄像机得参数修改回来就行了,不多说直接上代码:

    public  void setCameraDisplayOrientation(Activity activity) {
      android.hardware.Camera.CameraInfo info = new android.hardware.Camera.CameraInfo();
      android.hardware.Camera.getCameraInfo(0, 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
      } else {  // back-facing
          result = (info.orientation - degrees + 360) % 360;
      }
      camera.setDisplayOrientation(result);
    }
    
    

    使用
    只需在打开相机设备时调用该方法即可~这样就能适配所有机型拉。


    Paste_Image.png

    ps:这个简化后的zxing代码已经将这部分内同添加进去了,所以只要按照上面得方法将此份代码作为library集成之后就都不会有问题拉~

    文末

    因为自己也是处于学习阶段,写写博客也只是为了,把自己遇到过得问题记录下来,如果能帮到大家那是最好不过得拉,但是如果有哪些写的不对得地方也请指出~~大家共同学习。
    接着附上代码连接:
    http://pan.baidu.com/s/1nvHPsP7

    相关文章

      网友评论

        本文标题:轻松集成二维码扫描,及解决部分手机摄像头倒置问题

        本文链接:https://www.haomeiwen.com/subject/sgvozttx.html