前言
之前,我尝试了用华为统一扫码服务生成二维码,照着官网上的资料很顺利就完成了,接着就是要实现将ImageView中的二维码保存为图像文件,存放在手机的公共存储空间内,以便发送给他人。
一、实现中出现的问题
我先是参照欧阳燊先生编著的《Android App开发入门与项目实战》第6章的相关内容编写代码,在手机上测试后发现虽然在目标文件夹下生成了图片文件,但文件的大小是0KB。意味着图片文件里没有内容。
二、解决问题的方法
我在优快云社区里搜索,找到了一篇相关的博文,看过之后才发现问题所在。
文章链接
Android开发:用getDrawingCache方法获取ImageView中的图像需要注意的问题_安卓获取imageview图像边缘-优快云博客
我的代码运行时出现问题就是少了下面的两行代码
setDrawingCacheEnabled(true);
setDrawingCacheEnabled(false);
在使用getDrawingCache()方法的代码前后分别添加上面的两个方法,再进行测试,问题就解决了。
三、Java代码
我的代码如下:
// 从ImageView对象获取图像之前,一定要调用setDrawingCacheEnabled(true)方法
iv_code1.setDrawingCacheEnabled(true);
if (iv_code1.getDrawable() == null) { // 检查是否已生成二维码
Toast.makeText(this, "还未生成二维码", Toast.LENGTH_SHORT).show();
return;
}
Bitmap bitmap = Bitmap.createBitmap(iv_code1.getDrawingCache());
// 从ImageView对象获取图像之后,一定要调用setDrawingCacheEnabled(false)方法
iv_code1.setDrawingCacheEnabled(false);
// 设置图像的保存路径
// 保存路径在公共存储空间的 /Documents/bahamutjapp/ 文件夹下
File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS), "bahamutjapp");
if (!file.exists()) {
boolean success = file.mkdirs();
if (success) {
Log.d(TAG, "文件夹创建成功");
} else {
Log.e(TAG, "文件夹已存在");
}
}
String fileName = "QR" + DateUtil.getNowDateTime() + ".jpeg";
String filePath = file + File.separator + fileName;
FileUtil.saveImage(filePath, bitmap);
Log.d(TAG, "二维码图片路径为:" + filePath); // 完整的路径
// 在TextView中显示的路径是通过手机的文件管理app看到的路径
tv_filePath.setText("图片路径:/Documents/bahamutjapp/" + fileName);
Toast.makeText(this, "二维码图片已生成", Toast.LENGTH_SHORT).show();