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

这篇具有很好参考价值的文章主要介绍了Unity 保存图片到相册以及权限管理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、前言

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

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

打开图片的读写功能Unity 保存图片到相册以及权限管理

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

File写入贴图时,需要将图片转成字节数组,texture2D.EncodeToPNG(),但是会出现如下报错
Unity 保存图片到相册以及权限管理

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

        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_EDITOR
            path = "/sdcard/DCIM/Camera"; //设置图片保存到设备的目录.
#endif
            if (!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_EDITOR
            string[] 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. 适当的地方申请权限

比如用户点击下载时,先行判断是否写入权限,没有的话就直接申请好啦文章来源地址https://www.toymoban.com/news/detail-452004.html

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

到了这里,关于Unity 保存图片到相册以及权限管理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 微信小程序保存图片到相册 微信小程序实现将图片保存到手机相册(方案一)

    目录 微信小程序实现将图片保存到手机相册(方案一) 微信小程序实现将图片保存到手机相册(方案二) 微信小程序之点击复制文本到剪贴板 微信小程序---判断是IOS还是安卓 微信小程序分享图片给微信好友 首先我们需要调用wx.downloadFile方法下载文件资源到本地,然后利用

    2023年04月20日
    浏览(41)
  • [小程序实现保存图片到相册]

    实现逻辑: 首先查看用户申请过的权限中是否有”保存图片到相册“,如果没有这个权限,则需要先申请权限(弹窗授权),如果用户同意授权则保存图片,如果用户不同意,则跳转到设置页,重新授权,然后再保存图片。 查看用户申请的全县有哪些 通过微信的API 获取用户

    2024年02月16日
    浏览(36)
  • flutter开发实战-图片保存到相册

    flutter开发实战-图片保存到相册。保存相册使用的是image_gallery_saver插件 在pubspec.yaml中引入插件 使用image_gallery_saver将图片保存到相册 flutter开发实战-图片保存到相册。保存相册使用的是image_gallery_saver插件。 学习记录,每天不停进步。

    2024年02月15日
    浏览(59)
  • uniapp-小程序保存图片到相册

    一. 将图片保存到手机相册涉及的 api 有以下几个 1. uni.getSetting (获取用户的当前设置) 2. uni.authorize (提前向用户发起授权请求。调用后会立刻弹窗询问用户是否同意授权小程序使用某项功能或获取用户的某些数据,但不会实际调用对应接口。如果用户之前已经同意授权,则不

    2024年04月22日
    浏览(37)
  • 小程序生成分享海报图片并保存相册

    最近开发的小程序都有分享需求,功能大体为点击分享按钮,或主动生成海报后,用户操作保存对应海报为图片实现分享。以下是具体实现。 最终生成效果如图: 此处主要是生成工具库来生成普通二维码,如果要生成小程序码,只能通过后台接口调用开放API实现,且需要小

    2024年02月16日
    浏览(68)
  • flutter base64图片保存到相册

    首先base64转成uint8List,然后再用插件保存到相册(没有内置的方法处理) 保存图片的插件 完整代码如下 为啥要用下面 因为’data:image/png;base64,’ is part of the data URL,不是base-64字符串的一部分。您需要首先从URL中提取base-64数据。 否则就会报错如下: 网站用图片转base64如下

    2024年02月01日
    浏览(41)
  • android 11及以上保存图片视频到相册

    Android 10之前版本主要步骤 请求读写权限 图片/视频下载到/storage/emulated/0/Android/data/包名/xxx 复制到系统相册目录下 扫描媒体库 Android 10及以上版本主要步骤 请求读写权限 图片/视频下载到/storage/emulated/0/Android/data/包名/xxx 创建ContentValues,写入要保存的信息 调用ContentResolver插入

    2024年02月11日
    浏览(42)
  • 微信小程序实现将图片保存到手机相册

    首先我们需要调用 wx.downloadFile 方法下载文件资源到本地,然后利用 wx.saveImageToPhotosAlbum 方法保存图片到系统相册,需要注意的是这样写很可能会因为没有权限而导致下载不了图片,所以我们最后还需要给接口一个调用失败的回调函数,以此来获取权限,最后这个小功能就实

    2024年02月11日
    浏览(64)
  • 微信小程序——保存图片到手机相册(代码详解)

    首先我们要知道,如果小程序首次发起授权被拒绝之后,再次点击同一个按钮执行的wx.authorize(...)不会再弹出授权窗口。所以我们需要到引导用户到设置页面进行手动授权。 引导用户到设置页面授权的方式有两种: 第一种: 使用小程序api :wx.openSetting(...)打开设置页面 第二

    2024年02月04日
    浏览(49)
  • 微信小程序canvas画布图片保存到相册官方授权、自定义授权、保存

    目录 关键步骤介绍 Component实现自定义授权弹框 wx.getSetting可以获取授权信息。 wx.authorize首次授权时会打开弹框让用户授权,若用户已选择同意或拒绝,后续不会再显示授权弹框。 如果授权信息显示未进行相册授权,则打开自定义弹框(show_auth: true)让用户选择是否自行配置

    2024年01月16日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包