Android 保存图片到设备
前言:在许多的应用或游戏中,大多都有保存图片或者截图等等的功能,这篇文档我们的目的是通过 Unity 保存图片,并且调用 Andorid 中的更新相册的原生方法.
流程步骤:
编写更新相册的 Android 原生接口 -> Unity 编写保存图片逻辑以及调用更新相册 Android 原生方法
现在开始我们的第一步~
1.编写更新相册的 Android 原生接口.
首先创建一个 Android 工程,命名可自定义.
![](https://img.haomeiwen.com/i9013307/dfb77c212bfb6407.png)
设置好工程名后点击 Next .
![](https://img.haomeiwen.com/i9013307/32b294a4c52bb86d.png)
再次点击 Next 后,选择 Add No Activity (不创建 Activity)
![](https://img.haomeiwen.com/i9013307/1a3677b47891d968.png)
创建好工程后,切换为 Project 视图.
![](https://img.haomeiwen.com/i9013307/01092ce1b0ed7d82.png)
鼠标右键点击我们的工程主目录,选择 Module 创建.
![](https://img.haomeiwen.com/i9013307/66c4220e121d242d.png)
接着选择 Android Library 后点击 Next .
![](https://img.haomeiwen.com/i9013307/83774e50cc43dda4.png)
设置好 Module 名字后点击 Finish .
![](https://img.haomeiwen.com/i9013307/3e5159990b0acf94.png)
右键点击刚刚创建的目录,添加一个 Java 类.
![](https://img.haomeiwen.com/i9013307/5ef167c7fec802fb.png)
设置好代码文件的名字(也是 Java 类名)后点击 OK .
![](https://img.haomeiwen.com/i9013307/6c15995465c038f9.png)
在刚刚创建的 Java 代码文件中编辑添加以下代码.
注意: 要添加所需要用到的库 以及 类名要与代码文件名一致.
//所需要用到的库
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.util.Log;
import android.widget.Toast;
import java.io.File;
//我们创建的类
public class SaveImageActivity {
//unity项目启动时的的Activity
private Activity _unityActivity;
//获取unity项目的Activity
private Activity getActivity() {
if (null == _unityActivity) {
try {
Class<?> classtype = Class.forName("com.unity3d.player.UnityPlayer");
Activity activity = (Activity) classtype.getDeclaredField("currentActivity").get(classtype);
_unityActivity = activity;
} catch (ClassNotFoundException e) {
} catch (IllegalAccessException e) {
} catch (NoSuchFieldException e) {
}
}
return _unityActivity;
}
//更新相册
public void scanFile(String filePath, String str) {
if(str == null)
str = "已保存到相册";//设置保存成功的提示内容.
Toast.makeText(getActivity(), str, Toast.LENGTH_SHORT).show();
Log.i("Unity", "------------filePath" + filePath);//打印保存文件路径日志
Intent scanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
scanIntent.setData(Uri.fromFile(new File(filePath)));
getActivity().sendBroadcast(scanIntent);
}
}
由于我们不想把此功能在 AndroidManifest.xml 中设置为 Main Activity ,所以这里我们不继承任何 Activity ,以 aar 的方式打包.
点击上方的 Build 选择 Rebuild Project 生成 aar 库文件.
![](https://img.haomeiwen.com/i9013307/3c6a82d4d77ab498.png)
在我们的 Module 目录下的 build -> outputs -> aar 中,会出现一个我们刚刚生成的 aar 库.
![](https://img.haomeiwen.com/i9013307/6588fe5799073175.png)
很好,我们已经将 Android 原生接口编写完成了,接下来要将我们的 aar 库添加到 Unity 工程中给其使用.
2.Unity 编写保存图片逻辑以及调用更新相册 Android 原生方法
先创建一个 Unity 工程(若有 Untiy 使用经验者可跳过这一小节 ).
选择右上方的 New 后,设置工程名字后点击 Create project 创建工程.
![](https://img.haomeiwen.com/i9013307/a50fcb760d82fc7c.png)
右键点击 Assets 选择 Create -> Folder 创建需要的文件夹.
![](https://img.haomeiwen.com/i9013307/31c2cba79524c583.png)
根据下图创建指定文件夹,分别为 Plugins 和 Android 文件夹.
![](https://img.haomeiwen.com/i9013307/a72f24e00c9804b1.png)
回到 Android Studio 界面,右键点击我们生成的 aar 库,选择 Copy 进行复制文件.
![](https://img.haomeiwen.com/i9013307/521c08b854d3f531.png)
再回到 Unity 界面,右键点击刚刚创建的 Android 文件夹.
![](https://img.haomeiwen.com/i9013307/6f1ad410de9fab4d.png)
打开 Android 文件夹,使用右键 "粘贴" 或 "Ctrl + V" 复制添加 aar 库到此文件夹.
注意: aar 文件你可以自定义文件名字,尽量修改为符合 aar 库中功能的名字,这里我就不做名字的修改了.
![](https://img.haomeiwen.com/i9013307/a74ce9b2f1b2fc63.png)
回到 Untiy 界面,创建一个 Images 文件夹(用于放置图片资源)并随意找一张图片(这里我是用 Png 格式的图片).
![](https://img.haomeiwen.com/i9013307/0572e9c13cf0d3a2.png)
点击导入的图片文件,将 inspector 面板中的以下选项设置为相同形式.
![](https://img.haomeiwen.com/i9013307/086e3eecaaf09de2.png)
接着再创建一个 Scripts 文件夹(用来存放我们的脚本文件).
再右键点击 Scripts 文件夹选择 Create -> C# Script 创建一个脚本文件,并且为其命名.
![](https://img.haomeiwen.com/i9013307/ef4faa1db1a1fcfc.png)
创建好我们的脚本后双击打开,添加以下代码.
添加完记得 Ctrl + S 保存你的脚本.
using System.IO;
using System.Collections;
using UnityEngine;
using UnityEngine.UI;
public class SaveImage : MonoBehaviour
{
//点击事件触发保存操作
public void OnCilck(Image images)
{
StartCoroutine(SaveImages(images.sprite.texture));
}
//保存Png图片
IEnumerator SaveImages(Texture2D texture)
{
string path = Application.persistentDataPath;
#if UNITY_ANDROID
path = "/sdcard/DCIM/SaveImage"; //设置图片保存到设备的目录.
#endif
if (!Directory.Exists(path))
Directory.CreateDirectory(path);
string savePath = path + "/" + texture.name + ".png";
File.WriteAllBytes(savePath, texture.EncodeToPNG());
savePngAndUpdate(savePath);
yield return new WaitForEndOfFrame();
}
//调用iOS或Android原生方法保存图片后更新相册.
private void savePngAndUpdate(string fileName)
{
#if UNITY_ANDROID
GetAndroidJavaObject().Call("scanFile", fileName, "保存成功辣٩(๑>◡<๑)۶ "); //这里我们可以设置保存成功弹窗内容
#endif
}
//用于获取Android原生方法类对象
private AndroidJavaObject GetAndroidJavaObject()
{
return new AndroidJavaObject("com.example.saveimagelibrary.SaveImageActivity"); //设置成我们aar库中的签名+类名
}
}
接着再回到 Unity 界面,开始创建我们的界面后打包运行.
在 Hierarchy 布局中,点击鼠标右键选择 UI 创建一个 Image 和 Button .
![](https://img.haomeiwen.com/i9013307/05f5263bcc5da12f.png)
再点击 Main Camera , 将我们刚刚编写的脚本拖入 Inspector 布局中(注意是 Mian Camera 的 Insprctor)
![](https://img.haomeiwen.com/i9013307/a72a5b710b6108dc.png)
接着点击 Button 对象,找到 Inspector 布局 Button 组件下的 On Click ,点击 + 号增加事件,将 Main Camera 拖入其中.
![](https://img.haomeiwen.com/i9013307/027d7b912418007e.png)
选择我们脚本中的 OnClick 函数.
![](https://img.haomeiwen.com/i9013307/eee969722620d06f.png)
再将 Image 对象拖入函数的参数中进行赋值.
注意: Image 中你需要手动把图片附上去.
![](https://img.haomeiwen.com/i9013307/b917128b792c78b7.png)
设置完毕后,再创建一个 Scenes 文件夹(用于存放场景文件), Ctrl + S 保存你的场景,设置场景名后确定保存.
![](https://img.haomeiwen.com/i9013307/4223ffaf8168f4ea.png)
一切准备就绪,那么我们就开始打包的配置了.
-
点击 Add Open Scenes 设置你要加载的场景.
-
检查你的开发环境是否是 Android ,若不是请点击 Switch Platform 切换开发环境.
![](https://img.haomeiwen.com/i9013307/ec2a564cd9b7338d.png)
点击 Player Settings 选择 Other Settings 修改你的签名(一定要修改).
再将 Write Permission 选择为 External(SDCard) (注意这一步很重要,不然图片会无法保存到你的手机).
接着就可以点击 Build 打包在运行了.
![](https://img.haomeiwen.com/i9013307/41d936dfb23f33a8.png)
点击按钮后,会出现一个 "保存成功" 的提示.
![](https://img.haomeiwen.com/i9013307/c71168923022ab73.png)
然后打开相册,我们就会看到刚刚保存成功的图片.
![](https://img.haomeiwen.com/i9013307/86ab4d376262beb3.png)
Over!
网友评论