这两天做毕业设计,需要用到二维码所以就要用到zxing,在网上查了一圈大部分都是自己部署的,篇幅很长有的年代也很久远了,就懒得看了,所以干脆自己来吧。在此记录一下。
1.先在GitHub上将demo下载下来 https://github.com/zxing/zxing
2.下载完成后是一个压缩包,解压完成是一个zxing-master的文件,目录结构为:
这里我们只要android和android-core两个文件就可以了。
3.下载jar包
http://central.maven.org/maven2/com/google/zxing/core/3.3.3/core-3.3.3.jar
4.新建一个Android studio项目
点击File——New——Import Moudel将下载下来的android文件导入。
5.改错之旅正式开始
(1).项目导入之后出现:
这是因为不允许在manifest中设置关于sdk版本。
将选中的代码删除即可。
(2).删除后点击try again不会报错了,千万别开心得太早
打开android moudel中的build gradel将sdk版本与app中的sdk版本保持一致。
我这里编译版本使用的是28,根据你使用的来设置。
(3).然后你就发现android模块中会出现大量的错误(可以点击打开看看,不打开是不显示的),这个时候就要用到我们刚才下载好的jar包了。
选中android,右键单击new——directory,名字设置为libs,将下载好的jar复制到ibs中,然后再右键单击jar包,点击Add As Library。
这样错误就会几乎全部消失了,但是在CameraConfigurationManager这个类中还是有错,显示的是找不到CameraConfigurationUtils,怎么办呢,没有这个类就添加一个呗。回到我们下载好的zxing-master这个文件中,这次我们就用到了android-core这个文件了。
将这个类复制到android的camera下。语法这样错误就全部消失了。那么这个模块是不是就直接能使用了呢,当然不是。我们继续。
(4).添加依赖
点击这个图标
然后点击左侧的app,然后再点击Dependencies,再点击右侧的加号,选择module dependency,选中android点击ok。
之后又出错了,来看看吧。
这是因为android没有被当作一个library来使用,打开build gradle,将第一行的
apply plugin: 'com.android.application'改为 apply plugin: 'com.android.library'
然后try again,再一次出错了,错误信息:
这次错误就很明显了,Library项目不能设置applicationId,连我这个英语这么渣的人都能看懂,相信大家都能看懂。
删除选中的这行代码。再点击try again就没有错误了。 改错之旅差不多了,下面先运行一下看看吧。
6.修改app中的MainActivity的代码和布局文件。
MianAtivity:
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import com.google.zxing.client.android.CaptureActivity;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = (Button)findViewById(R.id.scanner_QRcode);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, CaptureActivity.class);
startActivity(intent);
}
});
}
}
CaptureActivity就是扫描二维码的活动。
activity_main.layout:
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<Button
android:id="@+id/scanner_QRcode"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="扫描二维码"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>
很简单的布局。接下来运行项目。又出错了,继续改吧。
这是我们android这个library又出错了。打开其中一个:
系统提示是:Resource IDs cannot be used in a switch statement in Android library modules
就是在library项目中不允许使用id.既然不能用id,也就不能用switch了,只有使用if..elseif了。选中switch然后alt+enter. 点击Replace 'switch' with 'if'。把错误出错的文件都进行这样的修改。
然后Rebuild项目。
恭喜又出错了,真让人刺激,看看错误信息:
似乎是两个Manifest文件中有些属性冲突了,看下面的suggestion,可以使用添加tools:replace="android:icon"来解决。如:
在app的manifest中添加:
我这里直接把android中的关于application的属性全部都删除了(反正只是一个library又不用他运行)。
再一次rebuild,就不会出错了。点击运行按钮。看看还有没有surprise。
果然不出所料,事情肯定不会这么顺利。
这是因为我们没有给应用授予照相机权限的原因。因为是敏感权限所以需要动态申请权限。
上代码:修改MainActivity.class代码:
import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import com.google.zxing.client.android.CaptureActivity;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = (Button)findViewById(R.id.scanner_QRcode);
if(ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CAMERA)
!= PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.CAMERA},1);
}
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, CaptureActivity.class);
startActivity(intent);
}
});
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode){
case 1:
if(grantResults.length>0){
if(grantResults[0]!=PackageManager.PERMISSION_GRANTED){
Toast.makeText(MainActivity.this,"必须授权才能进行",Toast.LENGTH_SHORT).show();
finish();
return;
}
}else {
Toast.makeText(MainActivity.this,"发生未知错误",Toast.LENGTH_SHORT).show();
finish();
}
}
}
}
授予权限之后就可以顺利使用了。
7.一些其他的问题
(1).我们运行项目后会发现生成两个app,名字都是条码扫描器。这是因为我们的android也生成了app,想让它不生成的话,修改代码:
打开android中的Manifest文件。
删除选中的这行代码。再次运行。
(2).扫描活动是横屏的
打开android中的Manifest文件,将Capture Activity中的screenOrientation设置为portrait。
这样zxing就部署到一个Android项目中了。如有不足希望大家理解,同时也希望大神出来指点。