Xamarin逆引きTips

Xamarin逆引きTips

Xamarin.iOS/Androidでアプリのデータディレクトリを取得するには?

2014年12月10日

アプリ固有のデータ領域のディレクトリパスを取得するため方法のうち、iOS/Androidで共通のコードの書き方を説明する。

奥山 裕紳(@amay077
  • このエントリーをはてなブックマークに追加

 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プロパティとして利用できる。例えば以下のようなコードだ。

C#
public class MainActivity : Activity
{
  protected override void OnCreate(Bundle bundle)
  {
    base.OnCreate(bundle);

    System.Diagnostics.Debug.WriteLine(this.FilesDir);

    ……省略……
  }
}
AndroidネイティブAPIでデータディレクトリを取得するコード

 このコードを実行するとコンソールに/data/data/DataDirSample.Android/filesというような文字列が出力される。

3Environmentクラスによるデータディレクトリの取得

 System.Environmentを使うと、iOS/Androidアプリでデータディレクトリの取得を共通化できる。Environmentは.NET Frameworkのクラス(System名前空間)であり、Androidにある同名クラスandroid.os.Environmentとは別のものだ。

 このクラスのGetFolderPathメソッドに、SpecialFolder.Personal列挙子を付けて呼び出すと、データディレクトリが取得できる。

iOSアプリでの利用例

 iOSアプリでのコード例は以下の通りだ。

C#
public partial class DataDirSample_iOSViewController : UIViewController
{
  ……省略……

  public override void ViewDidLoad()
  {
    base.ViewDidLoad();

    System.Diagnostics.Debug.WriteLine(
      System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal));
    }
  }

  ……省略……
}
iOS/Androidで共通するデータディレクトリの取得コード(iOSアプリでの利用例)

 実機で、このコードを実行すると、コンソールに

/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を置き換えただけだ。

C#
public class MainActivity : Activity
{
  protected override void OnCreate(Bundle bundle)
  {
    base.OnCreate(bundle);

    System.Diagnostics.Debug.WriteLine(
      System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal));

    ……省略……
  }
}
iOS/Androidで共通するデータディレクトリの取得コード(Androidアプリでの利用例)

 このコードを実行すると、コンソールに/data/data/DataDirSample.Android/filesというような、Activity.FilesDirと同じ文字列が出力される。

まとめ

 System.Environment.GetFolderPathメソッドを使うと、iOS/Androidアプリで、データディレクトリを取得する処理を共通化できる。

 1つ残念なのは、このメソッドは、PCL(Portable Class Library)では使用できないことだ。なので処理を共通化するには、リンクファイル(「Tips: Xamarin.iOS/Androidでソースコードを共有するには?(リンクファイル編)」参照)を使用することになる。

 また、GetFolderPathメソッドの引数であるSpecialFolder列挙体にはPersonalの他にDesktopFavoritesなどさまざまなものがあるが、これらは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クラスを拡張すると、アプリケーションイベントの発生時に独自の処理を実行したり、アプリケーションオブジェクトに機能を追加したりできる。その基本的な実装方法を解説する。

サイトからのお知らせ

Twitterでつぶやこう!


Build Insider賛同企業・団体

Build Insiderは、以下の企業・団体の支援を受けて活動しています(募集概要)。

ゴールドレベル

  • 日本マイクロソフト株式会社
  • グレープシティ株式会社