Android之图片保存相册及分享图片

news/2025/2/26 3:43:32

文章目录

  • 前言
  • 一、效果图
  • 二、实现步骤
    • 1.引入依赖库
    • 2.二维码生成
    • 3.布局转图片保存或者分享
  • 总结


前言

其实现在很多分享都是我们自定义的,更多的是在界面加了很多东西,然后把整个界面转成图片保存相册和分享,而且现在分享都不需要第三方,直接调用系统分享,大大提高工作效率,本篇文章还涉及到二维码生成,以及布局转图片保存相册并刷新相册功能,

一、效果图

在这里插入图片描述

二、实现步骤

1.引入依赖库

二维码生成依赖库:

 implementation 'com.journeyapps:zxing-android-embedded:3.5.0'

2.二维码生成

//实例化
private var codeBitmap: Bitmap? = null //生成二维码
//share_url 要生成的链接或者文案,第二三个参数为二维码宽高
  codeBitmap = QRCodeUtils.createQRCodeBitmap(
                        share_url, 120, 120, "UTF-8",
                        "H", "1", Color.BLACK, Color.WHITE
                    )
//显示到控件上
imag_ewm.setImageBitmap(codeBitmap)

3.布局转图片保存或者分享

1.调用

//relative_tp为要保存的布局,第二个参数为1时分享,2为保存相册
startSaveBitmap(getViewBitmap(relative_tp), "2")

2.实现方法

  /**
     * 布局转图片
     *
     * @param v
     * @return
     */
    private fun getViewBitmap(v: View): Bitmap? {
        v.clearFocus()
        v.isPressed = false
        val willNotCache = v.willNotCacheDrawing()
        v.setWillNotCacheDrawing(false)
        val color = v.drawingCacheBackgroundColor
        v.drawingCacheBackgroundColor = 0
        if (color != 0) {
            v.destroyDrawingCache()
        }
        v.buildDrawingCache()
        val cacheBitmap = v.drawingCache ?: return null
        val bitmap = Bitmap.createBitmap(cacheBitmap)
        v.destroyDrawingCache()
        v.setWillNotCacheDrawing(willNotCache)
        v.drawingCacheBackgroundColor = color
        return bitmap
    }

    /**
     * 图片保存相册
     *
     * @param bitmap
     */
    private fun startSaveBitmap(bitmap: Bitmap?, type: String) {//1分享,2为下载
        if (bitmap == null) {
            return
        }
        // 新建目录appDir,并把图片存到其下
        val appDir: File = File(
            (this@MyInvite.getExternalFilesDir(null)
            !!.getPath() + System.currentTimeMillis()).toString() + "BarcodeBitmap"
        )
        if (!appDir.exists()) {
            appDir.mkdir()
        }
        val fileName = System.currentTimeMillis().toString() + ".jpg"
        val file = File(appDir, fileName)
        try {
            val fos = FileOutputStream(file)
            bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos)
            fos.flush()
            fos.close()
        } catch (e: IOException) {
            e.printStackTrace()
        }
        if (type == "1") {
            val intent = Intent(Intent.ACTION_SEND)
            intent.type = "image/*" //设置MIME类型
            intent.putExtra(
                Intent.EXTRA_STREAM, FileProvider.getUriForFile(
                    this,
                    "applicationId(也就是包名).fileprovider",
                    file
                )
            ) //需要分享的文件URI
            startActivity(Intent.createChooser(intent, "分享"))
        } else {
            //把file里面的图片插入到系统相册中
            try {
                MediaStore.Images.Media.insertImage(
                    this@MyInvite.getContentResolver(),
                    file.absolutePath, fileName, null
                )
            } catch (e: FileNotFoundException) {
                e.printStackTrace()
            }
            // 通知相册更新
            this@MyInvite.sendBroadcast(
                Intent(
                    Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,
                    Uri.fromFile(file)
                )
            )
            ToastUtils.showToast(resources.getString(R.string.Successfullysaved))
        }

    }

总结

总之这玩意简单如喝水,欢迎大家提建议,但我不会采纳,希望能帮助到有需要的。


http://www.niftyadmin.cn/n/5867136.html

相关文章

【代码随想录】第九章-动态规划(上)

【代码随想录】第九章-动态规划(上) 第九章 动态规划-上1 斐波那契数列509.斐波那契数列Method1:递归Method2:动态规划 70.爬楼梯746.使用最小花费爬楼梯 2 不同路径62.不同路径63.不同路径II 3 整数拆分343.整数拆分96.不同的二叉…

Unity Shader 学习13:屏幕后处理 - 使用高斯模糊的Bloom辉光效果

目录 一、基本的后处理流程 - 以将画面转化为灰度图为例 1. C#调用shader 2. Shader实现效果 二、Bloom辉光效果 1. 主要变量 2. Shader效果 (1)提取较亮区域 - pass1 (2)高斯模糊 - pass2&3 (3&#xff…

WordPress R+L Carrier Edition sql注入漏洞复现(CVE-2024-13481)(附脚本)

免责申明: 本文所描述的漏洞及其复现步骤仅供网络安全研究与教育目的使用。任何人不得将本文提供的信息用于非法目的或未经授权的系统测试。作者不对任何由于使用本文信息而导致的直接或间接损害承担责任。如涉及侵权,请及时与我们联系,我们将尽快处理并删除相关内容。 0x0…

2024/2/23 考试

第一题 One Clue 问题陈述 在数轴上有20000012000001块石头,这些石头的坐标分别为-1000000, -999999, -999998, \ldots, 999999, 1000000−1000000,−999999,−999998,…,999999,1000000。 其中,连续的KK块石头被涂成了黑色,其余的则是白…

C++ day4 练习

一、练习1 找到第一天mystring练习&#xff0c;实现以下功能&#xff1a; mystring str "hello"; mystring ptr "world"; str str ptr; str ptr; str[0] H; 【代码】&#xff1a; #include <iostream> #include <cstring> #include &l…

PHP入门基础学习九(PHP使用手册)

web交互 当表单的method属性提交方式为POST时,浏览器发送POST请求 当表单的method属性提交方式为GET时,浏览器发送GET请求 一、web表单交互 当PHP收到来自浏览器提交的数据后,会自动保存到超全局变量中。 超全局变量是PHP预定义好的变量,可以在PHP脚本的任何位置使用。…

华为昇腾服务器(固件版本查询、驱动版本查询、CANN版本查询)

文章目录 1. **查看固件和驱动版本**2. **查看CANN版本**3. **其他辅助方法**注意事项 在华为昇腾服务器上查看固件、驱动和CANN版本的常用方法如下&#xff1a; 1. 查看固件和驱动版本 通过命令行工具 npu-smi 执行以下命令查看当前设备的固件&#xff08;Firmware&#xff0…

Pytorch深度学习教程_6_激活函数

欢迎来到《pytorch深度学习教程》系列的第六篇&#xff01;在前面的五篇中&#xff0c;我们已经介绍了Python、numpy及pytorch的基本使用&#xff0c;进行了梯度及神经网络的实践。今天&#xff0c;我们将深入理解激活函数并进行简单的实践学习 欢迎订阅专栏进行系统学习&…