前言
最近一个项目需要添加一个二维码扫描登录的功能,那说到二维码扫描,不得不提的是Google一个开源的扫码框架:zxing。
zxing是基于多种1D/2D条码处理的开源库,是一个完整的项目。它可以通过手机摄像头实现条码的扫描以及解码,功能及其强大。
开源地址:https://github.com/zxing/zxing/
那么如果仅仅只是要实现二维码的扫描以及解码的话,不足以用到所有代码,需要在该开源项目的基础上进行简化,提炼出所需要的代码部分。
源码的具体细节就不多阐述了,网上一大堆的详解,这次主要讲的是在如何快速在项目集成zxing二维码以及在集成时遇到的一些问题。
集成
准备好简化后的zxing代码(代码下载地址在文章末尾给出)要想集成至项目相当简单。
第一步
将其以library形式导入项目中。
第二步
在你需要调用的地方,跳转至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);
}
使用
只需在打开相机设备时调用该方法即可~这样就能适配所有机型拉。
ps:这个简化后的zxing代码已经将这部分内同添加进去了,所以只要按照上面得方法将此份代码作为library集成之后就都不会有问题拉~
文末
因为自己也是处于学习阶段,写写博客也只是为了,把自己遇到过得问题记录下来,如果能帮到大家那是最好不过得拉,但是如果有哪些写的不对得地方也请指出~~大家共同学习。
接着附上代码连接:
http://pan.baidu.com/s/1nvHPsP7