Android 保存圖片到設備
前言:在許多的應用或游戲中,大多都有保存圖片或者截圖等等的功能,這篇文檔我們的目的是通過 Unity 保存圖片,并且調用 Andorid 中的更新相冊的原生方法.
流程步驟:
編寫更新相冊的 Android 原生接口 -> Unity 編寫保存圖片邏輯以及調用更新相冊 Android 原生方法
本文檔使用的交互方式使用的是博主 Pieces_Jing
的交互優(yōu)化文檔.
現(xiàn)在開始我們的第一步~
1.編寫更新相冊的 Android 原生接口.
首先創(chuàng)建一個 Android 工程,命名可自定義.
設置好工程名后點擊 Next .
再次點擊 Next 后,選擇 Add No Activity (不創(chuàng)建 Activity)
創(chuàng)建好工程后,切換為 Project 視圖.
鼠標右鍵點擊我們的工程主目錄,選擇 Module 創(chuàng)建.
接著選擇 Android Library 后點擊 Next .
設置好 Module 名字后點擊 Finish .
右鍵點擊剛剛創(chuàng)建的目錄,添加一個 Java 類.
設置好代碼文件的名字(也是 Java 類名)后點擊 OK .
在剛剛創(chuàng)建的 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;
//我們創(chuàng)建的類
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 庫文件.
在我們的 Module 目錄下的 build -> outputs -> aar 中,會出現(xiàn)一個我們剛剛生成的 aar 庫.
很好,我們已經(jīng)將 Android 原生接口編寫完成了,接下來要將我們的 aar 庫添加到 Unity 工程中給其使用.
2.Unity 編寫保存圖片邏輯以及調用更新相冊 Android 原生方法
先創(chuàng)建一個 Unity 工程(若有 Untiy 使用經(jīng)驗者可跳過這一小節(jié) ).
選擇右上方的 New 后,設置工程名字后點擊 Create project 創(chuàng)建工程.
右鍵點擊 Assets 選擇 Create -> Folder 創(chuàng)建需要的文件夾.
根據(jù)下圖創(chuàng)建指定文件夾,分別為 Plugins 和 Android 文件夾.
回到 Android Studio 界面,右鍵點擊我們生成的 aar 庫,選擇 Copy 進行復制文件.
再回到 Unity 界面,右鍵點擊剛剛創(chuàng)建的 Android 文件夾.
打開 Android 文件夾,使用右鍵 "粘貼" 或 "Ctrl + V" 復制添加 aar 庫到此文件夾.
注意: aar 文件你可以自定義文件名字,盡量修改為符合 aar 庫中功能的名字,這里我就不做名字的修改了.
回到 Untiy 界面,創(chuàng)建一個 Images 文件夾(用于放置圖片資源)并隨意找一張圖片(這里我是用 Png 格式的圖片).
點擊導入的圖片文件,將 inspector 面板中的以下選項設置為相同形式.
接著再創(chuàng)建一個 Scripts 文件夾(用來存放我們的腳本文件).
再右鍵點擊 Scripts 文件夾選擇 Create -> C# Script 創(chuàng)建一個腳本文件,并且為其命名.
創(chuàng)建好我們的腳本后雙擊打開,添加以下代碼.
添加完記得 Ctrl + S 保存你的腳本.
using System.IO;
using System.Collections;
using UnityEngine;
using UnityEngine.UI;
public class SaveImage : MonoBehaviour
{
//點擊事件觸發(fā)保存操作
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 界面,開始創(chuàng)建我們的界面后打包運行.
在 Hierarchy 布局中,點擊鼠標右鍵選擇 UI 創(chuàng)建一個 Image 和 Button .
再點擊 Main Camera , 將我們剛剛編寫的腳本拖入 Inspector 布局中(注意是 Mian Camera 的 Insprctor)
接著點擊 Button 對象,找到 Inspector 布局 Button 組件下的 On Click ,點擊 + 號增加事件,將 Main Camera 拖入其中.
選擇我們腳本中的 OnClick 函數(shù).
再將 Image 對象拖入函數(shù)的參數(shù)中進行賦值.
注意: Image 中你需要手動把圖片附上去.
設置完畢后,再創(chuàng)建一個 Scenes 文件夾(用于存放場景文件), Ctrl + S 保存你的場景,設置場景名后確定保存.
一切準備就緒,那么我們就開始打包的配置了.
點擊 Add Open Scenes 設置你要加載的場景.
檢查你的開發(fā)環(huán)境是否是 Android ,若不是請點擊 Switch Platform 切換開發(fā)環(huán)境.
點擊 Player Settings 選擇 Other Settings 修改你的簽名(一定要修改).
再將 Write Permission 選擇為 External(SDCard) (注意這一步很重要,不然圖片會無法保存到你的手機).
接著就可以點擊 Build 打包在運行了.
點擊按鈕后,會出現(xiàn)一個 "保存成功" 的提示.
然后打開相冊,我們就會看到剛剛保存成功的圖片.
Over!