コンピュータクワガタ

かっぱのかっぱによるコンピュータ関連のサイトです

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はAndroidAPIでは抽象化して取得できないということになる。
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メソッドで抽象化されたディレクトリを使用する。