文章目录

  • 一、前言
  • 二、保存图片到相册
  • 三、存储权限

一、前言

本文旨在介绍,如何将游戏内的图片保存到Android相册,并实时刷新显示出来(不需要写Android原生项目),另外解决存储权限申请和弹窗隐藏问题

二、保存图片到相册

  1. 修改File->BuildSettings->PlaySettings->OtherSettings写入权限
  • Internal 是内部存储,无需存储权限,可以使用软件目录下的存储,但不可以访问手机目录(如果我们只是想保存图片到相册,选择该方式即可)
  • External(SD) 是外部存储,需要存储权限。(但是从产品的角度考虑,弹窗的转化率是非常的低,大多数用户是不愿意同意该权限申请
  1. 图片设置

打开图片的读写功能

  1. 将贴图转化成字节数组时报错,不支持Texture2D压缩格式

File写入贴图时,需要将图片转成字节数组,texture2D.EncodeToPNG(),但是会出现如下报错

传入目标贴图,返回的图片即可转成字节数组啦

        public Texture2D DeCompress(Texture2D source){RenderTexture renderTex = RenderTexture.GetTemporary(source.width,source.height,0,RenderTextureFormat.Default,RenderTextureReadWrite.Linear);Graphics.Blit(source, renderTex);RenderTexture previous = RenderTexture.active;RenderTexture.active = renderTex;Texture2D readableText = new Texture2D(source.width, source.height);readableText.ReadPixels(new Rect(0, 0, renderTex.width, renderTex.height), 0, 0);readableText.Apply();RenderTexture.active = previous;RenderTexture.ReleaseTemporary(renderTex);return readableText;}
  1. 核心代码
/// <summary>/// 保存图片/// </summary>/// <param name="texture"></param>/// <returns></returns>private void SaveImages(Texture2D texture){string path = Application.streamingAssetsPath;
#if UNITY_ANDROID && !UNITY_EDITORpath = "/sdcard/DCIM/Camera"; //设置图片保存到设备的目录.
#endifif (!Directory.Exists(path))Directory.CreateDirectory(path);string savePath = path + "/" + m_DailyBgConfigData.Maintitle + ".png";try{Application.HasUserAuthorization(UserAuthorization.Microphone);byte[] data = DeCompress(texture).EncodeToPNG();File.WriteAllBytes(savePath, data);OnSaveImagesPlartform(savePath);}catch{   }}/// <summary>/// 刷新相册(不需要单独创建原生aar或jar)/// </summary>/// <param name="path"></param>private void OnSaveImagesPlartform(string filePath){#if UNITY_ANDROID && !UNITY_EDITORstring[] paths = new string[1];paths[0] = filePath; using (AndroidJavaClass PlayerActivity = new AndroidJavaClass("com.unity3d.player.UnityPlayer")){AndroidJavaObject playerActivity = PlayerActivity.GetStatic<AndroidJavaObject>("currentActivity");using (AndroidJavaObject Conn = new AndroidJavaObject("android.media.MediaScannerConnection", playerActivity, null)){Conn.CallStatic("scanFile", playerActivity, paths, null, null);}}
#endif}/// <summary>/// 压缩图片/// </summary>/// <param name="source"></param>/// <returns></returns>public Texture2D DeCompress(Texture2D source){RenderTexture renderTex = RenderTexture.GetTemporary(source.width,source.height,0,RenderTextureFormat.Default,RenderTextureReadWrite.Linear);Graphics.Blit(source, renderTex);RenderTexture previous = RenderTexture.active;RenderTexture.active = renderTex;Texture2D readableText = new Texture2D(source.width, source.height);readableText.ReadPixels(new Rect(0, 0, renderTex.width, renderTex.height), 0, 0);readableText.Apply();RenderTexture.active = previous;RenderTexture.ReleaseTemporary(renderTex);return readableText;}

这里主要说下刷新相册的方法,如果我们不调用刷新的haul,图片是可以在文件管理器中找到的,但是并不会显示在相册中,MediaScannerConnection.scanFile是Android原生的接口,我们不再需要单独再去创建个AS项目,打个aar包

三、存储权限

Plugin->Android->AndroidManifest.xml中添加如写入权限

<manifest><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/></manifest>
  1. 上面提到如果我们写入的是外部存储,是需要存储权限的,但是如果在一进入游戏就显示权限申请弹窗,效果是非常不好的,我们可以在标签内添加如下设置,会在一开始跳过申请权限的弹窗
    <meta-data android:name="unityplayer.SkipPermissionsDialog" android:value="true" />
  1. 适当的地方申请权限

比如用户点击下载时,先行判断是否写入权限,没有的话就直接申请好啦

if (!UnityEngine.Android.Permission.HasUserAuthorizedPermission(UnityEngine.Android.Permission.ExternalStorageWrite)){UnityEngine.Android.Permission.RequestUserPermission(UnityEngine.Android.Permission.ExternalStorageWrite);return;}

Unity 保存图片到相册以及权限管理相关推荐

  1. Unity保存图片到相册

    Unity保存图片到Android相册 Java] 纯文本查看 复制代码 ? 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 2 ...

  2. Android 启动系统相机,相册,裁剪图片及6.0权限管理

    在日常开发中,我们经常需要用到上传图片的 功能,这个时候通常有两种做法,第一种,从相机获取,第二种,从相册获取.今天这篇博客主要讲解利用系统的Intent怎样获取? 主要内容如下 - 怎样通过相机获取 ...

  3. android拍照所需的权限,eclipse --- Android拍照,相册选择图片以及Android6.0权限管理...

    [实例简介] eclipse --- Android拍照,相册选择图片以及Android6.0权限管理 [实例截图] [核心代码] camreainandroidm └── camreainandro ...

  4. 【Ios】 Unity for iOS 打开相册、相机及保存图片到相册

    偶然在网上看到一位博主写的 unity 和ios 交互 个人感觉 功能很全 转载地址:http://blog.csdn.net/AnYuanLzh/article/details/50748928 在 ...

  5. android 打开相册的权限,Android 启动系统相机,相册,裁剪图片及6.0权限管理

    在日常开发中,我们经常需要用到上传图片的 功能,这个时候通常有两种做法,第一种,从相机获取,第二种,从相册获取.今天这篇博客主要讲解利用系统的Intent怎样获取? 主要内容如下 怎样通过相机获取我们 ...

  6. uniapp保存图片_Uniapp实现保存图片到相册(封装起来)

    我封装了一个方法,之后可以直接使用 在此之前,先用class封装一个Toast提示框 class Toast{ constructor(title,icon="success",d ...

  7. [转]Asp.Net大型项目实践(11)-基于MVC Action粒度的权限管理【续】【源码在这里】(在线demo,全部源码)...

    本文转自:http://www.cnblogs.com/legendxian/archive/2010/01/25/1655551.html 接上篇Asp.Net大型项目实践(10)-基于MVC Ac ...

  8. minio 授予永久访问权限_应对 iOS 14 权限管理 应用手把手教你打开“所有照片”权限...

    DoNews 11月3日消息(记者 刘文轩)苹果在 iOS 14 中带来全新的隐私管理功能,其中最亮眼的就是相册权限方面,可以为应用程序授予单独授予某张照片的访问权限,无需交出整个相册. 作为 iOS ...

  9. 微信小程序保存图片到相册;uni-app小程序保存网络图片到相册;小程序保存图片到相册拒绝授权后重新拉起授权;保存图片到系统相册;小程序保存图片测试可以,真机保存图片失败

    文末代码可以直接复制使用,图片修改成你的图片路径即可 一.场景: 小程序点击按钮,保存项目内的静态图片或者微信头像或者后端返回的图片: 二.注意点及思路拆分: –2.1:小程序保存图片功能,必须要有s ...

最新文章

  1. 数据结构与算法(3-2)队列(顺序队列、循环队列与链队列)
  2. python 信号量,Event, 定时器
  3. 给Ubuntu软件升级命令
  4. 什么是缓存一致性问题?如何解决呢?
  5. 五大开源游戏引擎介绍
  6. 报错空指针异常_让你为之颤抖的Java常见的异常exception
  7. 九度OJ 题目1011:最大连续子序列
  8. mysql视频教程特密码_分享一个MySQL 密码增强插件
  9. 一个axios的简单教程
  10. RedHat 设置IP、网关、DNS
  11. 2020.3二级中选择题文件类型题目全套
  12. 华为交换机学习指南基于端口划分VLAN的四种方案
  13. C语言如何判断一个整数是奇数还是偶数
  14. java throw throwable_异常处理:throw,throws和Throwable
  15. 【ESP 保姆级教程】疯狂传感器篇 —— 案例:ESP8266 + MQ3酒精传感器 + webserver(局域网内曲线变化图)+ 自定义飞书告警
  16. 系统引导盘制作与Windows系统安装
  17. 出走半生,归来仍是少女 | 年中总结
  18. Flutter 自定义组件实战
  19. iis8.0php套件包,iis8.0下载|iis8.0安装包微软Web服务器组件官方版 8..8 - 系统天堂
  20. 2021校招京东物流新锐之星校招笔试面试总结

热门文章

  1. 版本控制器(Git)
  2. sql语句练习题整理
  3. 【易盾图像识别】文字点选识别 附带 模型+数据集 +识别代码+思路
  4. 面试题63:搜索引擎(SEO)的优化
  5. 银河麒麟(Kylin)系统Ghost镜像文件(.kyimg)系统还原方法
  6. 单片机多功能调试助手
  7. Centos7 配置DHCP服务器,电脑可以获取IP,手机却无法获取IP
  8. ppt的快捷键的使用和显示
  9. 阿迪达斯双11成交额创新高,成为天猫第一运动品牌
  10. 项目-Java Web购物车-JSP实现