java下载图片到手机相册_Unity保存图片到Android手机且更新相册

Android 保存图片到设备

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

流程步骤:

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

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

的交互优化文档.

现在开始我们的第一步~

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

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

d517560a826c

创建工程主界面

设置好工程名后点击 Next .

d517560a826c

设置工程名

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

d517560a826c

不创建Activity

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

d517560a826c

切换到Project视图

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

d517560a826c

创建Module

接着选择 Android Library 后点击 Next .

d517560a826c

选择Android Library库

设置好 Module 名字后点击 Finish .

d517560a826c

设置Module名字

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

d517560a826c

创建Java代码文件

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

d517560a826c

设置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 库文件.

d517560a826c

导出aar包

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

d517560a826c

生成的aar包

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

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

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

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

d517560a826c

创建Unity工程

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

d517560a826c

创建目录

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

d517560a826c

Android目录

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

d517560a826c

添加aar库

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

d517560a826c

打开添加目录

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

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

d517560a826c

添加aar库后的文件夹

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

d517560a826c

添加图片

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

d517560a826c

设置图片属性

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

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

d517560a826c

创建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 创建一个 Image 和 Button .

d517560a826c

创建UI布局

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

d517560a826c

挂载脚本

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

d517560a826c

设置按钮事件

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

d517560a826c

选择事件

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

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

d517560a826c

选择Image对象

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

d517560a826c

保存场景

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

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

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

d517560a826c

设置开发环境

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

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

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

d517560a826c

设置签名

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

d517560a826c

保存成功

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

d517560a826c

更新相册

Over!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/329149.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何在 Java 中正确使用 wait, notify 和 notifyAll – 以生产者消费者模型为例

转载自 如何在 Java 中正确使用 wait, notify 和 notifyAll – 以生产者消费者模型为例 wait, notify 和 notifyAll,这些在多线程中被经常用到的保留关键字,在实际开发的时候很多时候却并没有被大家重视。本文对这些关键字的使用进行了描述。 在 Java 中…

.NET Core 使用Dapper 操作MySQL

.NET Core 使用Dapper 操作MySQL 数据库, .NET Core 使用Dapper。 目前官方没有出.NET Core MySQL 驱动,但是已经有第三方进行改动封装出.NET Core MySQL Connector 预览版。 Dapper 也已经出了 .NET Core 预览版。 Dapper dot net 是一个轻量型的ORM&a…

Angular 2与TypeScript概览

迄今为止,在创建Web应用方面,AngularJS是当前最为流行的JavaScript框架。如今,Angular 2和TypeScript通过一种非常类似于Java 8的语法,使真正面向对象的Web开发成为了主流。 据Google的工程主管Brad Green介绍,有130万…

正确使用 Volatile 变量

转载自 Java 理论与实践 - 正确使用 Volatile 变量 - volatile 变量使用指南Java 语言中的 volatile 变量可以被看作是一种 “程度较轻的 synchronized”;与 synchronized 块相比,volatile 变量所需的编码较少,并且运行时开销也较少&#xf…

java龟兔赛跑设计思路_JAVA程序设计(09)-----面对对象设计初级应用 龟兔赛跑

1.乌龟和兔子共有属性和方法 做成父类 避免重复代码package com.lovo;/*** 类: 动物* author Abe* 属性: 名字 步距 总距离 睡觉的日子*/public class Animal {protected String name;protected int step;protected int distance;protected int sleepDay…

16年国庆假期期间兼职所悟

2016年9月25日,学校放假了!!! 学校放假11天,10月7号才开学,除了晚上上个夜班之外别的时间都在闲着,这么大的自己感觉闲着真不是滋味,于是开始疯狂的在58上找工作,心里想…

python flask项目过程_Python 开发过程遇到的问题

另一方面,也是因为时间原因,没有事先系统了解 python 的具体内容,所以开发过程中基本都是拿 java 的东西往 python 里面套。比如:某个功能用 java 的 ArrayList 可以解决,那 python 中有没有类似的东西呢?j…

Java 中的双重检查(Double-Check)

转载自 Java 中的双重检查(Double-Check) 在 Effecitve Java 一书的第 48 条中提到了双重检查模式,并指出这种模式在 Java 中通常并不适用。该模式的结构如下所示: public Resource getResource() { if (resource null) { …

使用 Autofac 进行依赖注入

先说下为什么翻译这篇文章,既定的方向是架构,然后为了学习架构就去学习一些架构模式、设计思想。 突然有一天发现依赖注入这种技能。为了使得架构可测试、易维护、可扩展,需要架构设计为松耦合类型,简单的说也就是解耦。为了解耦前…

组合的示例代码 java_java实现Composite组合模式的实例代码

//20210121写在前面:刚期末考试完,考了面向对象,里边儿有23个设计模式,我寻思着考完挨个儿实现一下,本文实现组合模式组合模式核心思想类似文件夹的概念,构件树形结构,树形有叶子结点和文件夹结…

Java中的ThreadPoolExecutor类

转载自 Java中的ThreadPoolExecutor类在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了&…

webpack 前端构建

一、建立简单的项目目录 1、创建 manager 根目录(作为项目根目录)2、执行 npm init,在根目录manager下自动生成 package.json文件3、npm install webpack --save-dev,在项目中安装 webpack npm包4、在根目录下 创建 webpack.config.js,所有的…

简析 .NET Core 构成体系

简析 .NET Core 构成体系Roslyn 编译器RyuJIT 编译器CoreCLR & CoreRTCoreFX(.NET Core Libraries).NET Core 代码开发、部署、运行过程总结 前文介绍了.NET Core 在整个.NET 平台所处的地位,以及与.NET Framework的关系(原文链接),本文将详细介绍.N…

判断一个男人穷还是富,只看这几点!

转载至: 来源:甜蜜爸妈手记(wxtm01) 作者:甜甜妈 创业君 导读 千主意万主意,如果不行动,永远就只是个想法而已。好想法要配得上行动才行。 看看他的爱好一个有事业心男人,绝对不…

php制作留言板的题_PHP实现留言板功能实例代码

本文实例为大家分享了php留言板的实现思路,供大家参考,具体内容如下:1.创建一个存放留言信息的文件名2.获取表单中的数据给一个变量3.判断文件的时候存在4.对文件执行写的操作,在这之前,注意打开文件的时候&#xff0c…

Java线程池,从使用到原理

转载自 Java线程池,从使用到原理线程池的技术背景 在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源。在Java中更是如此,虚拟机将试图跟踪每一个对象,以便能够在对象销毁…

聊聊HTTPS和SSL/TLS协议

要说清楚 HTTPS 协议的实现原理,至少需要如下几个背景知识。1. 大致了解几个基本术语(HTTPS、SSL、TLS)的含义2. 大致了解 HTTP 和 TCP 的关系(尤其是“短连接”VS“长连接”)3. 大致了解加密算法的概念(尤…

php事件编程,PHP相应button中onclick事件的案例分析

PHP相应button中onclick事件的案例分析发布时间:2020-11-10 11:28:31来源:亿速云阅读:71作者:小新小编给大家分享一下PHP相应button中onclick事件的案例分析,相信大部分人都还不怎么了解,因此分享这篇文章给…

Java 中Timer和TimerTask 定时器和定时任务使用的例子

转载自 Java 中Timer和TimerTask 定时器和定时任务使用的例子 这两个类使用起来非常方便,可以完成我们对定时器的绝大多数需求 Timer类是用来执行任务的类,它接受一个TimerTask做参数 Timer有两种执行任务的模式,最常用的是schedule,它可以以两种方式执…

复制一个5G文件只需要两秒,全网最牛方法!

文章来至 微信公众号:中国黑客联盟 很多时候我们在复制比较大的文件的时候是一件多么痛苦的事情,因为少的几分钟多则十几分钟,这样的等待是我们无法容忍的!那么今天我们就教大家如何快速的复制电脑大文件! 首先我…