Version:
1.Unity : 3.5.7f6
2.Anddroid : 2.3.3
3.Android SDK Tools : r22
4.Eclipse : Juno SR2
目前想在Unity上,將資料寫入到檔案內,可以使用
System.io.File(C#)來進行純文字或是二進位資料的儲存。但是在Android上,如有需將檔案存入SDCard內,則需先設定檔案存取權限。在Android的app開發上,需要去新增
android.permission.WRITE_EXTERNAL_STORAGE。這個權限設定之後,就可以進行檔案的讀寫(在4.1以後,則需另外設定讀取權限,
android.permission.READ_EXTERNAL_STORAGE)。然而這個權限設定,Unity幫我們做到了,因此我們不需要在另外設定AndroidManifest.xml,僅需將「PlayerSettings」->「Per-Platform Settings」->「Write Access」 設定為「SDCard」即可。
C#的讀寫檔方式,必須自行指定資料夾的路徑,所以如果當我們要把檔案寫道SDCard內的話,資料夾路徑會是「/mnt/sdcard/...」。如果SDCard的路徑被變更的話,那麼在程式內所指定的路徑就又要重新設定過。
然而Android有提供取得SDCard的路徑功能,所以這邊就利用JAR的方式,讓Unity可以直接使用Android所提供的API,取得系統內所記錄的SDCard的實際路徑,並將檔案寫入到SDCard內。
在JAR內的程式碼為:
package com.drillingsaru.io.sdcard;
//Java
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
//android
import android.os.Environment;
import android.util.Log;
public class BinaryFileIO
{
//Write binary data into a file
public void WriteData(String FileName, byte[] DataBuf)
{
if( !this.IsExternalStorageMounted() ) {
this.mErrNo = ERR_STORAGE_NOT_MOUNTED;
return;
}
try
{
//Get the path of root folder (Return = /mnt/sdcard )
File rootDir = Environment.getExternalStorageDirectory();
//Create a output stream object
FileOutputStream outStream = new FileOutputStream(new File(rootDir.getPath(), FileName));
//Write Data
outStream.write(DataBuf);
//Flush it
outStream.flush();
//Close self
outStream.close();
this.mErrNo = ERR_NONE;
}catch(Exception e){
Log.d("--WriteData--", e.getMessage());
}
}
}
在Unity的程式碼為
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class WriteData2SDCard : MonoBehaviour
{
#region Definition
/// <summary>
/// The package name and class name
/// package name = com.DrillingSaru.io.sdcard
/// </summary>
public readonly string PACKAGE_CLASS_NAME = "com.drillingsaru.io.sdcard.BinaryFileIO";
/// <summary>
/// Student information
/// </summary>
public class StudentInfo
{
public int Language = 0;
public int Math = 0;
public int Science = 0;
public StudentInfo(int lang, int math, int science)
{
this.Language = lang;
this.Math = math;
this.Science = science;
}
public StudentInfo(byte[] DataBuf)
{
this.Set(DataBuf);
}
//轉換成byte陣列
public byte[] GetBytes()
{
List<byte> RtnData = new List<byte>();
RtnData.AddRange(System.BitConverter.GetBytes(this.Language));
RtnData.AddRange(System.BitConverter.GetBytes(this.Math));
RtnData.AddRange(System.BitConverter.GetBytes(this.Science));
return RtnData.ToArray();
}
//轉換成結構資料
public void Set(byte[] DataBuf)
{
int Offset = sizeof(int);
int Shift = 0;
this.Language = System.BitConverter.ToInt32(DataBuf, Shift);
Shift += Offset;
this.Math = System.BitConverter.ToInt32(DataBuf, Shift);
Shift += Offset;
this.Science = System.BitConverter.ToInt32(DataBuf, Shift);
Shift += Offset;
}
}
#endregion
#region InputData
#endregion
#region DataMebmer
private StudentInfo mStudentInfo = new StudentInfo(500, 5, 10);
private AndroidJavaObject mDataWriter = null;
#endregion
#region MemberFunc
private void Init()
{
this.mDataWriter = new AndroidJavaObject(PACKAGE_CLASS_NAME);
}
/// <summary>
/// write binary data to file
/// </summary>
private void WriteData()
{
if( this.mDataWriter == null )
return;
//設定傳入參數
object[] args = new object[2];
args[0] = "testfile.bin";
args[1] = (object)this.mStudentInfo.GetBytes();
//呼叫函式
this.mDataWriter.Call("WriteData", args);
}
/// <summary>
/// read binary data from file
/// </summary>
private void ReadData_Test()
{
if( this.mDataWriter == null )
return;
byte[] RtnList = new byte[1024];
object[] args = new object[1];
args[0] = "testfile.bin";
RtnList = this.mDataWriter.Call("ReadData", args);
this.mStudentInfo.Set(RtnList);
}
#endregion
#region SystemFunc
void Awake()
{
this.Init();
}
// Use this for initialization
void OnEnable ()
{
this.WriteData();
}
void Update ()
{
}
#endregion
}
用了上述的Plugin後,就可以將二進位檔存至SDCard了。
Comments
Post a Comment