概述
在上期文章中,我们提到了Android二维码的自定义生成,本期主要包含的内容如下:
- 将二维码以图片的形式保存到指定的目录。
- 如何调起系统分享实现二维码分享到其他应用。
系列文章:
Android二维码的基础使用(一):利用Zxing生成自定义二维码
Android二维码的基础使用(二):保存和分享
Android二维码的基础使用(三):二维码扫描Demo实现
一、保存至本地
要将二维码保存到本地到指定目录,必然涉及到文件操作,可以通过文件IO流保存的方式将二维码进行保存,同时发送广播更新图库,主要步骤包括:
- 权限申请
- 文件操作。
1. 权限添加
添加文件读写权限:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
2. 文件操作。
示例代码如下:
/**
* 保存图片到指定路径
*
* @param bitmap 要保存的图片
* @param fileName 自定义图片名称
* @param context
* @return
*/
fun saveBitmapToFile(bitmap: Bitmap?, fileName: String,context: Context?): Boolean {
// 保存图片至指定路径
if(bitmap == null)
return false
val storePath = FileUtils.instance.getAppDir() + QR_CODE+File.separator
val appDir = File(storePath)
if (!appDir.exists()) {
appDir.mkdirs()
}
val file = File(appDir, fileName)
LogUtils.instance.getLogPrint(file.absolutePath)
try {
val fos = FileOutputStream(file)
//通过io流的方式来压缩保存图片(80代表压缩20%)
val isSuccess = bitmap.compress(Bitmap.CompressFormat.PNG, 80, fos)
fos.flush()
fos.close()
//发送广播通知系统图库刷新数据
val uri: Uri = Uri.fromFile(file)
context?.sendBroadcast(Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, uri))
return isSuccess
} catch (e: IOException) {
e.printStackTrace()
}
return false
}
companion object {
public const val QR_CODE = "QRCode"
val instance = QRCodeBitmapUtils()
}
读取文件时注意文件的路径以及文件夹是否存在,否则可能会有查找不到文件的异常出现。
3.遇到的问题
Android 10 文件写入错误
在调试过程中遇到了Android 10 文件写入错误,是因为Android 10 对于文件写入做了更加严格的限制,遇到的具体错误信息如下:
new FileOutputStream(file) 时抛出异常 :FileNotFoundException
我的解决办法是在AndroidManifest.xml文件application
条目下添加了如下代码:
android:requestLegacyExternalStorage="true"
二、分享图片
分享实现的方法有多种,可以通过调用系统分享,也可以添加调用第三方分享,在此仅采用系统提供的分享方法为例进行简单说明:
分享的情况下可以将生成的二维码按照上面的保存方式保存起来,生成二维码的地址以方便转换成Uri。
系统分享只需要通过intent传入指定的Action,再通过startActivity直接调起分享即可,示例代码如下:
/**
* 分享图片
* @param filePath:文件路径名称
* @param context
*/
fun shareImg(filePath: String, context: Context) {
val uri: Uri = Uri.parse(filePath)
var intent = Intent()
LogUtils.instance.getLogPrint("获取文件路径:"+uri.toString())
intent.action = Intent.ACTION_SEND //设置Action为分享
intent.type = "image/*" //设置分享内容的类型,暂设定为图片分享
intent.putExtra(Intent.EXTRA_STREAM, uri) //设置分享的地址
// intent.putExtra(Intent.EXTRA_SUBJECT, "share");//添加分享内容标题
// intent.putExtra(Intent.EXTRA_TEXT, "share with you:" + "android");//添加分享内容
intent = Intent.createChooser(intent, "分享")
context.startActivity(intent)
}
网友评论