unity3D技术分享Unity与AndroidUnity

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

2018-11-15  本文已影响1人  漩涡小子

Android 保存图片到设备

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

流程步骤:

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

现在开始我们的第一步~

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 保存你的场景,设置场景名后确定保存.

保存场景

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

设置开发环境

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

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

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

设置签名

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

保存成功

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

更新相册

Over!

上一篇下一篇

猜你喜欢

热点阅读