实现Zxing二维码扫描和生成---笔记

二维码现在已经很普及了,很多应用都会用到所以在这里写一篇关于二维码的帖子

首先:要在对应的Module的build.gradle中添加compile 必须添加
compile ‘cn.yipianfengye.android:zxing-library:2.2’

随着Android Studio的版本的改变,外加引入不一样的依赖会出现V4V7包冲突的情况这个时候就需要在加入冲突处理

//注:这个冲突处理写在要在对应的Module的build.gradle中的android{}之中
configurations.all {
        resolutionStrategy.eachDependency { DependencyResolveDetails details ->
            def requested = details.requested
            if (requested.group == 'com.android.support') {
                if (!requested.name.startsWith("multidex")) {
                    details.useVersion '27.1.1'
                }
            }
        }
    }

写完基本的东西后就需要在全局对Zxing进行初始化写一个Applicable文件,并在AndroidManifest文件中注册
❌不然会报组件未初始化错误❌

初始化也是很简单的,只需要一句话

ZXingLibrary.initDisplayOpinion(this);

众所周知,扫描二维码需要的用到摄像头所以就需要在AndroidManifest中写上对应的权限。

    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.FLASHLIGHT" />
    <uses-feature android:name="android.hardware.camera" />
    <uses-feature android:name="android.hardware.camera.autofocus" />
    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.INTERNET" />

准备工作也就这样完成了
接下来就是写一个布局文件实现两个按钮一个是扫描的按钮,一个是生成的按钮还有一个图片,布局过于简单就不写了。

    public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    //返回数据的一个常量
    int REQUEST_CODE = 500;
    //俩按钮
    private Button button1;
    private Button button2;
    Bitmap mBitmap;
    //图片
    ImageView image;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();//初始化控件
    }
//第二页面返回的数据
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (requestCode == REQUEST_CODE) {
            if (data != null) {
                Bundle bundle = data.getExtras();
                if (bundle != null) {
                    if (bundle.getInt(CodeUtils.RESULT_TYPE) == CodeUtils.RESULT_SUCCESS) {
                        String string = bundle.getString(CodeUtils.RESULT_STRING);
                        Toast.makeText(this, "" + string, Toast.LENGTH_SHORT).show();
                    } else {
                        Toast.makeText(MainActivity.this, "解析二维码失败", Toast.LENGTH_LONG).show();
                    }
                }
            }
        }

    }
//初始化控件
    private void initView() {
        button1 = (Button) findViewById(R.id.button1);
        button2 = (Button) findViewById(R.id.button2);
        image = findViewById(R.id.image);

        button1.setOnClickListener(this);
        button2.setOnClickListener(this);
    }
//实现的点击
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.button1:
            	//进入到第二页面去扫描二维码
                Intent intent = new Intent(MainActivity.this, CaptureActivity.class);
                startActivityForResult(intent, REQUEST_CODE);
                break;
            case R.id.button2:
            	//生成一个二维码
                String textContent = "Abcd";
                mBitmap = CodeUtils.createImage(textContent, 400, 400, BitmapFactory.decodeResource(getResources(),
                        R.mipmap.ic_launcher));
                image.setImageBitmap(mBitmap);
                break;
        }
    }
}

扫描页面:
布局:------LinearLayout

<Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom|center_horizontal"
        android:layout_marginLeft="20dp"
        android:layout_marginTop="20dp"
        android:layout_marginRight="20dp"
        android:layout_marginBottom="10dp"
        android:onClick="exit"
        android:text="取消退出二维码" />


    <FrameLayout
        android:id="@+id/fl_my_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"

        />

这个是用于自定义的扫描框的布局

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <SurfaceView
        android:id="@+id/preview_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />
    <com.uuzuche.lib_zxing.view.ViewfinderView
        android:id="@+id/viewfinder_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:inner_corner_color="@color/mColor"
        app:inner_corner_length="30dp"
        app:inner_corner_width="5dp"
        app:inner_height="200dp"
        app:inner_margintop="150dp"
        app:inner_scan_bitmap="@drawable/scan_image"
        app:inner_scan_iscircle="false"
        app:inner_scan_speed="10"
        app:inner_width="200dp"
        />

</FrameLayout>

接下来就是扫描页面的java文件

public class CaptureActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_capture);

        CaptureFragment captureFragment = new CaptureFragment();

        captureFragment.setAnalyzeCallback(analyzeCallback);

        getSupportFragmentManager().beginTransaction().replace(R.id.fl_my_container, captureFragment).commit();

    }

    CodeUtils.AnalyzeCallback analyzeCallback = new CodeUtils.AnalyzeCallback() {
        @Override
        public void onAnalyzeSuccess(Bitmap mBitmap, String result) {
            Intent resultIntent = new Intent();
            Bundle bundle = new Bundle();
            bundle.putInt(CodeUtils.RESULT_TYPE, CodeUtils.RESULT_SUCCESS);
            bundle.putString(CodeUtils.RESULT_STRING, result);
            resultIntent.putExtras(bundle);
            CaptureActivity.this.setResult(RESULT_OK, resultIntent);

            CaptureActivity.this.finish();
        }

        @Override
        public void onAnalyzeFailed() {
            Intent resultIntent = new Intent();
            Bundle bundle = new Bundle();
            bundle.putInt(CodeUtils.RESULT_TYPE, CodeUtils.RESULT_FAILED);
            bundle.putString(CodeUtils.RESULT_STRING, "");
            resultIntent.putExtras(bundle);
            CaptureActivity.this.setResult(RESULT_OK, resultIntent);
            CaptureActivity.this.finish();
        }
    };

    public void exit(View view) {
        finish();//用于销毁页面
    }
}

功能建议参考大神代码----本界面属于笔记系列功能纯属模仿

发布了15 篇原创文章 · 获赞 8 · 访问量 3238
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览