Unity保存圖片到Android手機且更新相冊

Android 保存圖片到設備

前言:在許多的應用或游戲中,大多都有保存圖片或者截圖等等的功能,這篇文檔我們的目的是通過 Unity 保存圖片,并且調用 Andorid 中的更新相冊的原生方法.

流程步驟:

編寫更新相冊的 Android 原生接口 -> Unity 編寫保存圖片邏輯以及調用更新相冊 Android 原生方法

本文檔使用的交互方式使用的是博主 Pieces_Jing
的交互優(yōu)化文檔.

現(xiàn)在開始我們的第一步~

1.編寫更新相冊的 Android 原生接口.

首先創(chuàng)建一個 Android 工程,命名可自定義.

創(chuàng)建工程主界面

設置好工程名后點擊 Next .

設置工程名

再次點擊 Next 后,選擇 Add No Activity (不創(chuàng)建 Activity)

不創(chuàng)建Activity

創(chuàng)建好工程后,切換為 Project 視圖.

切換到Project視圖

鼠標右鍵點擊我們的工程主目錄,選擇 Module 創(chuàng)建.

創(chuàng)建Module

接著選擇 Android Library 后點擊 Next .

選擇Android Library庫

設置好 Module 名字后點擊 Finish .

設置Module名字

右鍵點擊剛剛創(chuàng)建的目錄,添加一個 Java 類.

創(chuàng)建Java代碼文件

設置好代碼文件的名字(也是 Java 類名)后點擊 OK .

設置Java代碼文件名

在剛剛創(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 庫文件.

導出aar包

在我們的 Module 目錄下的 build -> outputs -> aar 中,會出現(xiàn)一個我們剛剛生成的 aar 庫.

生成的aar包

很好,我們已經(jīng)將 Android 原生接口編寫完成了,接下來要將我們的 aar 庫添加到 Unity 工程中給其使用.

2.Unity 編寫保存圖片邏輯以及調用更新相冊 Android 原生方法

先創(chuàng)建一個 Unity 工程(若有 Untiy 使用經(jīng)驗者可跳過這一小節(jié) ).

選擇右上方的 New 后,設置工程名字后點擊 Create project 創(chuàng)建工程.

創(chuàng)建Unity工程

右鍵點擊 Assets 選擇 Create -> Folder 創(chuàng)建需要的文件夾.

創(chuàng)建目錄

根據(jù)下圖創(chuàng)建指定文件夾,分別為 PluginsAndroid 文件夾.

Android目錄

回到 Android Studio 界面,右鍵點擊我們生成的 aar 庫,選擇 Copy 進行復制文件.

添加aar庫

再回到 Unity 界面,右鍵點擊剛剛創(chuàng)建的 Android 文件夾.

打開添加目錄

打開 Android 文件夾,使用右鍵 "粘貼""Ctrl + V" 復制添加 aar 庫到此文件夾.

注意: aar 文件你可以自定義文件名字,盡量修改為符合 aar 庫中功能的名字,這里我就不做名字的修改了.

添加aar庫后的文件夾

回到 Untiy 界面,創(chuàng)建一個 Images 文件夾(用于放置圖片資源)并隨意找一張圖片(這里我是用 Png 格式的圖片).

添加圖片

點擊導入的圖片文件,將 inspector 面板中的以下選項設置為相同形式.

設置圖片屬性

接著再創(chuàng)建一個 Scripts 文件夾(用來存放我們的腳本文件).

再右鍵點擊 Scripts 文件夾選擇 Create -> C# Script 創(chuàng)建一個腳本文件,并且為其命名.

創(chuàng)建C#腳本

創(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)建一個 ImageButton .

創(chuàng)建UI布局

再點擊 Main Camera , 將我們剛剛編寫的腳本拖入 Inspector 布局中(注意是 Mian CameraInsprctor)

掛載腳本

接著點擊 Button 對象,找到 Inspector 布局 Button 組件下的 On Click ,點擊 + 號增加事件,將 Main Camera 拖入其中.

設置按鈕事件

選擇我們腳本中的 OnClick 函數(shù).

選擇事件

再將 Image 對象拖入函數(shù)的參數(shù)中進行賦值.

注意: Image 中你需要手動把圖片附上去.

選擇Image對象

設置完畢后,再創(chuàng)建一個 Scenes 文件夾(用于存放場景文件), Ctrl + S 保存你的場景,設置場景名后確定保存.

保存場景

一切準備就緒,那么我們就開始打包的配置了.

  • 點擊 Add Open Scenes 設置你要加載的場景.

  • 檢查你的開發(fā)環(huán)境是否是 Android ,若不是請點擊 Switch Platform 切換開發(fā)環(huán)境.

設置開發(fā)環(huán)境

點擊 Player Settings 選擇 Other Settings 修改你的簽名(一定要修改).

再將 Write Permission 選擇為 External(SDCard) (注意這一步很重要,不然圖片會無法保存到你的手機).

接著就可以點擊 Build 打包在運行了.

設置簽名

點擊按鈕后,會出現(xiàn)一個 "保存成功" 的提示.

保存成功

然后打開相冊,我們就會看到剛剛保存成功的圖片.

更新相冊

Over!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市华蜒,隨后出現(xiàn)的幾起案子锹锰,更是在濱河造成了極大的恐慌鲫凶,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件球及,死亡現(xiàn)場離奇詭異芋忿,居然都是意外死亡,警方通過查閱死者的電腦和手機绒北,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來察署,“玉大人闷游,你說我怎么就攤上這事√簦” “怎么了脐往?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長扳埂。 經(jīng)常有香客問我业簿,道長,這世上最難降的妖魔是什么阳懂? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任梅尤,我火速辦了婚禮,結果婚禮上岩调,老公的妹妹穿的比我還像新娘巷燥。我一直安慰自己,他們只是感情好号枕,可當我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布缰揪。 她就那樣靜靜地躺著,像睡著了一般葱淳。 火紅的嫁衣襯著肌膚如雪钝腺。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天蛙紫,我揣著相機與錄音拍屑,去河邊找鬼。 笑死坑傅,一個胖子當著我的面吹牛僵驰,可吹牛的內容都是我干的。 我是一名探鬼主播唁毒,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼蒜茴,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了浆西?” 一聲冷哼從身側響起粉私,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎近零,沒想到半個月后诺核,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體抄肖,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年窖杀,在試婚紗的時候發(fā)現(xiàn)自己被綠了漓摩。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡入客,死狀恐怖管毙,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情桌硫,我是刑警寧澤夭咬,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站铆隘,受9級特大地震影響卓舵,放射性物質發(fā)生泄漏。R本人自食惡果不足惜咖驮,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一边器、第九天 我趴在偏房一處隱蔽的房頂上張望训枢。 院中可真熱鬧托修,春花似錦、人聲如沸恒界。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽十酣。三九已至涩拙,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間耸采,已是汗流浹背兴泥。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留虾宇,地道東北人搓彻。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像嘱朽,于是被迫代替她去往敵國和親旭贬。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,506評論 25 707
  • 用兩張圖告訴你搪泳,為什么你的 App 會卡頓? - Android - 掘金 Cover 有什么料稀轨? 從這篇文章中你...
    hw1212閱讀 12,693評論 2 59
  • Linux 軟件包管理 RPM安裝包管理 Software Package Mananger 包全名 操作的包...
    Marlon666閱讀 286評論 2 0