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クラスを拡張すると、アプリケーションイベントの発生時に独自の処理を実行したり、アプリケーションオブジェクトに機能を追加したりできる。その基本的な実装方法を解説する。