美文网首页
Android二维码的基础使用(二):保存和分享

Android二维码的基础使用(二):保存和分享

作者: 静水红阳 | 来源:发表于2020-11-25 13:45 被阅读0次

    概述

    在上期文章中,我们提到了Android二维码的自定义生成,本期主要包含的内容如下:

    1. 将二维码以图片的形式保存到指定的目录。
    2. 如何调起系统分享实现二维码分享到其他应用。

    系列文章:

    Android二维码的基础使用(一):利用Zxing生成自定义二维码
    Android二维码的基础使用(二):保存和分享
    Android二维码的基础使用(三):二维码扫描Demo实现

    一、保存至本地

    要将二维码保存到本地到指定目录,必然涉及到文件操作,可以通过文件IO流保存的方式将二维码进行保存,同时发送广播更新图库,主要步骤包括:

    1. 权限申请
    2. 文件操作。

    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)
        }
    

    示例demo

    demo地址

    相关文章

      网友评论

          本文标题:Android二维码的基础使用(二):保存和分享

          本文链接:https://www.haomeiwen.com/subject/vncniktx.html