Android TIPS No.03 ファイルシステムやSDカードの情報
ストレージの情報
ファイルシステムやSDカード上の情報
ファイルシステムやSDカードの情報を簡単に取得することができる。
項目 | 内容 |
---|---|
Project name | StorageActivity |
Build Target | Android 1.6 |
Application name | StorageActivity |
Package name | sample.sa |
Create Activity | StorageActivity |
Min SDK Version | 4 |
まず、レイアウトのmain.xmlを以下に示す。情報表示用のTextViewだけ作成する。
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:id="@+id/textView" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textColor="#ff0000" android:textSize="24sp" android:typeface="monospace" /> </LinearLayout>
次に、StorageActivity.javaを示す。
package sample.sa; import android.app.Activity; import android.os.Bundle; import android.os.Environment; import android.widget.TextView; public class StorageActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); TextView textView = (TextView) findViewById(R.id.textView); StringBuilder sb = new StringBuilder(); sb.append("rootDirectory=").append(Environment.getRootDirectory()).append("\n"); sb.append("dataDirectory=").append(Environment.getDataDirectory()).append("\n"); sb.append("externalStorageDirectory=") .append(Environment.getExternalStorageDirectory()).append("\n"); sb.append("downloadCacheDirectory=").append(Environment.getDownloadCacheDirectory()) .append("\n"); textView.setText(sb.toString()); } }
GALAXY Sで実行すると以下のようになる。
ここで、それぞれのメソッドの説明をする。
まずは、Environmentの引数を取らない主なpublic staticメソッドは以下となる。すべてFileクラスのインスタンスを返す。
メソッド | 説明 |
---|---|
getRootDirectory() | Androidのrootディレクトリ。 |
getDataDirectory() | Androidのデータディレクトリ。 |
getExternalStorageDirectory() | Androidの外部ストレージ(外部microSD)。 |
getDownloadCacheDirectory() | Androidのダウンロード、キャッシュディレクトリ。 |
注目はgetExternalStorageDirectoryである。GALAXY Sの外部microSDは/mnt/sdcard/external/sdにマウントされる。しかし、getExternalStorageDirectoryで返されるディレクトリは、/mnt/sdcardである。つまりGALAXY Sの外部microSDはAndroidのAPIでは抽象化して取得できないということになる。
GALAXY Sしか端末がないためそれしかわからないが、GALAXY Sの場合にはgetExternalStorageDirectory()を使っても実は内部メモリということになるので注意が必要となる。
この辺りは以下の議論が詳しい。
http://groups.google.com/group/android-group-japan/browse_thread/thread/2262e02ca23e8f58/e704f06ed42cbc63?lnk=gst&q=SD%E3%82%AB%E3%83%BC%E3%83%89#e704f06ed42cbc63
また、APIレベル8からgetExternalStoragePublicDirectoryが追加された。以下の条件でプロジェクトを作成する。
項目 | 内容 |
---|---|
Project name | StorageActivity2 |
Build Target | Android 2.2 |
Application name | StorageActivity2 |
Package name | sample.sa2 |
Create Activity | StorageActivity2 |
Min SDK Version | 8 |
まずレイアウトのmain.xmlを以下のようにする。
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:id="@+id/textView" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textColor="#ff0000" android:textSize="20sp" android:typeface="monospace" /> </LinearLayout>
StorageActivity2.javaは以下のようにする。
package sample.sa2; import android.app.Activity; import android.os.Bundle; import android.os.Environment; import android.widget.TextView; public class StorageActivity2 extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); TextView textView = (TextView) findViewById(R.id.textView); StringBuilder sb = new StringBuilder(); sb.append("getExternalStoragePublicDirectory").append("\n"); sb.append("DIRECTORY_ALARMS=").append( Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_ALARMS)) .append("\n"); sb.append("DIRECTORY_DCIM=").append( Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM)) .append("\n"); sb.append("DIRECTORY_DOWNLOADS=").append(nvironment.getExternalStoragePublicDirectory( Environment.DIRECTORY_DOWNLOADS)).append("\n"); sb.append("DIRECTORY_MOVIES=").append( Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES)) .append("\n"); sb.append("DIRECTORY_MUSIC=").append( Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC)) .append("\n"); sb.append("DIRECTORY_NOTIFICATIONS=").append(Environment .getExternalStoragePublicDirectory(Environment.DIRECTORY_NOTIFICATIONS)) .append("\n"); sb.append("DIRECTORY_PICTURES=").append( Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)) .append("\n"); sb.append("DIRECTORY_PODCASTS=").append( Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PODCASTS)) .append("\n"); sb.append("DIRECTORY_RINGTONES=").append(Environment .getExternalStoragePublicDirectory(Environment.DIRECTORY_RINGTONES)) .append("\n"); textView.setText(sb.toString()); } }
Environment#getExternalStoragePublicDirectoryメソッドの定義は以下の通り。
public static File getExternalStoragePublicDirectory(String type)
引数のtypeに指定できる値は以下のものとなる。
type | 説明 |
---|---|
DIRECTORY_ALARMS | アラーム用のAudioファイルのディレクトリ。 |
DIRECTORY_DCIM | カメラで撮った、写真、動画用のディレクトリ。 |
DIRECTORY_DOWNLOADS | ユーザーがダウンロードしたファイルの標準ディレクトリ。 |
DIRECTORY_MOVIES | ユーザーが入手した動画ファイルの標準ディレクトリ。 |
DIRECTORY_MUSIC | ユーザーの音楽ファイルの標準ディレクトリ。 |
DIRECTORY_NOTIFICATIONS | 通知用の音楽の標準ディレクトリ。 |
DIRECTORY_PICTURES | ユーザーが入手した画像の標準ディレクトリ。 |
DIRECTORY_PODCASTS | ポッドキャスト用の標準ディレクトリ。 |
DIRECTORY_RINGTONES | 着信音用の標準ディレクトリ。 |
写真や音楽等は基本的にこれらのディレクトリが使用される。そのため、それらを取得する場合には、getExternalStoragePublicDirectoryメソッドで抽象化されたディレクトリを使用する。