二维码的扫描和生成--第三方开源--ZXing

ZXing的二维扫码功能的提取lib下载地址:

https://github.com/xuyisheng/ZXingLib

1.  扫描二维码:

2.  我们扫描就是要用到这个CaptyreActivity类,直接把上面下载地址里面下载了里面的

Libzxing作为Module,如下图:

 

 

首先加上权限

  <!-- 振动 -->

 <uses-permission android:name="android.permission.CAMERA"/>

    <!-- 振动 -->

    <uses-permission android:name="android.permission.VIBRATE"/>

我们既然把它作为Module了,那么我们也是可以拿来直接用,这里我们可以直接把依赖里面的关于CaptureActivity类的AndroidManifest.xml的注册信息拷贝过来放在我们这个项目中;

<activity

            android:name="com.xys.libzxing.zxing.activity.CaptureActivity"

            android:configChanges="orientation|keyboardHidden"

            android:screenOrientation="portrait"

            android:theme="@android:style/Theme.NoTitleBar.Fullscreen"

            android:windowSoftInputMode="stateAlwaysHidden">

 

        </activity>

我们在activity_main.xml中声明一个Button:

<Button

        android:id="@+id/btnSan"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:text="扫描二维码"/>

在JAVA代码中,初始化后添加点击事件:

findViewById(R.id.btnSan).setOnClickListener(new View.OnClickListener() {

            @Override

            publicvoid onClick(View v) {

                startActivityForResult(new Intent(MainActivity.this, CaptureActivity.class), 0);

            }

        });

 

查看返回的结果就在activity_main.xml中添加一个TextView查看:

 

<TextView

        android:id="@+id/tv_content"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"/>

 

 

初始化后在JAVA代码中添加返回的代码:

 @Override

    protectedvoid onActivityResult(intrequestCode, int resultCode, Intent data) {

        // TODO Auto-generated method stub

        super.onActivityResult(requestCode,resultCode, data);

        if(resultCode == RESULT_OK) {

            String result =data.getExtras().getString("result");

            tv_content.setText(result);

        }

    }

这样我们就可以看到返回的东西了,下面以微信为例子得到的结果;



2.生成二维码;

二维码生成起来,我们需要个元素,要生成的内容,生成的按钮,生成内容的存放,所以我们layout_main.xml里面要添加这样的

 <EditText

        android:id="@+id/et_input"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:layout_below="@+id/tv_content"

        android:layout_marginTop="10dp"

        android:hint="请输入要生成的二维码文字"/>

 

    <Button

        android:id="@+id/btn_generate"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:layout_below="@+id/et_input"

        android:layout_marginTop="10dp"

        android:text="生成二维码"/>

 

    <ImageView

        android:id="@+id/img"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

       android:layout_below="@+id/btn_generate"

        android:layout_centerHorizontal="true"

        android:layout_marginTop="10dp"/>

 

 

我们把这几个控件都初始化一下,然后在Button的点击事件中写;

findViewById(R.id.btn_generate).setOnClickListener(new View.OnClickListener() {

            @Override

            publicvoid onClick(View v) {

                String str =et_input.getText().toString();

                if(str.equals("")) {

                   Toast.makeText(MainActivity.this, "不能为空", Toast.LENGTH_SHORT).show();

                } else {

                    // 位图

                    try {

                        /**

                         * 参数:1.文本 2 3.二维码的宽高 4.二维码中间的那个logo

                         */

                        Bitmap bitmap =EncodingUtils.createQRCode(str, 500, 500, null);

                        // 设置图片

                       img.setImageBitmap(bitmap);

                    } catch (Exception e) {

                        // TODO Auto-generated catch block

                        e.printStackTrace();

                    }

                }

            }

        });

我们来运行一下,二维码就简单生成了


当然这个是没有logo的,如果需要添加logo的话,只需

Bitmap bitmap =EncodingUtils.createQRCode(str, 500, 500, null);

 

后面的空该为自己需要的logo就可以了

 

 

 

下面是完整的代码:

<?xml version="1.0"encoding="utf-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

    xmlns:tools="http://schemas.android.com/tools"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:paddingBottom="@dimen/activity_vertical_margin"

    android:paddingLeft="@dimen/activity_horizontal_margin"

    android:paddingRight="@dimen/activity_horizontal_margin"

    android:paddingTop="@dimen/activity_vertical_margin"

    tools:context="com.zzw.testerweima.MainActivity">

 

    <Button

        android:id="@+id/btnSan"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:text="扫描二维码"/>

 

    <TextView

        android:id="@+id/tv_content"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:layout_below="@+id/btnSan"

        android:layout_centerHorizontal="true"

        android:layout_marginTop="10dp"/>

 

    <EditText

        android:id="@+id/et_input"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:layout_below="@+id/tv_content"

        android:layout_marginTop="10dp"

        android:hint="请输入要生成的二维码文字"/>

 

    <Button

        android:id="@+id/btn_generate"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:layout_below="@+id/et_input"

        android:layout_marginTop="10dp"

        android:text="生成二维码"/>

 

    <ImageView

        android:id="@+id/img"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:layout_below="@+id/btn_generate"

        android:layout_centerHorizontal="true"

        android:layout_marginTop="10dp"/>

</RelativeLayout>

 

 

package com.zzw.testerweima;

 

import android.content.Intent;

import android.graphics.Bitmap;

import android.support.v7.app.AppCompatActivity;

import android.os.Bundle;

import android.util.Log;

import android.view.View;

import android.widget.EditText;

import android.widget.ImageView;

import android.widget.TextView;

import android.widget.Toast;

 

importcom.xys.libzxing.zxing.activity.CaptureActivity;

importcom.xys.libzxing.zxing.encoding.EncodingUtils;

 

publicclass MainActivity extendsAppCompatActivity {

 

    private TextView tv_content;

    private EditText et_input;

    private ImageView img;

 

    @Override

    protectedvoid onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        tv_content = (TextView)findViewById(R.id.tv_content);

        et_input = (EditText)findViewById(R.id.et_input);

        img = (ImageView) findViewById(R.id.img);

 

       findViewById(R.id.btnSan).setOnClickListener(newView.OnClickListener() {

            @Override

            publicvoid onClick(View v) {

                startActivityForResult(new Intent(MainActivity.this, CaptureActivity.class), 0);

            }

        });

 

       findViewById(R.id.btn_generate).setOnClickListener(new View.OnClickListener() {

            @Override

            publicvoid onClick(View v) {

                String str =et_input.getText().toString();

                if(str.equals("")) {

                   Toast.makeText(MainActivity.this, "不能为空", Toast.LENGTH_SHORT).show();

                } else {

                    // 位图

                    try {

                        /**

                         * 参数:1.文本 2 3.二维码的宽高 4.二维码中间的那个logo

                         */

                        Bitmap bitmap =EncodingUtils.createQRCode(str, 500, 500, null);

                        // 设置图片

                       img.setImageBitmap(bitmap);

                    } catch (Exception e) {

                        // TODO Auto-generated catch block

                        e.printStackTrace();

                    }

                }

            }

        });

    }

 

    @Override

    protectedvoid onActivityResult(int requestCode,int resultCode, Intent data) {

        // TODO Auto-generated method stub

        super.onActivityResult(requestCode,resultCode, data);

        if(resultCode == RESULT_OK) {

            String result =data.getExtras().getString("result");

           Log.d("Main", result);

            tv_content.setText(result);

        }

    }

}

最后说明:

想要兼容6.0以上的android需要自己加动态权限申请,加在自己的项目里就行,不用更改引用库。如下:

if(ContextCompat.checkSelfPermission(this,Manifest.permission.CAMERA)!=PackageManager.PERMISSION_GRANTED){ //动态申请相机权限

    //申请WRITE_EXTERNAL_STORAGE权限

    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA},1);

}    

if(ContextCompat.checkSelfPermission(this,Manifest.permission.READ_EXTERNAL_STORAGE)!=PackageManager.PERMISSION_GRANTED)

 { //动态申请存储权限

            //申请WRITE_EXTERNAL_STORAGE权限

            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},1);

}    

<!-- 自动聚焦权限 -->
    <uses-feature android:name="android.hardware.camera.autofocus" />(自动聚焦权限可以不用)

还要更改自己项目里AndroidManifest.xml的调用引用库里活动的属性 如下:

 android:theme="@style/Theme.AppCompat.Light.NoActionBar"


转载自:https://www.cnblogs.com/zzw1994/p/5197758.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Android Studio中使用二维码扫描生成功能需要借助zxing.jar包。zxing是一个开源二维码处理库,可以实现二维码扫描生成。 首先,我们需要将zxing.jar包添加到我们的Android Studio项目中。可以通过两种方式来导入这个库。一种方式是将zxing.jar包拷贝到app/libs目录下,然后在build.gradle文件中添加依赖。另一种方式是通过在build.gradle文件的dependencies中添加远程依赖来导入库。如下所示: ``` dependencies { implementation 'com.google.zxing:core:3.4.1' } ``` 导入zxing.jar包后,我们就可以使用其中的类和方法来实现二维码扫描生成。 要实现二维码扫描功能,我们可以使用IntentIntegrator类。在需要扫描二维码的地方,调用IntentIntegrator的initiateScan方法即可启动扫描界面。扫描结果可以通过onActivityResult方法来获取。可以参考下面的代码片段: ``` IntentIntegrator integrator = new IntentIntegrator(this); integrator.setCaptureActivity(CustomCaptureActivity.class); //自定义扫描界面 integrator.setOrientationLocked(false); integrator.initiateScan(); @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); IntentResult result = IntentIntegrator.parseActivityResult(requestCode, resultCode, data); if (result != null) { if (result.getContents() == null) { //扫描取消 } else { String content = result.getContents(); //获取扫描结果 } } } ``` 要实现二维码生成功能,我们可以使用MultiFormatWriter类和BitMatrix类。我们可以通过调用MultiFormatWriter的encode方法来生成BitMatrix,然后将BitMatrix转换成Bitmap。可以参考下面的代码片段: ``` MultiFormatWriter writer = new MultiFormatWriter(); try { BitMatrix bitMatrix = writer.encode(content, BarcodeFormat.QR_CODE, width, height); int[] pixels = new int[width * height]; for (int y = 0; y < height; y++) { int offset = y * width; for (int x = 0; x < width; x++) { pixels[offset + x] = bitMatrix.get(x, y) ? Color.BLACK : Color.WHITE; } } Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); bitmap.setPixels(pixels, 0, width, 0, 0, width, height); imageView.setImageBitmap(bitmap); //在ImageView中显示生成二维码 } catch (WriterException e) { e.printStackTrace(); } ``` 通过以上步骤,我们就可以在Android Studio中实现二维码扫描生成功能了。注意,在使用zxing库的时候,我们需要添加相关的权限,如相机权限等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值