将zxing部署到自己的项目中

这两天做毕业设计,需要用到二维码所以就要用到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项目中了。如有不足希望大家理解,同时也希望大神出来指点。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值