博客
关于我
Android实现二维码扫描功能(四)-ZXing识别图片二维码,相册选图
阅读量:242 次
发布时间:2019-02-28

本文共 4965 字,大约阅读时间需要 16 分钟。

如何识别相册中的图片(含二维码)

引言

在本文中,我们将介绍如何从相册中识别图片,特别是包含二维码的图片。这个过程涉及到读取图片文件、处理图片数据以及解析二维码的内容。

第一步:添加权限

首先,我们需要确保应用程序有权限读取外部存储设备,以便可以访问相册中的图片文件。我们可以通过以下步骤在AndroidManifest.xml中添加读取权限:

第二步:动态权限申请

在应用启动时,我们需要动态地请求权限。我们可以在MainActivity中实现这一点。例如,以下是申请相机和读取权限的代码:

private void startQrCode() {    if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {        ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CAMERA}, Constant.REQ_PERM_CAMERA);        return;    }    if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {        ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, Constant.REQ_PERM_EXTERNAL_STORAGE);        return;    }    // 开始扫描    Intent intent = new Intent(MainActivity.this, CaptureActivity.class);    startActivityForResult(intent, Constant.REQ_QR_CODE);}

第三步:处理权限结果

当用户同意或拒绝权限请求时,我们需要在onRequestPermissionsResult方法中进行处理。这可以确保应用程序在权限被拒绝时能够提示用户设置权限:

@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {    super.onRequestPermissionsResult(requestCode, permissions, grantResults);    switch (requestCode) {        case Constant.REQ_PERM_CAMERA:            // 处理相机权限结果            break;        case Constant.REQ_PERM_EXTERNAL_STORAGE:            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {                //权限已授予,开始扫描                startQrCode();            } else {                //权限未授予,提示用户                Toast.makeText(this, "请至权限中心打开本应用的文件读写权限", Toast.LENGTH_LONG).show();            }            break;    }}

第四步:实现相册选择功能

在CaptureActivity中,我们需要实现点击相册按钮的功能,以便用户可以选择图片:

private View.OnClickListener albumOnClick = new View.OnClickListener() {    @Override    public void onClick(View view) {        Intent innerIntent = new Intent(Intent.ACTION_GET_CONTENT);        innerIntent.setType("image/*");        startActivityForResult(innerIntent, REQUEST_CODE_SCAN_GALLERY);    }};

第五步:处理返回的图片数据

在onActivityResult方法中,我们需要处理返回的图片数据,并将其传递给QRCodeReader进行解析:

@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {    super.onActivityResult(requestCode, resultCode, data);    if (requestCode == REQUEST_CODE_SCAN_GALLERY && resultCode == RESULT_OK) {        Bundle bundle = data.getExtras();        String scanResult = bundle.getString(Constant.INTENT_EXTRA_KEY_QR_SCAN);        tvResult.setText(scanResult);    }}

第六步:处理图片数据

在handleAlbumPic方法中,我们需要处理选中的图片数据,并将其转换为Bitmap:

private void handleAlbumPic(Intent data) {    final Uri uri = data.getData();    mProgress = new ProgressDialog(CaptureActivity.this);    mProgress.setMessage("正在扫描...");    mProgress.setCancelable(false);    mProgress.show();    runOnUiThread(new Runnable() {        @Override        public void run() {            Result result = scanningImage(uri);            mProgress.dismiss();            if (result != null) {                Intent resultIntent = new Intent();                Bundle bundle = new Bundle();                bundle.putString(Constant.INTENT_EXTRA_KEY_QR_SCAN, result.getText());                resultIntent.putExtras(bundle);                CaptureActivity.this.setResult(RESULT_OK, resultIntent);                finish();            } else {                Toast.makeText(CaptureActivity.this, "识别失败", Toast.LENGTH_SHORT).show();            }        }    });}

第七步:优化图片处理

为了避免内存溢出,我们可以在BitmapUtil类中优化图片的处理过程。以下是一个示例:

public class BitmapUtil {    public static Bitmap decodeUri(Context context, Uri uri, int maxWidth, int maxHeight) {        BitmapFactory.Options options = new BitmapFactory.Options();        options.inJustDecodeBounds = true;        int scale = 1;        while ((options.outWidth / scale > maxWidth || options.outHeight / scale > maxHeight)) {            scale *= 2;        }        options.inSampleSize = scale;        options.inPreferredConfig = Bitmap.Config.RGB_565;        InputStream stream = null;        try {            stream = context.getContentResolver().openInputStream(uri);            BitmapFactory.decodeStream(stream, null, options);        } catch (Exception e) {            Log.w("BitmapUtil", "Unable to open content: " + uri, e);        } finally {            if (stream != null) {                try {                    stream.close();                } catch (IOException e) {                    Log.e("BitmapUtil", "Unable to close content: " + uri, e);                }            }        }        return stream != null && options.outWidth > 0 && options.outHeight > 0 ? BitmapFactory.decodeStream(stream, null, options) : null;    }}

注意事项

  • 确保在AndroidManifest.xml中正确声明所需的权限。
  • 在请求权限时,使用ActivityResultLauncher来处理。
  • 在处理图片数据时,确保使用高效的Bitmap处理方法,以避免内存溢出。
  • 进行全面测试,确保在不同设备和系统版本下都能正常工作。

通过以上步骤,我们可以在应用程序中实现从相册中读取图片,并解析其中的二维码。确保在处理图片数据时,遵循正确的权限管理流程,以提高应用程序的稳定性和用户体验。

转载地址:http://ffgs.baihongyu.com/

你可能感兴趣的文章
Python 列表(List)概述-ChatGPT4o作答
查看>>
Python网络爬虫基础进阶到实战教程
查看>>
Python 初学者需要知道的四条建议
查看>>
Python 判断字符串是否包含子字符串
查看>>
python 判断当前时间是否为零点
查看>>
python 利用pandas读取本地中CSV文件的指定列 列名重命名 并保存回本地
查看>>
python 利用pyspark读取HDFS中CSV文件的指定列 列名重命名 并保存回HDFS
查看>>
python 利用pyttsx3文字转语音
查看>>
python 利用已有Ner模型进行数据清洗合并
查看>>
python 到大数据开发工程师_如何成为一个大数据开发工程师?
查看>>
python 加密解密(base64, AES)
查看>>
Python 包管理器和 Node.js
查看>>
Python 单词字母顺序不变且所有倒排
查看>>
python 启动提示IDLE's subprocess didn't make conne...
查看>>
python 命令接口_实现“[命令][操作][参数]”样式的命令行接口?
查看>>
Python 和 OpenCV.如何检测图像中的所有(填充)圆形/圆形对象?
查看>>
Python 和 RabbitMQ - 聆听来自多个渠道的消费事件的最佳方式?
查看>>
python编辑器打不开_关于命令ride.py打不开RF,而是打开pycharm编辑器问题解决思路...
查看>>
python编译exe同时支持32位_第三周:同时管理64位和32位版本的Python,并用Pyinstaller打包成exe...
查看>>
Python 和Java 哪个更适合做自动化测试?
查看>>