ストレージのファイルをアクセスするには(AndroidMode編)

◆PROCESSING 逆引きリファレンス

 カテゴリー:スマホ(AndroidMode)

ストレージのファイルをアクセスには(AndroidMode編)

【概要】

PROCESSINGにAndroidMode を導入する事で、PROCESSINGで開発したプログラムをAndroid端末上で動かす事ができるようになります。

AndroidModeの導入については「PROCESSINGをAndroid端末で動かすには(4.0版)」記事を参照してください。

PCを始め多くのコンピュータには「ストレージ」と呼ばれる記憶装置がついています。PCではHDDやSSDの事ですね。

AndroidスマホにはNAND型のフラッシュメモリを利用したストレージが搭載されている事が多いようです。

Androidのストレージ領域は

  • 内部領域(getFilesDirectory)
  • 外部領域(getExternalFilesDirectory)
  • 公開領域(getExternalStoragePublicDirectory)

と呼ばれる3つの領域から構成されています※。()内はこの領域にアクセスする代表的なAPIです。

※実際には、これにキャッシュ領域が加わります。


(画像URL:illust-AC 様:shinya さん、acworks さん)

内部領域はアプリケーション固有の情報を格納する場所で、他のアプリケーションから参照することはできません。この領域にアクセスするには、AndroidのAPIを利用しますが、PROCESSINGの標準命令でもアクセスすることが可能です。

外部領域は「外部」という名前とは裏腹に、必ずしも外部メモリ(SDカードなど)に持つわけではなく、内部ストレージに確保されることが多いようです。

外部領域のアプリケーション固有領域にアクセスするには、特別なパーミッションは必要ありません。

ただし外部領域はアプリケーション固有の領域であっても、自分以外のアプリケーションから読み取られる可能性があります。

ですので、重要な情報を含むファイルは外部領域に格納してはいけません

どうしても外部領域に格納するのであれば、読み取られたり書き換えられても困らないファイルにするか、しかるべき暗号化を行うなどの対策が必要となるでしょう。

公開領域は、アプリケーションが他のアプリケーションと情報を共有するための領域です。(必ずではありませんが)この領域はSDカード上に確保されることがあります。

公開領域にアクセスするには特別な権限が必要となります。またこの領域はAndroid 6.0以降、セキュリティの観点からアクセスが厳しく制限されるようになっています。

参照URL:

今回はこのうち、内部領域および外部領域と呼ばれる場所にあるファイルをアクセスする方法を紹介します。

公開領域については「公開領域にアクセスするには(AndroidMode編)」を参照してください。

また以下の説明はAndroid6.0以降を対象としています。Android5.X以前とは方法が異なる場合がありますので、注意して下さい。

 

【詳細】

ストレージ領域へアクセスする

内部領域へアクセスする

自分の内部領域であれば特別なパーミッションがなくてもファイルをアクセスすることが可能です。

内部領域のファイルは、Activityがもつ getFilesDir ()メソッドで得られるファイル記述子を使ってアクセスする事ができます。

またPROCESSINGの標準命令である sketchPath や dataPath でパスを得ることや、saveStrings、loadStrings  命令で簡単なテキストファイルを書き込んだり読み込む事 も可能です。

PROCESSINGの saveStrings、loadStrings  命令については、以下の記事を参照してください。

.

内部領域へのFileオブジェクト取得File file = act . getFilesDir () ;

file : Fileインスタンス
act : Activityインスタンス

以下は、内部領域へのパスをもつ File オブジェクトを得る例です。

<出力例>
上記例では内部領域のパスとして「/data/user/0/ pkg名 /files 」が表示されます。これとは異なるパスが表示されることもあります。

本記事のサンプル一覧に、内部領域からテキストファイルを読み出す例を掲載しましたので参考としてください。

 

外部領域へアクセスする

まず外部領域は「必ず読み書きできる」とは限りません。

なぜなら、ユーザーがストレージをPCにマウントしたり、外部ストレージを提供するSDカードを取り外す場合があるためです。

より慎重にプログラミングするなら、 Environment がもつ getExternalStorageState() メソッドで、外部領域の状態を確認してから操作するのが良いでしょう。
.

外部領域の状態を得るstatic String status = Environment . getExternalStorageState (File file ) ;

Environment : Environmentクラス
file : 外部領域の Fileオブジェクト
status : 外部領域の状態

status には、Environmentクラスが持つ以下の定数が戻されます。

MEDIA_UNKNOWN
MEDIA_REMOVED
MEDIA_UNMOUNTED
MEDIA_CHECKING
MEDIA_NOFS
MEDIA_MOUNTED
MEDIA_MOUNTED_READ_ONLY
MEDIA_SHARED
MEDIA_BAD_REMOVAL
MEDIA_UNMOUNTABLE

戻された値が Environment.MEDIA_MOUNTED であれば、外部領域は書き込み可能です。また Environment.MEDIA_MOUNTED_READ_ONLY であれば読み取りのみが可能です。

Android 4.4(APIレベル19)以降、自分の外部領域(アプリケーション固有の領域)であれば特別なパーミッションがなくてもアクセスする事ができるようになりました。

外部領域へアクセスするためには、 Activity がもつ getExternalFilesDir()メソッドでFileオブジェクトを取得します。
.

アプリ固有の外部領域へのFileオブジェクト取得File file = act . getExternalFilesDir(String subDirectory ) ;

file : 外部領域の Fileオブジェクト
act : Activityインスタンス
subDirectory : 外部領域配下のサブディレクトリパス

内部領域の場合もそうですが、アプリ固有の領域へのパスには、該当アプリケーションのパッケージ名が付加されます。

下記はアプリ固有の外部領域へのパスを取得し、アクセスできるか調べる例です。

<出力例>

上記例では外部領域のパスとして「/storage/emulated/0/Android/data/ pkg名 /files 」が表示されます。これとは異なるパスが表示されることもあります。

本記事のサンプル一覧に、外部領域のアプリケーション固有部にテキストファイルを書き込む例を掲載しましたので参考としてください。

 

【関連記事】

 


サンプルプログラム

内部領域からテキストを読む例:

アプリケーションの内部領域(/data/data/ pkg名 /files )に、予め sample.txt というテキストファイルが格納されている事が条件です。


テキストファイルから一行ずつ読み込んで、画面に表示します。

<出力サンプル>

 

外部領域にテキストを書く例:

外部領域のアプリケーション固有部に、「勇者の持ち物.txt」というテキストファイルを書き込みます。

<出力サンプル>


上記は書き込まれたファイルです。

戻されたパスは「/storage/emulated/0/Android/data/ pkg名 /files」となっていますが、このパスはエミュレート領域であるため、実際に書き込まれる物理的なパスは異なるエリアになっています。

パスの上位フォルダ名が sdcard となっていますが、本当に SDカード 上に書き込まれるわけではないので、注意してください。

機種や環境により、実際の書き出し位置は変わることがあります。

 


PROCESSING逆引きリファレンス一覧 へ戻る

本ページで利用しているアイコン画像は、下記サイト様より拝借しております。各画像の著作権は、それぞれのサイト様および作者にあります。