Unity要在安卓端刷新相册需要建安卓包,打开AndroidStudio(本人使用这个版本的android-studio-2020.3.1.25-windows),并新建项目(AndroidStudio的安装自行百度和使用)
先建一个活动
然后建一个Module,如果发现是灰色的看软件右下方是不是在加载东西,是的话等待加载完成才能创建Module。
注意要选Android Library不然是无法生成包的。
建一个类,名字随便起,一定要在包名内创建,不然unity是找不到类的。
引入代码内的import,然后直接复制Show方法到自己的类里面,参数activity的作用是到时候在unity获取它的活动类,path是图片的路径,activity.sendBroadcast方法是通知系统刷新相册,只有主活动有该方法。
不建议在安卓代码里使用Class.forName(),网上很多都是用以下代码段获取unity的活动类,我使用后发现根本无法正常获取到,猜测可能是扩展包没有权限读取到主活动的原因。
//无法获取到主活动的方法
Class<?> classtype = Class.forName("com.unity3d.player.UnityPlayer");
Activity activity = (Activity) classtype.getDeclaredField("currentActivity").get(classtype);
正常代码
package com.xiaodong.myapplication;
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import java.io.File;
public class MyApp {
public void Show(Activity activity,String path)
{
activity.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,
Uri.fromFile(new File(path))));
}
}
编写完后保存。
最后生成包
,并且等待完成
完成后会出现一个build文件夹,安装下图操作并且复制。
然后复制到Unity项目中(要在资源管理器复制,在Unity是复制不了的)。接下来相信找这种文章的朋友,Unity基本都是很熟练了,我就不讲解如何创建Unity项目了,直接上代码。
使用前多看代码里的注释。
using UnityEngine;
using UnityEngine.UI;
using System;
using System.IO;
using System.Runtime.InteropServices;
public class TextureLoock : MonoBehaviour
{
//定义一张图片,如果要使用Unity项目的图片需要给图片权限读写
public Texture texture;
//定义一个保存Texture的方法
publi void SaveTexture(Texture texture)
{
Texture2D t2d = new Texture2D(t.width, t.height, TextureFormat.ARGB32, true);
//将Texture 的像素保存到texture2D中
t2d.SetPixels(t.GetPixels());
//t2d.ReadPixels(new Rect(200,200,200,200),0,0,false);
t2d.Apply();
//编码
byte[] imageTytes = rotate(t2d).EncodeToJPG();
//获得安卓的根目录
string path = Application.persistentDataPath.Substring(0,
Application.persistentDataPath.IndexOf("Android"));
//创建相册文件夹,如果不存在就会创建
Directory.CreateDirectory( path + @"DCIM/Camera");
//将图片写入相册
File.WriteAllBytes(path + "DCIM/Camera/图片1314520.jpg", texture.EncodeToJPG());
//在这里我们获取到Unity里的活动类
var playerCls = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
//currentActivity是一个静态的字段,获得当前活动
var activity = playerCls.GetStatic<AndroidJavaObject>("currentActivity");
//如何获取我们自己的创建的插件包,com.xiaodong.myapplication是包名MyApp是类名
var my= new AndroidJavaObject("com.xiaodong.myapplication.MyApp");
//最后调用我们在安卓包里定义的刷新图片类
//参数一是传入我们定义的方法,参数二是传入Unity的活动类,参数三是路径,使用参数都是在根据安卓定义的方法来传入。
my.Call("Show", activity, path + "DCIM/Camera/MapMarker/" + name);
}
}
Unity内图片的读写权限打开
最后自己找张图片,创建一个游戏对象挂载脚本上去传入图片就好了这里不多演示,最后是打包安卓安装包,一定要把写入权限改成图中的一样,不然是无法写入图片的。
最后装机运行,你就会发现每次保存都会在相册看到图片的美貌。