Android 利用Zxing实现扫描二维码并跳转详情页面

本文介绍了如何在Android应用中使用Zxing库实现二维码扫描,并在扫描成功后跳转到详情页面。首先在Manifest中添加相机权限,接着在布局文件中设置触发相机的点击事件。创建ZXingWebview布局文件用于展示二维码详情。自定义Application类初始化Zxing包,并在MainActivity和ZXingActivity中处理扫描和跳转逻辑。

一言不合就上图

这里写图片描述这里写图片描述这里写图片描述
因为是第三方集成好的所以|||
老套路首先注入依赖:

//zxing二维码
    compile 'cn.yipianfengye.android:zxing-library:2.1'

Manifest注册清单里面添加打开相机的权限:

    <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" />

然后是activity_main.xml布局文件,随便给个控件,为了触发点击事件(点击打开相机):

<TextView
        android:id="@+id/tvSys"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="点我扫一扫"
        android:textSize="22sp"/>

然后新建一个zxing_webview_layout.xml布局文件,用来跳转显示二维码的详情:

    <EditText
        android:id="@+id/receptionTv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="10dp" />

    <WebView
        android:id="@+id/wb"
        android:layout_width="match_parent"
        android:layout_height="match_parent"></WebView>

然后一个重点 需要新建一个类继承application,初始化zxing包:

public class ZXingApplication extends Application {
    //oncreate方法
    @Override
    public void onCreate() {
        super.onCreate();
        //初始化ZXING包
        ZXingLibrary.initDisplayOpinion(this);
    }
}

千万不要忘记在ManiFast注册清单里面声明一下application类:

<application
        android:name=".ZXingApplication"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.AppCompat.Light.NoActionBar">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        //这是跳转到详情页面也别忘记,声明此类
        <activity android:name=".ZXingActivity" />
    </application>

然后就是MainActivity的代码:

public class MainActivity extends AppCompatActivity {
    //定义一个全局的静态常量
    private static final int REQUEST_CODE = 001;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //运动时权限
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
            //申请WRITE_EXTERNAL_STORAGE权限
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, 1);
        }
        //找控件
        TextView tvSys = (TextView) findViewById(R.id.tvSys);
        //点击事件
        tvSys.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //调用系统相机功能,就是跳转到摄像头的界面
                Intent intent = new Intent(MainActivity.this, CaptureActivity.class);
                //用此方法跳转的原因是:为了回调下面onActivityResult的方法
                startActivityForResult(intent, REQUEST_CODE);
            }
        });

    }
    //扫描回传值
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == REQUEST_CODE) {
            Bundle bundle = data.getExtras();
            if (bundle == null) {
                return;
            }
            if (bundle.getInt(CodeUtils.RESULT_TYPE) == CodeUtils.RESULT_SUCCESS) {
                //这是拿到解析扫描到的信息,并转成字符串
                String result = bundle.getString(CodeUtils.RESULT_STRING);

                Toast.makeText(this, "解析结果:" + result, Toast.LENGTH_LONG).show();
                //解析扫到的二维码后就跳转页面
                Intent intent = new Intent(MainActivity.this, ZXingActivity.class);
                //把扫到并解析到的信息(既:字符串)带到详情页面
                intent.putExtra("path", result);
                startActivity(intent);
            } else if (bundle.getInt(CodeUtils.RESULT_TYPE) == CodeUtils.RESULT_FAILED) {
                //否则土司解析二维码失败
                Toast.makeText(this, "解析二维码失败:", Toast.LENGTH_LONG).show();
            }
        }

    }
}

然后就是跳转详情的页面也就是ZXingActivity类:

public class ZXingActivity extends Activity {
    //控件设了个全局
    private WebView wb;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.zxing_webview_layout);
        //找控件
        wb = findViewById(R.id.wb);
        TextView receptionTv = findViewById(R.id.receptionTv);
        //支持js语言
        wb.getSettings().setJavaScriptEnabled(true);
        // 缩放至屏幕的大小
        wb.getSettings().setLoadWithOverviewMode(true);
        //支持缩放
        wb.getSettings().setSupportZoom(true);
        //声明一个Intent意图,用来接受MainActivity传过来的值
        Intent intent = getIntent();
        //拿到MainActivity传过来的值并返回一个字符串,
        //口令要一致
        String jxString = intent.getStringExtra("path");
        //把字符串赋值给输入框
        receptionTv.setText(jxString);
        //webVew去加载网页
        wb.loadUrl(jxString);
        //设置用自己的浏览器打开
        wb.setWebViewClient(new MyWebViewClient());

        //设置它的进度
        /*wb.setWebChromeClient(new WebChromeClient() {


            @Override
            public void onProgressChanged(WebView view, int newProgress) {
                super.onProgressChanged(view, newProgress);
                //拿到当前进度的int值

            }
        });

    }*/

    //是否允许返回
   /* @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK && wb.canGoBack()) {
            //让webView返回上一级
            wb.goBack();
        }
        return true;
    }*/

    //自定义浏览器
    class MyWebViewClient extends WebViewClient {

        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            view.loadUrl(url);

            return super.shouldOverrideUrlLoading(view, url);
        }


    }
    //预防内存泄露
    @Override
    protected void onPause() {
        super.onPause();
        finish();
    }
}

完事儿

强调几点:
1我的Android studio是2.3.3版本,SDK下-v7:26.+’

compile 'com.android.support:appcompat-v7:26.+' 
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值