概述
在上期文章中唤蔗,我們提到了Android二維碼的自定義生成,本期主要包含的內(nèi)容如下:
- 將二維碼以圖片的形式保存到指定的目錄式散。
- 如何調(diào)起系統(tǒng)分享實(shí)現(xiàn)二維碼分享到其他應(yīng)用烹吵。
系列文章:
Android二維碼的基礎(chǔ)使用(一):利用Zxing生成自定義二維碼
Android二維碼的基礎(chǔ)使用(二):保存和分享
Android二維碼的基礎(chǔ)使用(三):二維碼掃描Demo實(shí)現(xiàn)
一、保存至本地
要將二維碼保存到本地到指定目錄详囤,必然涉及到文件操作财骨,可以通過文件IO流保存的方式將二維碼進(jìn)行保存,同時發(fā)送廣播更新圖庫藏姐,主要步驟包括:
- 權(quán)限申請
- 文件操作隆箩。
1. 權(quán)限添加
添加文件讀寫權(quán)限:
<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()
//發(fā)送廣播通知系統(tǒng)圖庫刷新數(shù)據(jù)
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()
}
讀取文件時注意文件的路徑以及文件夾是否存在羔杨,否則可能會有查找不到文件的異常出現(xiàn)捌臊。
3.遇到的問題
Android 10 文件寫入錯誤
在調(diào)試過程中遇到了Android 10 文件寫入錯誤,是因?yàn)锳ndroid 10 對于文件寫入做了更加嚴(yán)格的限制兜材,遇到的具體錯誤信息如下:
new FileOutputStream(file) 時拋出異常 :FileNotFoundException
我的解決辦法是在AndroidManifest.xml文件application
條目下添加了如下代碼:
android:requestLegacyExternalStorage="true"
二理澎、分享圖片
分享實(shí)現(xiàn)的方法有多種,可以通過調(diào)用系統(tǒng)分享曙寡,也可以添加調(diào)用第三方分享糠爬,在此僅采用系統(tǒng)提供的分享方法為例進(jìn)行簡單說明:
分享的情況下可以將生成的二維碼按照上面的保存方式保存起來,生成二維碼的地址以方便轉(zhuǎn)換成Uri举庶。
系統(tǒng)分享只需要通過intent傳入指定的Action执隧,再通過startActivity直接調(diào)起分享即可,示例代碼如下:
/**
* 分享圖片
* @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 //設(shè)置Action為分享
intent.type = "image/*" //設(shè)置分享內(nèi)容的類型户侥,暫設(shè)定為圖片分享
intent.putExtra(Intent.EXTRA_STREAM, uri) //設(shè)置分享的地址
// intent.putExtra(Intent.EXTRA_SUBJECT, "share");//添加分享內(nèi)容標(biāo)題
// intent.putExtra(Intent.EXTRA_TEXT, "share with you:" + "android");//添加分享內(nèi)容
intent = Intent.createChooser(intent, "分享")
context.startActivity(intent)
}