SDカードにファイルを保存する


今回は、SDカードにファイルを保存する方法を説明したいと思います。

Android端末の多くは(micro)SDカードスロットを備えており、アプリケーションから利用することができます。内蔵ストレージが少ない端末もあるため、大きいファイルはSDカードに保存したいものです。

また、SDカードに保存することで、ユーザーがパソコンを繋いでデータをコピーすることも可能になります。

SD カードを利用することは難しくないのですが注意する点が二つあります。

それを続きで説明します。

SDカードのパス

SD カードのパスは端末によってことなる場合があります。私の手元の端末では

/sdcard

/mnt/sdcard/

の2つのパターンがありました。

もしかすると端末によってはこれ以外のパスがSDカードに割り当てられているかもしれません。また、同じ端末でもOSのアップデートによってパスが変わらないとも限りません。

そこでAndroidではSDカード、正確には外部ストレージのパスを知ることができるメソッドが用意されています。直接/sdcardのように指定するのではなく、用意されているメソッドを利用しましょう。
Environment.getExternalStorageDirectory()でFileインスタンスを取得でき、getPathメソッドでパスを取得します。

import android.os.Environment;

Environment.getExternalStorageDirectory().getPath();

アプリケーションはできるかぎり特定の端末に依存せず、様々な端末で問題なく動作するようにしておいた方が多くの方に利用して頂けます。
他に端末に依存せずパスを取得するメソッドとして以下に例をあげておきます。

Environment.getDataDirectory().getPath(); // /dataなど
Environment.getDownloadCacheDirectory().getPath(); // cacheなど

パーミッション

SDカードを利用する場合にはGPSを利用したりネットワークを利用する時と同様に、マニフェストファイルにパーミッションの記述が必要になります。

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

サンプル

さて、SDカードのパスを取得でき、パーミションを設定して許可を得たら、あとはアプリのローカルファイルと同様に読み書きができます。
今回はEditTextに入力した文字を、SDカードにテキストファイルとして保存するサンプルを作ってみます。

まずは、AndroidManifest.xmlにパーミッションの記述をします。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="org.jpn.techbooster.sample"
      android:versionCode="1"
      android:versionName="1.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".SdcardSampleActivity"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
    <uses-sdk android:minSdkVersion="4" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
</manifest>

次にEditTextとボタンを用意します。レイアウトファイルは省略します。

ボタンのOnClickListenerでEditTextに入力されている内容を、SDカードにmemo.txtという名前で保存します。

        Button buttonSave = (Button)findViewById(R.id.ButtonSave);
        buttonSave.setOnClickListener(new OnClickListener(){
			@Override
			public void onClick(View arg0) {
				String filePath = Environment.getExternalStorageDirectory() + "/memo.txt";
				File file = new File(filePath);
				file.getParentFile().mkdir();

				FileOutputStream fos;
				try {
					fos = new FileOutputStream(file, true);
					OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");
					BufferedWriter bw = new BufferedWriter(osw);
					String str = ((EditText) findViewById(R.id.EditTextInput)).getText().toString();
					bw.write(str);
					bw.flush();
					bw.close();
				} catch (Exception e) {
				}
			};
        });

DDMSでSDカードの中を見てみましょう。memo.txtファイルができていることを確認できました。

adb shellで入って中身を確認してみます。EditTextで入力した文字が保存されています。
このように簡単にSDカードを利用することができます。

5 Comments