Unity保存图片到Android手机且更新相册

Android 保存图片到设备

前言:在许多的应用或游戏中,大多都有保存图片或者截图等等的功能,这篇文档我们的目的是通过 Unity 保存图片,并且调用 Andorid 中的更新相册的原生方法.

流程步骤:

编写更新相册的 Android 原生接口 -> Unity 编写保存图片逻辑以及调用更新相册 Android 原生方法

本文档使用的交互方式使用的是博主 Pieces_Jing
的交互优化文档.

现在开始我们的第一步~

1.编写更新相册的 Android 原生接口.

首先创建一个 Android 工程,命名可自定义.

创建工程主界面

设置好工程名后点击 Next .

设置工程名

再次点击 Next 后,选择 Add No Activity (不创建 Activity)

不创建Activity

创建好工程后,切换为 Project 视图.

切换到Project视图

鼠标右键点击我们的工程主目录,选择 Module 创建.

创建Module

接着选择 Android Library 后点击 Next .

选择Android Library库

设置好 Module 名字后点击 Finish .

设置Module名字

右键点击刚刚创建的目录,添加一个 Java 类.

创建Java代码文件

设置好代码文件的名字(也是 Java 类名)后点击 OK .

设置Java代码文件名

在刚刚创建的 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 库文件.

导出aar包

在我们的 Module 目录下的 build -> outputs -> aar 中,会出现一个我们刚刚生成的 aar 库.

生成的aar包

很好,我们已经将 Android 原生接口编写完成了,接下来要将我们的 aar 库添加到 Unity 工程中给其使用.

2.Unity 编写保存图片逻辑以及调用更新相册 Android 原生方法

先创建一个 Unity 工程(若有 Untiy 使用经验者可跳过这一小节 ).

选择右上方的 New 后,设置工程名字后点击 Create project 创建工程.

创建Unity工程

右键点击 Assets 选择 Create -> Folder 创建需要的文件夹.

创建目录

根据下图创建指定文件夹,分别为 PluginsAndroid 文件夹.

Android目录

回到 Android Studio 界面,右键点击我们生成的 aar 库,选择 Copy 进行复制文件.

添加aar库

再回到 Unity 界面,右键点击刚刚创建的 Android 文件夹.

打开添加目录

打开 Android 文件夹,使用右键 "粘贴""Ctrl + V" 复制添加 aar 库到此文件夹.

注意: aar 文件你可以自定义文件名字,尽量修改为符合 aar 库中功能的名字,这里我就不做名字的修改了.

添加aar库后的文件夹

回到 Untiy 界面,创建一个 Images 文件夹(用于放置图片资源)并随意找一张图片(这里我是用 Png 格式的图片).

添加图片

点击导入的图片文件,将 inspector 面板中的以下选项设置为相同形式.

设置图片属性

接着再创建一个 Scripts 文件夹(用来存放我们的脚本文件).

再右键点击 Scripts 文件夹选择 Create -> C# Script 创建一个脚本文件,并且为其命名.

创建C#脚本

创建好我们的脚本后双击打开,添加以下代码.

添加完记得 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 创建一个 ImageButton .

创建UI布局

再点击 Main Camera , 将我们刚刚编写的脚本拖入 Inspector 布局中(注意是 Mian CameraInsprctor)

挂载脚本

接着点击 Button 对象,找到 Inspector 布局 Button 组件下的 On Click ,点击 + 号增加事件,将 Main Camera 拖入其中.

设置按钮事件

选择我们脚本中的 OnClick 函数.

选择事件

再将 Image 对象拖入函数的参数中进行赋值.

注意: Image 中你需要手动把图片附上去.

选择Image对象

设置完毕后,再创建一个 Scenes 文件夹(用于存放场景文件), Ctrl + S 保存你的场景,设置场景名后确定保存.

保存场景

一切准备就绪,那么我们就开始打包的配置了.

  • 点击 Add Open Scenes 设置你要加载的场景.

  • 检查你的开发环境是否是 Android ,若不是请点击 Switch Platform 切换开发环境.

设置开发环境

点击 Player Settings 选择 Other Settings 修改你的签名(一定要修改).

再将 Write Permission 选择为 External(SDCard) (注意这一步很重要,不然图片会无法保存到你的手机).

接着就可以点击 Build 打包在运行了.

设置签名

点击按钮后,会出现一个 "保存成功" 的提示.

保存成功

然后打开相册,我们就会看到刚刚保存成功的图片.

更新相册

Over!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,386评论 25 707
  • 用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你...
    hw1212阅读 12,680评论 2 59
  • Linux 软件包管理 RPM安装包管理 Software Package Mananger 包全名 操作的包...
    Marlon666阅读 285评论 2 0