Android 在线生成二维码和条形码,支持扫描和6.0以上权限适配

原创 2018年04月17日 16:06:19

最近项目要根据后台传递的string字符串等生成相应的条形码,供客户条码扫描枪机进行扫描识别.

以下是自己写的代码,已实现上述功能,代码仅供参考:

MainActivity.java

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private static final String TAG = "MainActivity";
    private             int    REQUEST_CODE_SCAN = 111;
    /**
     * 将要生成二维码的内容
     */
    private EditText  codeEdit;
    /**
     * 生成二维码代码
     */
    private Button    twoCodeBtn;
    /**
     * 用于展示生成二维码的imageView
     */
    private ImageView codeImg;
    /**
     * 生成一维码按钮 scanner
     */
    private Button    oneCodeBtn;
    /**
     * 二维码扫描
     */
    private Button    scannerBtn;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_main);
        initView();
        setListener();
    }

    /**
     * 用于初始化界面展示的view
     */
    private void initView() {
        codeEdit = (EditText) findViewById(R.id.code_edittext);
        twoCodeBtn = (Button) findViewById(R.id.code_btn);
        oneCodeBtn = (Button) findViewById(R.id.btn_code);
        scannerBtn = (Button) findViewById(R.id.scanner);
        codeImg = (ImageView) findViewById(R.id.code_img);

    }


    /**
     * 设置生成二维码和扫描二维码的事件
     */
    private void setListener() {
        twoCodeBtn.setOnClickListener(this);
        oneCodeBtn.setOnClickListener(this);
        scannerBtn.setOnClickListener(this);

    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn_code://一维码
                oneCodeCreate();
                break;
            case R.id.code_btn://二维码
                twoCodeCreate();
                break;
            case R.id.scanner:{
                AndPermission.with(this).permission(Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE).callback(new PermissionListener() {
                    @Override
                    public void onSucceed(int requestCode, @NonNull List<String> grantPermissions) {
                        Intent intent = new Intent(MainActivity.this, CaptureActivity.class);

                                /*ZxingConfig是配置类  可以设置是否显示底部布局,闪光灯,相册,是否播放提示音  震动等动能
                                * 也可以不传这个参数
                                * 不传的话  默认都为默认不震动  其他都为true
                                * */

                        ZxingConfig config = new ZxingConfig();
                        config.setPlayBeep(true);
                        config.setShake(true);
                        intent.putExtra(com.yzq.zxinglibrary.common.Constant.INTENT_ZXING_CONFIG, config);

                        startActivityForResult(intent, REQUEST_CODE_SCAN);
                    }

                    @Override
                    public void onFailed(int requestCode, @NonNull List<String> deniedPermissions) {

                        Uri packageURI = Uri.parse("package:" + MainActivity.this.getPackageName());
                        Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, packageURI);
                        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

                        startActivity(intent);

                        Toast.makeText(MainActivity.this, "没有权限无法扫描呦", Toast.LENGTH_LONG).show();
                    }
                }).start();
            }
                break;
            default:
                break;
        }
    }

    private void twoCodeCreate() {
        String str = codeEdit.getText().toString().trim();
        Bitmap bmp = null;
        try {
            if (str != null && !"".equals(str)) {
                bmp = CreateTwoDCode(str);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        if (bmp != null) {
            codeImg.setImageBitmap(bmp);
        }
    }

    private void oneCodeCreate() {
        String str = codeEdit.getText().toString().trim();
        int size = str.length();
        for (int i = 0; i < size; i++) {
            int c = str.charAt(i);
            if ((19968 <= c && c < 40623)) {
                Toast.makeText(MainActivity.this, "生成条形码的时刻不能是中文", Toast.LENGTH_SHORT).show();
                return;
            }
        }
        Bitmap bmp = null;
        try {
            if (str != null && !"".equals(str)) {
                bmp = CreateOneDCode(str);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        if (bmp != null) {
            codeImg.setImageBitmap(bmp);
        }
    }


    /**
     * 将指定的内容生成成二维码
     * @param content 将要生成二维码的内容
     * @return 返回生成好的二维码事件
     * @throws Exception WriterException异常
     */
    public Bitmap CreateTwoDCode(String content) throws Exception {
        // 生成二维矩阵,编码时指定大小,不要生成了图片以后再进行缩放,这样会模糊导致识别失败
        BitMatrix matrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, 300, 300);
        int width = matrix.getWidth();
        int height = matrix.getHeight();
        // 二维矩阵转为一维像素数组,也就是一直横着排了
        int[] pixels = new int[width * height];
        for (int y = 0; y < height; y++) {
            for (int x = 0; x < width; x++) {
                if (matrix.get(x, y)) {
                    pixels[y * width + x] = 0xff000000;
                }
            }
        }

        Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
        // 通过像素数组生成bitmap,具体参考api
        bitmap.setPixels(pixels, 0, width, 0, 0, width, height);
        return bitmap;
    }


    /**
     * 用于将给定的内容生成成一维码 注:目前生成内容为中文的话将直接报错,要修改底层jar包的内容
     * @param content 将要生成一维码的内容
     * @return 返回生成好的一维码bitmap
     * @throws WriterException WriterException异常
     */
    public Bitmap CreateOneDCode(String content) throws WriterException {
        // 生成一维条码,编码时指定大小,不要生成了图片以后再进行缩放,这样会模糊导致识别失败
        BitMatrix matrix = new MultiFormatWriter().encode(content, BarcodeFormat.CODE_128, 500, 200);
        int width = matrix.getWidth();
        int height = matrix.getHeight();
        int[] pixels = new int[width * height];
        for (int y = 0; y < height; y++) {
            for (int x = 0; x < width; x++) {
                if (matrix.get(x, y)) {
                    pixels[y * width + x] = 0xff000000;
                }
            }
        }
        Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
        // 通过像素数组生成bitmap,具体参考api
        bitmap.setPixels(pixels, 0, width, 0, 0, width, height);
        return bitmap;
    }

    @Override
    public 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 url = "";
                try {
                    url = data.getStringExtra(com.yzq.zxinglibrary.common.Constant.CODED_CONTENT);
                    Intent intent = new Intent();
                    //Intent intent = new Intent(Intent.ACTION_VIEW,uri);
                    Log.e(TAG, "url------" + url);
                    intent.setAction("android.intent.action.VIEW");
                    Uri content_url = Uri.parse(url);
                    intent.setData(content_url);
                    startActivity(intent);
                } catch (Exception e) {
                    Toast.makeText(this, url, Toast.LENGTH_SHORT).show();
                }
            }
        }

    }
}

2. xml文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/white"
    android:orientation="vertical">
    <RelativeLayout
        android:id="@+id/title_layout"
        android:layout_width="match_parent"
        android:layout_height="@dimen/dp_48"
        android:layout_marginLeft="@dimen/dp_14"
        android:layout_marginRight="@dimen/dp_14">
        
        <TextView
            android:id="@+id/title_text"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:text="二维码"
            android:textSize="@dimen/sp_16"/>
        
    </RelativeLayout>

    <EditText
        android:id="@+id/code_edittext"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text=""/>

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:layout_marginTop="@dimen/dp_20"
        android:orientation="horizontal">

        <Button
            android:id="@+id/code_btn"
            android:layout_width="@dimen/dp_100"
            android:layout_height="@dimen/dp_40"
            android:text="生成二维码"/>

        <Button
            android:id="@+id/btn_code"
            android:layout_width="@dimen/dp_100"
            android:layout_height="@dimen/dp_40"
            android:text="生成一维码">
        </Button>
          <Button
              android:id="@+id/scanner"
              android:layout_width="@dimen/dp_100"
              android:layout_height="@dimen/dp_40"
              android:text="二维码扫描">
        </Button>
    
    </LinearLayout>

    

   

    <ImageView
        android:id="@+id/code_img"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:layout_marginTop="@dimen/dp_20"/>
    
    </LinearLayout>

3.build.gradle

apply plugin: 'com.android.application'

android{
    compileSdkVersion 26
    defaultConfig{
        applicationId "com.wcyq.zxingdemo"
        minSdkVersion 16
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"
        multiDexEnabled true
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    dexOptions{
        //   incremental true
        javaMaxHeapSize "4g"
        preDexLibraries = false
    }
    buildTypes{
        release{
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies{
    compile fileTree(include: ['*.jar'], dir: 'libs')
    compile 'com.android.support:appcompat-v7:25.1.0'
    compile 'com.android.support.constraint:constraint-layout:1.0.2'
    compile 'junit:junit:4.12'
    compile 'com.android.support.test:runner:1.0.1'
    compile 'com.android.support.test.espresso:espresso-core:3.0.1'
    implementation project(':zxinglibrary')//这个是趴zxing源码弄出来的依赖库
    compile 'com.yanzhenjie:permission:1.1.0'//权限适配
}

效果图:

1.扫描效果,支持照片选择和手电筒


2.二维码生成:


3. 根据给的字符串生成条形码.


备注: 以上生成的图片均可以扫描识别里面的内容, 或者各位可以通过截图的方式保存到本地后,再用上面的demo适配里面的图片,进行验证:

为了方面有需要的朋友代码Copy, 特地没有有上传CSDN(因为需要积分可以下载).而是上传了github,如果觉得能帮助到各位,请给我的github点个赞或者follow下,谢谢:

源码地址;https://github.com/wolfking0608/ZxingDemo

安卓6.0权限适配(1)

首先系统介绍一下6.0权限以及初步处理方法,下一遍文章将会使用更简单易懂的方法去解决安卓6.0权限问题。 Android6.0带来了新的权限管理方式,本文主要来源于官方文档,加入了自己的理解,目的是...
  • windboy2014
  • windboy2014
  • 2016-09-11 08:55:42
  • 1056

Android6.0以上权限申请

Android6.0以上权限单个、多个申请
  • u013472738
  • u013472738
  • 2016-09-05 16:25:09
  • 1708

Android基于Google Zxing实现二维码/条形码扫描、生成二维码/条形码

 二维码/条形码生成器 二维码/条形码扫描器 一、二维码与条形码工作原理 目前的很多应用上都有扫码功能,当时微信推出二维码扫码功能时,觉得imagine...
  • u012721519
  • u012721519
  • 2016-06-22 21:35:22
  • 12469

android高版本v4包解决Android6.0以上系统权限问题

  • 2017年11月17日 17:58
  • 1.13MB
  • 下载

Android二维码开源项目zxing用例简化和生成二维码、条形码

上一篇讲到:Android二维码开源项目zxing编译,编译出来后有一个自带的测试程序:CaptureActivity比较复杂,我只要是把一些不用的东西去掉,用看起来更方便,二维码和条形码的流行性自不...
  • deng0zhaotai
  • deng0zhaotai
  • 2014-07-30 20:55:34
  • 4639

Android基于Zxing实现二维码,条形码扫描和生成二维码

由于模拟器原因,所以无法看到二维码扫描功能,这个在真机上测试时完全没有问题,当你扫描一个二维码完成后会自动返回到主页面将结果显示到“扫描内容”模块; 然后下面的就是生成二维码; 这两个功能...
  • Zheng_Jiao
  • Zheng_Jiao
  • 2016-05-26 14:38:19
  • 2109

关于Android6.0权限适配的问题

1.适配的背景           由于Android系统的碎片化严重,适配成了不可或缺的重要步骤;最近在项目中负责Android6.0的各种危险权限的适配,今天借此机会,向大家分享一下适配的原理。...
  • zhangxing52077
  • zhangxing52077
  • 2016-12-08 21:11:31
  • 2369

关于Android6.0以上系统的权限问题

一、前言 在我们Android6.0以前,我们在开发时候不需要动态的在代码中添加权限,只需要在manifast.xml中配置我们所需要的权限即可,因为在我们安装时,会有一个权限列表,包含了所有我们在...
  • Administratortwd
  • Administratortwd
  • 2017-07-11 10:42:39
  • 767

android 6.0 7.0 不一样的处理权限适配

android 6.0,7.0 网上适配很多 了,这里给你一个方法,设置 android:targetSdkVersion=“22 ” 这句话下面可以解释,android 6.0 .7.0 手机自动...
  • u012922981
  • u012922981
  • 2017-07-19 16:44:05
  • 1085

关于android6.0权限适配6.0系统以下的问题总结(二维码扫描)

adnroid6.0系统的权限问题在一般情况下可以直接申请,但在某些情况下,会出现6.0以下系统调用权限申请时,系统给出的判断直接是申请成功,此时,我们就需要一些特殊的处理,来适配6.0以下的系统,本...
  • a243981326
  • a243981326
  • 2016-10-19 16:50:36
  • 1923
收藏助手
不良信息举报
您举报文章:Android 在线生成二维码和条形码,支持扫描和6.0以上权限适配
举报原因:
原因补充:

(最多只允许输入30个字)