Xamarin逆引きTips
Xamarin.iOS/Androidでアプリのデータディレクトリを取得するには?
アプリ固有のデータ領域のディレクトリパスを取得するため方法のうち、iOS/Androidで共通のコードの書き方を説明する。
iOSアプリやAndroidアプリでは、アプリケーション固有のデータは、そのアプリ専用のデータ領域に格納するのが基本だ(※AndroidにおけるSDカードなど一部例外を除く)。アプリ専用のデータ領域の場所を取得するAPIが、それぞれのネイティブAPIに存在するが、共通のコードでも記述できる。
今回は、iOS/Androidでデータディレクトリを取得する共通な方法を解説する。
1iOSアプリのデータディレクトリ
iOSアプリのデータディレクトリは/Applications/<GUID>/Documents
だ。<GUID>には、アプリごとに固有のIDが与えられる。
iOSネイティブのAPIでは、NSHomeDirectory()
関数で、/Applications/<GUID>
が取得できるが、Xamarin.iOSでは、NSHomeDirectory()
関数は存在しないので、3で解説する共通な方法を使用する。
2Androidアプリのデータディレクトリ
Androidアプリのデータディレクトリは/data/data/<アプリのパッケージ名>/files
だ。
AndroidネイティブのAPIでは、Activity
クラスのgetFilesDir()
メソッドで取得できる。これはXamarin.Androidでは、Activity
クラスのFilesDir
プロパティとして利用できる。例えば以下のようなコードだ。
public class MainActivity : Activity
{
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
System.Diagnostics.Debug.WriteLine(this.FilesDir);
……省略……
}
}
|
このコードを実行するとコンソールに/data/data/DataDirSample.Android/files
というような文字列が出力される。
3Environmentクラスによるデータディレクトリの取得
System.Environment
を使うと、iOS/Androidアプリでデータディレクトリの取得を共通化できる。Environment
は.NET Frameworkのクラス(System
名前空間)であり、Androidにある同名クラスandroid.os.Environment
とは別のものだ。
このクラスのGetFolderPath
メソッドに、SpecialFolder.Personal
列挙子を付けて呼び出すと、データディレクトリが取得できる。
iOSアプリでの利用例
iOSアプリでのコード例は以下の通りだ。
public partial class DataDirSample_iOSViewController : UIViewController
{
……省略……
public override void ViewDidLoad()
{
base.ViewDidLoad();
System.Diagnostics.Debug.WriteLine(
System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal));
}
}
……省略……
}
|
実機で、このコードを実行すると、コンソールに
/Application/35C752E1-6927-410E-AB71-2FC90A6A562F/Documents
などと表示される。
iOSシミュレーターでは、
/Users/<Macユーザー名>/Library/Developer/CoreSimulator/Devices/<シミュレーターのGUID>/data/Containers/Data/Application/35C752E1-6927-410E-AB71-2FC90A6A562F/Documents
という出力になり、コンピュータ内でのディレクトリが分かる。
Androidアプリでの利用例
Androidアプリでのコード例は以下の通りだ。Activity.FilesDir
を置き換えただけだ。
public class MainActivity : Activity
{
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
System.Diagnostics.Debug.WriteLine(
System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal));
……省略……
}
}
|
このコードを実行すると、コンソールに/data/data/DataDirSample.Android/files
というような、Activity.FilesDir
と同じ文字列が出力される。
まとめ
System.Environment.GetFolderPath
メソッドを使うと、iOS/Androidアプリで、データディレクトリを取得する処理を共通化できる。
1つ残念なのは、このメソッドは、PCL(Portable Class Library)では使用できないことだ。なので処理を共通化するには、リンクファイル(「Tips: Xamarin.iOS/Androidでソースコードを共有するには?(リンクファイル編)」参照)を使用することになる。
また、GetFolderPath
メソッドの引数であるSpecialFolder
列挙体にはPersonal
の他にDesktop
やFavorites
などさまざまなものがあるが、これらはWindows由来のものであるため、iOS/Androidで全てが使えるわけではないことに注意されたい。
※以下では、本稿の前後を合わせて5回分(第27回~第31回)のみ表示しています。
連載の全タイトルを参照するには、[この記事の連載 INDEX]を参照してください。
27. Xamarin.iOS/Androidでソースコードを共有するには(ポータブルクラスライブラリ編)
Xamarin.iOS/Android間でソースコードを共有する方法の1つとして、複数のプロジェクトから共通のポータブルクラスライブラリ(PCL)を参照する方法を説明する。
28. Xamarin.iOS/AndroidでJSONを扱うには?(Json.NET使用)
Web APIにおけるデータフォーマットの定番になっているJSONを、Xamarin.iOS/Androidで扱うには? 「Json.NET」というライブラリを使う方法を説明する。
29. 【現在、表示中】≫ Xamarin.iOS/Androidでアプリのデータディレクトリを取得するには?
アプリ固有のデータ領域のディレクトリパスを取得するため方法のうち、iOS/Androidで共通のコードの書き方を説明する。
30. Xamarin.iOS/Androidでアプリの設定情報を保存するには?
iOSのNSUserDefaultsやAndroidのSharedPreferenceではなく.NETのIsolatedStorageを使って、Xamarin.iOS/Androidでアプリの軽量データを保存する方法を解説する。
31. Xamarin.AndroidでApplicationクラスを拡張するには?
Applicationクラスを拡張すると、アプリケーションイベントの発生時に独自の処理を実行したり、アプリケーションオブジェクトに機能を追加したりできる。その基本的な実装方法を解説する。