之前写过生成自定义二维码的两篇文章:《Android生成自定义二维码》《Android生成二维码–拍照或从相册选取图片》,下面就介绍一下Android应用内如何保存以及分享二维码图片。
保存图片
Adnroid中保存图片可以直接调用系统提供的插入图库的方法,或者指定存储路径。插入图片后需要刷新系统图库。
1.调用系统提供的插入图库方法
//插入到系统图库
MediaStore.Images.Media.insertImage(getContentResolver(), bitmap, "", "");
刷新图库
sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"+ Environment.getExternalStorageDirectory())));
这个方法无法指定保存路径和图片名,而且刷新将扫描整个SD卡,用户体验不好,所以看下面这个方法。
2.指定存储路径,更新图库
//发送广播通知系统图库刷新数据
sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, uri));
这里的uri是保存图片的路径,直接更新指定的路径将不会扫描整个SD卡,节省资源的同时也能自定义保存路径和文件名。所以需要先将图片保存到指定路径下,利用文件的IO流保存即可,如下:
/**
* 保存图片到指定路径
*
* @param context
* @param bitmap 要保存的图片
* @param fileName 自定义图片名称
* @return
*/
public static boolean saveImageToGallery(Context context, Bitmap bitmap, String fileName) {
// 保存图片至指定路径
String storePath = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "qrcode";
File appDir = new File(storePath);
if (!appDir.exists()) {
appDir.mkdir();
}
File file = new File(appDir, fileName);
try {
FileOutputStream fos = new FileOutputStream(file);
//通过io流的方式来压缩保存图片(80代表压缩20%)
boolean isSuccess = bitmap.compress(Bitmap.CompressFormat.JPEG, 80, fos);
fos.flush();
fos.close(); //发送广播通知系统图库刷新数据
Uri uri = Uri.fromFile(file);
context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, uri));
if (isSuccess) {
return true;
} else {
return false;
}
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
最后别忘了加入相应的权限,这里涉及了敏感权限WRITE_EXTERNAL_STORAGE,需要动态申请,方法前面文章已经介绍过,这里就不再重复。
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
分享图片
分享图片或文字等简单的内容,可以直接使用系统提供的分享方法,无需集成第三方。如下
/**
* 分享图片(直接将bitamp转换为Uri)
* @param bitmap
*/
private void shareImg(Bitmap bitmap){
Uri uri = Uri.parse(MediaStore.Images.Media.insertImage(getContentResolver(), bitmap, null,null));
Intent intent = new Intent();
intent.setAction(Intent.ACTION_SEND);
intent.setType("image/*");//设置分享内容的类型
intent.putExtra(Intent.EXTRA_STREAM, uri);
intent = Intent.createChooser(intent, "分享");
startActivity(intent);
}
由于我们获取到的是图片的Bitmap格式,为了方便直接将其转换为Uri,可直接调用系统保存图片的方法或者我们上面自定义的图片存储方法,都可以得到Uri。之后给startActivity传入一个ACTION_SEND的Intent,设置分享类型即可。
效果图
如下图,长按二维码选择存储至手机后,提示存储成功打开相册便能看到图片。点击分享即可分享至微信等平台。
源码已更新至GitHub,地址:https://github.com/yangxch/GenerateQRCode
Android生成二维码--保存和分享二维码图片的更多相关文章
-
Android生成自定义二维码
前面说过两种二维码扫描方式,现在说如何生成自定义酷炫二维码.二维码生成需要使用Google开源库Zxing,Zxing的项目地址:https://github.com/ZBar/ZBar,我们只需要里 ...
-
Android生成二维码--拍照或从相册选取图片
拍照或从相册选择图片是我们日常开发中经常使用到的,可以说是必须掌握的东西.上一篇我介绍了如何生成自定义二维码<Android生成自定义二维码>,其中logo和代替黑色色块的图片都是写死的, ...
-
Android生成带图片的二维码
一.问题描述 在开发中需要将信息转换为二维码存储并要求带有公司的logo,我们知道Google的Zxing开源项目就很好的帮助我们实现条形码.二维码的生成和解析,但带有logo的官网并没有提供demo ...
-
Android项目实战(二十八):Zxing二维码实现及优化
前言: 多年之前接触过zxing实现二维码,没想到今日项目中再此使用竟然使用的还是zxing,百度之,竟是如此牛的玩意. 当然,项目中我们也许只会用到二维码的扫描和生成两个功能,所以不必下载完整的ja ...
-
java二维码生成-谷歌(Google.zxing)开源二维码生成学习及实例
java二维码生成-谷歌(Google.zxing)开源二维码生成的实例及介绍 我们使用比特矩阵(位矩阵)的QR码编码在缓冲图片上画出二维码 实例有以下一个传入参数 OutputStream ou ...
-
QRCode 扫描二维码、扫描条形码、相册获取图片后识别、生成带 Logo 二维码、支持微博微信 QQ 二维码扫描样式
目录 功能介绍 常见问题 效果图与示例 apk Gradle 依赖 布局文件 自定义属性说明 接口说明 关于我 功能介绍 根据之前公司的产品需求,参考 barcodescanner 改的,希望能帮助到 ...
-
(转载)Android项目实战(二十八):Zxing二维码实现及优化
Android项目实战(二十八):Zxing二维码实现及优化 前言: 多年之前接触过zxing实现二维码,没想到今日项目中再此使用竟然使用的还是zxing,百度之,竟是如此牛的玩意. 当然,项目中 ...
-
C# 中使用 ThoughtWorks.QRCode.dll 生成指定尺寸和边框宽度的二维码
本文介绍在 C# 中使用 ThoughtWorks.QRCode.dll 生成指定尺寸和边框宽度的二维码.网上文章大多只是简单介绍内置参数的设置,根据我的使用目的,增加了自定义目标二维码图片尺寸和白边 ...
-
【转】C# 中使用 ThoughtWorks.QRCode.dll 生成指定尺寸和边框宽度的二维码
本文介绍在 C# 中使用 ThoughtWorks.QRCode.dll 生成指定尺寸和边框宽度的二维码.网上文章大多只是简单介绍内置参数的设置,根据我的使用目的,增加了自定义目标二维码图片尺寸和白边 ...
随机推荐
-
插入排序 &; 快速排序
2.1 插入排序: 接口定义: int insert_sort(void* data, int size, int esize, int (*compare)(const void* key1, co ...
-
C# Socket服务器端如何判断客户端断开
使用Socket类中的Poll方法,就可以. Socket client //假如已经创建好了,连接到服务器端得Socket的客户端对象. 我们只要client.Poll(10,SelectMode. ...
-
Hibernate一对多和多对一关系详解 (转载)
:双向一对多关系,一是关系维护端(owner side),多是关系被维护端(inverse side).在关系被维护端需要通过@JoinColumn建立外键列指向关系维护端的主键列. publ ...
-
poj 2778 DNA Sequence AC自动机
DNA Sequence Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 11860 Accepted: 4527 Des ...
-
利用ASP.netCore自带DI(DependencyInjection)实现批量依赖注入
ASP.net Core自带DI(依赖注入),用法如下: services.AddScoped(typeof(IProductService), typeof(ProductService)); 如果 ...
-
J2EE走向成功路-02-Struts2 配置(Maven)
在上一篇中,介绍了使用jar包搭建Struts2框架,这一篇中来介绍一下在Maven环境下搭建Struts2框架,主要为配置Maven. 1.下载Maven,官网:http://maven.apach ...
-
js中this详解
this对象是在闭包一节中提到的,书上的原话是:"this对象是在运行时基于函数的执行环境绑定的,在全局函数中,this等于window,而当函数作为某个对象的方法调用时,this等于那个对 ...
-
pycharm failed to create JVM
启动的时候,出现这个error: 解决办法: 如果电脑安装的jdk是64位,找到pycharm的安装目录下的bin目录下的pycharm64.exe.vmoptions文件修改以下值, 如果是32位, ...
-
win10 激活工具 Re-LoaderByR@1n.exe
名字叫 Re-LoaderByR@1n.exe 无广告, https://pan.baidu.com/s/1MBix1cZxKpUTA6MUgL7uLQ 如果变成教育版,可以用以下激活码变成专业版:W ...
-
springboot多环境(dev、test、prod)配置
propertiest配置格式在Spring Boot中多环境配置文件名需要满足application-{profile}.properties的格式,其中{profile}对应你的环境标识,比如: ...