Unity插件NativeGallery拉取手机相册的使用简记

  • 拉取手机相册
    • 文档摘要
      • 1. 关于
      • 2. 使用设置
      • 3.常见问题解答
    • 项目示例
  • 资源链接

拉取手机相册

项目中使用到了拉取手机相册的功能,使用的该插件。插件中有README.txt英文文档,对插件有一定的用法介绍,这里使用中文记录一下,并分享一下自己使用时遇到的问题。

文档摘要

关于API接口,可以自行查看使用。

1. 关于

这个插件可以帮助你在Android和iOS上与Gallery/Photos交互。

2. 使用设置

  • Android:在Player Settings中将“Write Permission”设置为“External (SDCard)”
  • iOS:有两种方法设置插件在iOS上:
    • iOS自动设置:

      • (可选)修改Plugins/NativeGallery/Editor/NGPostProcessBuild.csPHOTO_LIBRARY_USAGE_DESCRIPTIONPHOTO_LIBRARY_ADDITIONS_USAGE_DESCRIPTION的值为“Save media to Photos”。
      • (Unity 2017.4或更早的版本)如果你的最低部署目标(iOS版本)至少是8.0,在NGPostProcessBuild.cs中设置MINIMUM_TARGET_8_OR_ABOVE的值为true。
    • iOS系统手动配置:
      • NGPostProcessBuild.cs中将ENABLED的值设置为false。
      • 构建你的项目。
      • 在Xcode中的“Info. plist”文件中输入“Privacy - Photo Library Usage Description”。
      • 在Xcode中,如果存在的话,也输入一个“Privacy - Photo Library Additions Usage Description”在“Info. plist”文件中。
      • 在Xcode中,如果存在,设置“Info. plist”文件中的“Prevent limited photos access alert”属性的值为1(Y)。
      • 在Unity- iphone Target(和Unity 2019.3或更新版本上的UnityFramework Target)的“Other Linker Flags”中插入:“-weak_framework PhotosUI -weak_framework Photos -framework AssetsLibrary -framework MobileCoreServices -framework ImageIO”(如果你的部署目标至少是8.0,插入“-weak_framework PhotosUI -framework Photos -framework MobileCoreServices -framework ImageIO”足以)。
      • 最后,如果有的话,删除“Photos.framework”和“PhotosUI.framework”,从在构建阶段的链接二进制文件“Unity-iPhone Target”中的“Link Binary With Libraries”(和Unity 2019.3或更新版本的Unity的UnityFramework Target上)。
      • 重要:如果你的目标是iOS 14或更高版本,你需要用Xcode 12或更高版本来构建你的应用,以避免任何权限问题。

      个人着重标注:括号中的内容要特别注意,尤其我用红字标注的,项目中因为没有在意其内容,导致项目无法打包运行测试,最后各种尝试耗时很久之后终于成功之后,发现差的就是忽视的那些内容。直到记录这个文章的时候才发现。。。哭(╥╯^╰╥)

3.常见问题解答

  • 在iOS系统中,如何获取已保存图像的路径或选中图像的原始路径?
    不能获取。在iOS上,这些文件被存储在一个我们无法访问的内部目录中(我认为甚至没有办法获取内部路径)。
  • Android构建失败,在控制台返回:“error: attribute Android:requestLegacyExternalStorage not found”。
    "android:requestLegacyExternalStorage"属性在AndroidManifest.xml修复一个罕见的unauthoredaccessexception在android 10上,但要求你更新你的android SDK到至少SDK 29版本。如果这对你来说不可能,你应该使用WinRAR或7-Zip打开NativeGallery.aar,然后删除"<application … />"标签从AndroidManifest.xml
  • 不能访问相册,日志上面显示着"java.lang.ClassNotFoundException: com.yasirkula.unity.NativeGallery"。
    如果你确定你的插件是最新的,那么在播放器设置中启用“Custom Proguard File”选项,并添加以下行到该文件:-keep class com.yasirkula.unity.* {*; }
  • 没有什么发生时,我试图在Android上访问相册。
    确保你已经在Player Settings中将“Write Permission”设置为“External (SDCard)”。
  • NativeGallery函数返回Permission。即使我将“Write Permission”设置为“External (SDCard)”也被拒绝。
    在Plugins/Android/AndroidManifest.xml文件中手动声明WRITE_EXTERNAL_STORAGE权限,如下所示:<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" tools:node="replace"/>
    您需要将以下属性添加<manifest ...>到元素:xmlns:tools="http://schemas.android.com/tools"
  • 保存图像/视频不能正常工作。
    确保Save函数的“filename”参数也包含文件的扩展名。

项目示例

我这边项目中测试使用的只有3个接口函数,分别是:访问相册(NativeGallery.GetImageFromGallery)、读取图片(NativeGallery.LoadImageAtPath)和视频保存导向相册(NativeGallery.SaveVideoToGallery)。

  1. 首先,就是项目中主要用到的拉取相册的功能。使用起来很简单,函数第一个参数是一个委托,字符串string参数无返回值的委托,是当你在相册中选择一个图片之后,唤醒的一个委托事件,通常适用于项目中的加载选中图片的;第二个是题目;第三个是图片的格式后缀。
private void PhotoAlbum()
{//相册选择NativeGallery.Permission permission = NativeGallery.GetImageFromGallery(PhotoAlbum, "选择一张图片", "image/png");
}
  1. 当在相册中选择了一张照片之后,就需要加载为项目这张照片。
    下面代码中的函数,就上面提到的用于加载的委托事件。函数传入的就是照片的路径(path);2048是我设置的图片的的最大尺寸;最后一个是图片纹理文件是否要标记为不可读。
    当然在知道了照片的路径(path)之后,其实可以不使用该函数加载。可以使用自己写的函数或方法,如Unity就可以使用Unity自己的异步加载方法UnityWebRequestTexture.GetTexture("file://" + path)加载照片。
Texture2D texture2D;
private void PhotoAlbum(string path)
{texture2D = NativeGallery.LoadImageAtPath(path, 2048, false);
}
  1. 下面的函数是用于保存视频到相册中。
    目前只在iOS系统测试成功;安卓方面好像是因为系统升级,Unity无法访问除应用根目录意外的内存空间文件,如果有能解决这个问题的小伙伴,希望能分享给我。
    这里要注意一点,视频其实是在上一步就已经录好,并已经储存在内存当中的。只是因为权限等原因,手机相册并不会显示该视频,这个函数只是让相册显示该视频而已,并不具备储存视频到内存的功能。
    故,函数中第一个参数就是视频在内存中的路径;第二个是相册中视频所在的文件夹,如果没有会自动创建;第三个就是视频的名称;最后就是在操作完成后,可能需要运行的委托事件,这里我就是直接将结果打印出来。
public void SaveRecording()
{if (Application.platform == RuntimePlatform.Android){//未实现string path = Application.persistentDataPath;int index = path.IndexOf('0') + 2;path = path.Remove(0, index);NativeGallery.SaveVideoToGallery(m_resultPath, path, "Test_{0}.mp4", (string error) => { Debug.Log("保存视频结果:" + error); });}else if (Application.platform == RuntimePlatform.IPhonePlayer){//已实现NativeGallery.SaveVideoToGallery(m_resultPath, "Test", "Test_{0}.mp4", (string error) => { Debug.Log("保存视频结果:" + error); });}RemoveRecording();
}

资源链接

插件资源目前还都是免费的:

  • Unity插件商店:https://assetstore.unity.com/packages/tools/integration/native-gallery-for-android-ios-112630
  • Github:https://github.com/yasirkula/UnityNativeGallery

Unity插件NativeGallery拉取手机相册的使用简记相关推荐

  1. Unity for IOS 加载手机相册图片以及打开相机拍照获取图片

    Unity for IOS 加载手机相册图片以及打开相机拍照获取图片 最近想做一个使用unity for IOS获取手机图片的功能,所以就研究了一下 这里我们需要创建两个objective-c文件,最 ...

  2. 【游戏测试】用 python 写个自动拉取手机或模拟器游戏 log 到本地的工具

    情景:开发人员在查 bug 时经常需要我们提供手机或模拟器中的 log,之前都是手动或用adb命令拉取后再发送给前端程序员,鉴于不太方便自己写了个脚本实现一键拉去日志到本地的功能. 运行后的效果,所有 ...

  3. unity保存图片到手机相册,安卓

    第一步,加载图片: string url = "图片所在路径";Texture2D texture = (Texture2D)Resources.Load(url); 第二步,写入 ...

  4. 微信小程序保存图片到相册授权被拒绝后重新拉取授权的方法

    近期开发过小程序的童鞋应该已经知道,小程序某些接口已废弃,改用新的接口. 比如wx.getUserInfo().wx.authorize().wx.openSetting()等都将废弃,拉起不了用户授 ...

  5. Unity iOS截图并保存到手机相册总结

    Unity iOS捕捉相机拍到的画面并截图保存到手机相册总结 本文专门针对小白,详细(图文)的写了通过unity 3d实现ios捕捉相机拍到的画面并截图保存到手机相册的方法.(对大佬来说可能写的略显繁 ...

  6. php file取不到手机相册,webuploader移动端选择文件无法打开手机相册的解决办法...

    webuploader移动端选择文件无法打开手机相册的解决办法 本文为转载: 原文链接:http://www.juguw.net/article-2325.html webUploader是一款不错的 ...

  7. Unity截屏保存到安卓手机相册

    1.首先本人同样用了和大家一样的方法在百度查了很久的资料,之后又看API,官方帮助文档,之后终于解决了这个问题.在网上查到的都是代码几乎都是一个模子刻出来的,现在贴上我自己查了资料后改的代码. 2.直 ...

  8. Unity 插件使用笔记

    目录 AssetBundle AssetBundle Manager EasySave UGUI-Edito Unity Favourites Panel Curvy Spline 流体插件Obi F ...

  9. 拉取小米MIUI系统的framework.jar实践之旅

    [前言] 最近在研究插件化技术的实现,本来其他品牌的机子,测试得挺好,后来测试一下小米的机子,发现Resources替换出现问题,试着断点调试一下发现,小米MIUI系统自己继承Resources重写了 ...

最新文章

  1. Maven学习总结(八)——使用Maven构建多模块项目
  2. 【Linux】tail命令
  3. mysql 相除 取整数位,psql除法保留小数,实现向上取整和向下取整操作_PostgreSQL_数据库...
  4. SM50强制终结后台JOB进程
  5. 获取了网站源码有什么用_角点科技:用 Wordpress 建设企业网站需要准备些什么...
  6. Java中Filter的理解
  7. 小白学python需要多久_小白学Python | 你还在说你入不了门吗
  8. Python 输入一些数,统计最大值及其出现的频率,求一个数的全部质因数
  9. ultraedit 运行的是试用模式_单元测试 —— 前后端分离开发模式下后端质量的保证...
  10. CY7C68013 USB接口相机开发记录 - 第一天:资料下载
  11. 支持IE,Firefox的日历控件
  12. Bug管理的流程和几个重点
  13. Javascript模式——函数提升 (笔记)
  14. trim去除空格失败
  15. 怎么把度分秒化成小数_excel中批量将经纬度度分秒转换成十进制小数点的方法介绍...
  16. 慧翔PMP培训及感想
  17. 国际期刊出版趋势及科技论文写作要点
  18. 字幕制作 分享剪辑视频添加滚动字幕的操作步骤
  19. Syntax Error: Error: No ESLint configuration found Syntax Error: TypeError: eslint.CLIEngine i
  20. 7-2 矮冬瓜火锅店周年庆“冬瓜会员”查询

热门文章

  1. AxisFault另外一个问题
  2. 什么是流程图?一篇文章就帮你搞定了
  3. [005]-css实现热气球
  4. scp远程传输文件报错,不是完整文件,not a regular file
  5. Linux搭建Socks5代理服务器
  6. 尚硅谷SpringMVC项目无法解析MVC视图‘index‘无法跳转到index.html
  7. 基于web的人才招聘求职位系统java ssm毕业设计源码介绍
  8. 基于java开发的健身器材电商管理系统.rar(含项目源码前后端项目)
  9. Python函数中的闭包与装饰器
  10. html如何把图片填充颜色渐变,css图片怎么设置透明度渐变?