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

本文档介绍了Unity插件NativeGallery在Android和iOS上拉取手机相册的使用方法,包括设置权限、常见问题及解决方案。在iOS上,需要在PlayerSettings中设置权限,并在Xcode中配置Info.plist。在Android上,需注意WritePermission设置。常见问题涉及无法获取图片路径、Android构建失败和访问相册无响应等,提供了相应的解决办法。项目示例展示了如何使用GetImageFromGallery、LoadImageAtPath和SaveVideoToGallery等函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

拉取手机相册

项目中使用到了拉取手机相册的功能,使用的该插件。插件中有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();
}

资源链接

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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天富儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值