Android二维码生成器分享按钮崩溃问题及修复请求
解决二维码分享按钮崩溃的问题
我帮你找到了几个导致崩溃的核心问题,咱们一步步来修复:
1. 最致命的空指针问题
你原代码里用BitmapFactory.decodeResource(getResources(), R.id.qr_image)来获取二维码图片,这是完全错误的——R.id.qr_image是ImageView的控件ID,不是图片资源ID!这会导致Bitmap b返回null,后续调用b.compress直接触发空指针异常,这就是点击分享就崩溃的直接原因。
实际上你已经在生成二维码时把图片保存到了bitmap全局变量里,直接用这个变量就好。
2. 适配Android版本的分享逻辑
MediaStore.Images.Media.insertImage在Android Q(API 29)之后已经被废弃,而且在高版本系统中可能返回null,导致Uri无效。我们需要分版本处理,同时确保分享的Uri有临时读写权限。
修复后的完整分享按钮代码
替换你原有的/**Barcode share*/部分代码:
/**Barcode share*/ findViewById(R.id.share_barcode).setOnClickListener(v -> { // 先检查bitmap是否为空(避免还没生成二维码就点击分享) if (bitmap == null) { Toast.makeText(activity, "请先生成二维码再分享", Toast.LENGTH_SHORT).show(); return; } Intent share = new Intent(Intent.ACTION_SEND); share.setType("image/jpeg"); Uri imageUri = null; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { // Android Q及以上:使用MediaStore插入图片并获取Uri ContentResolver resolver = getContentResolver(); ContentValues contentValues = new ContentValues(); contentValues.put(MediaStore.MediaColumns.DISPLAY_NAME, "QR_Code_" + System.currentTimeMillis() + ".jpg"); contentValues.put(MediaStore.MediaColumns.MIME_TYPE, "image/jpeg"); contentValues.put(MediaStore.MediaColumns.RELATIVE_PATH, Environment.DIRECTORY_DCIM + "/QR_Codes"); try { imageUri = resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues); if (imageUri != null) { OutputStream fos = resolver.openOutputStream(imageUri); bitmap.compress(Bitmap.CompressFormat.JPEG, 90, fos); if (fos != null) fos.close(); } } catch (IOException e) { e.printStackTrace(); Toast.makeText(activity, "分享失败:" + e.getMessage(), Toast.LENGTH_SHORT).show(); return; } } else { // Android Q以下:使用传统方式保存到DCIM并获取Uri File saveDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM), "QR_Codes"); if (!saveDir.exists() && !saveDir.mkdirs()) { Toast.makeText(activity, "无法创建保存目录", Toast.LENGTH_SHORT).show(); return; } File imageFile = new File(saveDir, "QR_Code_" + System.currentTimeMillis() + ".jpg"); try { FileOutputStream fos = new FileOutputStream(imageFile); bitmap.compress(Bitmap.CompressFormat.JPEG, 90, fos); fos.close(); // 通知媒体库刷新 MediaScannerConnection.scanFile(activity, new String[]{imageFile.getAbsolutePath()}, null, null); imageUri = Uri.fromFile(imageFile); } catch (IOException e) { e.printStackTrace(); Toast.makeText(activity, "分享失败:" + e.getMessage(), Toast.LENGTH_SHORT).show(); return; } } if (imageUri != null) { // 给Uri添加临时读写权限(适配Android 7+) share.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); share.putExtra(Intent.EXTRA_STREAM, imageUri); startActivity(Intent.createChooser(share, "选择分享应用")); } else { Toast.makeText(activity, "无法获取分享图片", Toast.LENGTH_SHORT).show(); } });
额外的优化建议
- 添加空判断:在分享前先检查
bitmap是否为null,避免用户还没生成二维码就点击分享导致的异常。 - 版本适配:分Android Q前后处理文件保存逻辑,避免废弃API的问题。
- 权限处理:Android Q以下需要确保已经获取
WRITE_EXTERNAL_STORAGE权限,你可以复用保存按钮的权限请求逻辑。 - 临时权限:添加
Intent.FLAG_GRANT_READ_URI_PERMISSION,确保被分享的应用能读取到图片Uri。
内容的提问来源于stack exchange,提问作者cloud
相关产品推荐
相关产品推荐

