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

前言

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

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

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

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

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

集成

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


轻松集成二维码扫描,及解决部分手机摄像头倒置问题_第1张图片
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

你可能感兴趣的:(轻松集成二维码扫描,及解决部分手机摄像头倒置问题)