Android二维码的创建、解析及NotFoundException

本篇博客主要记录一下Android生成及解析二维码的基本方法,
同时记录一下遇到的NotFoundException及对应解决方法。


如今很多APK都集成了二维码,其本质不过是将信息按照0、1的方式写入到图片中,
0、1分别对应了不同的颜色。

从APK调用api的角度来看,生成和解析二维码是非常容易的,
真正的难度其实还是在信息的编码及图像的识别上,而这就比较依赖于专业知识了。

对于普通开发者而言,在项目中引用google的支持库后,就能够开发基本的功能了。

我自己写demo时,在Android Studio中引用的支持库为com.google.zxing:core:3.3.0。

整个demo的界面非常简单,如下图所示:

基本功能就是点击GENERATE按键后,在界面下方生成二维码;
点击SCAN按键后,从二维码图片中得到对应的信息。


其中,生成二维码的核心代码如下:

    private void generateQRCode() {
        //得到信息对应的像素数组
        int[] pixels = generatePixels();

        if (pixels != null) {
            Bitmap bitmap = Bitmap.createBitmap(
                    QR_WIDTH, QR_HEIGHT, Bitmap.Config.ARGB_8888);

            //根据像素数组生成bitmap
            //这部分参数含义查看一下API描述,比较容易弄懂
            bitmap.setPixels(pixels, 0, QR_WIDTH, 0, 0, QR_WIDTH, QR_HEIGHT);

            //将bitmap显示到界面上
            mImageView.setImageBitmap(bitmap);

            mScanButton.setEnabled(true);
        }
    }

容易看出,上面代码的重点部分在于生成像素数组。

这部分内容如下所示:

    private int[] generatePixels() {
        //得到需要写入的信息
        String data = createData();

        int[] pixels = null;

        
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很抱歉,我作为AI语言模型无法提供完整的Android应用程序,但我可以给你提供一个基本的扫描二维码的代码框架,供你参考: 1. 在AndroidManifest.xml文件中添加必要的权限: ```xml <uses-permission android:name="android.permission.CAMERA"/> <uses-feature android:name="android.hardware.camera"/> ``` 2. 在布局文件中添加一个SurfaceView用于显示摄像头画面: ```xml <SurfaceView android:id="@+id/surface_view" android:layout_width="match_parent" android:layout_height="match_parent" /> ``` 3. 在Activity中初始化Camera和SurfaceView,并设置扫描结果的回调函数: ```java public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback, Camera.PreviewCallback { private Camera mCamera; private SurfaceHolder mHolder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mHolder = ((SurfaceView)findViewById(R.id.surface_view)).getHolder(); mHolder.addCallback(this); } @Override public void surfaceCreated(SurfaceHolder holder) { mCamera = Camera.open(); try { mCamera.setPreviewDisplay(holder); } catch (IOException e) { e.printStackTrace(); } } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { Camera.Parameters params = mCamera.getParameters(); List<Camera.Size> sizes = params.getSupportedPreviewSizes(); Camera.Size selectedSize = sizes.get(0); params.setPreviewSize(selectedSize.width, selectedSize.height); mCamera.setParameters(params); mCamera.setPreviewCallback(this); mCamera.startPreview(); } @Override public void surfaceDestroyed(SurfaceHolder holder) { mCamera.stopPreview(); mCamera.release(); mCamera = null; } @Override public void onPreviewFrame(byte[] data, Camera camera) { String result = decodeQRCode(data, camera.getParameters().getPreviewSize().width, camera.getParameters().getPreviewSize().height); if (result != null) { Toast.makeText(this, result, Toast.LENGTH_SHORT).show(); } } private String decodeQRCode(byte[] data, int width, int height) { // TODO: 实现解码二维码的逻辑 return null; } } ``` 4. 在decodeQRCode方法中实现解码二维码的逻辑,可以使用第三方库来解码,比如Zxing: ```java private String decodeQRCode(byte[] data, int width, int height) { PlanarYUVLuminanceSource source = new PlanarYUVLuminanceSource(data, width, height, 0, 0, width, height, false); BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source)); Reader reader = new QRCodeReader(); try { Result result = reader.decode(bitmap); return result.getText(); } catch (NotFoundException | ChecksumException | FormatException e) { e.printStackTrace(); return null; } } ``` 这样就完成了一个简单的扫描二维码的程序。需要注意的是,这里只是一个简单的框架,还需要根据实际需求进行更多的代码实现和优化。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值