SDカードへのアクセス

エミュレータで使う SDカードイメージを作る。

コマンドプロンプトを開いて、mksdcard コマンドを使えばいい。
Android SDK インストール時に適切な PATH設定をしていれば、普通に動く。

この SDカードイメージをマウントした状態で Androidエミュレータを起動するには、
emulator -sdcard sdcard.img を実行すればいい。



16M は、16MBのSDカードイメージを示す。
scard.img は、SDカードイメージを格納するファイル。
-avd Xperia_X10 は、エミュレータ設定の名前。最初に AVD作成したときに自分で付けた名前を指定すればいい。
この実行で起動するエミュレータで、[メニュー]→[設定]→[SDカード&端末容量]をクリックした画面が下の写真。



合計容量・空き容量がほぼ 16MB になっているのが確認できる。
若干 16MB より少ないのは、ファイルアロケーションテーブルに食われてるんだろう。

AVDを新しく作り、mksdcard で作成したファイルを指定してもマウントされる。

エミュレータが動作中に、adb push test.txt /sdcard とすると、カレントディレクトリにある test.txt を
SDカードイメージのルートディレクトリへ書き込む。



次に写真のように TextView を追加する。
追加の仕方は、ボタンと同様。ドラッグ&ドロップするだけで良い。
Textプロパティをクリックして、右端の [...]ボタンをクリック。新しい文字列 "TextView" を作り、名前を Text01 にしておく。
Idは、@+id/TextView01 になってるのを確認しておく。

arc/HelloWorldSampleActivity.java を下記のように変更する。

package jp.ne.biglobe.mvj.hra.helloworldsample;

import java.io.File;
import java.io.FileInputStream;
import java.io.BufferedInputStream;
import java.io.IOException;
import android.app.Activity;
//import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class HelloWorldSampleActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate( Bundle savedInstanceState ) {
        super.onCreate( savedInstanceState );
        setContentView( R.layout.main );
        
        Button Button01 = (Button) findViewById( R.id.Button01 );
        Button01.setOnClickListener( Button01ClickListener );
    }

    /** Button01 clicked event */
    private View.OnClickListener Button01ClickListener = new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // SecondScreenActivity をダイアログとして表示(あとで HelloWorldSampleActivity へ戻ってくる)
            //Intent intent = new Intent( HelloWorldSampleActivity.this, SecondScreenActivity.class );
            //startActivityForResult( intent, 0 );
            try {
                // ファイルを buf 配列へ読み込む
                byte[] buf = new byte[ (intnew File( "/sdcard/test.txt" ).length() ];
                BufferedInputStream f = new BufferedInputStream( new FileInputStream( "/sdcard/test.txt" ) );
                f.read( buf );
                f.close();
                // TextView01 を取得
                TextView TextView01 = (TextView) findViewById( R.id.TextView01 );
                // buf配列を文字列へ変換。文字コードも変換
                String s = new String( buf, "SJIS" );
                // 余計な改行コードを変換
                s = s.replaceAll( "\r""" );
                // TextView01 に文字列を表示
                TextView01.setText( s );
            }
            catch( IOException e ) {
                Toast.makeText( HelloWorldSampleActivity.this"失敗", Toast.LENGTH_LONG ).show();
            }
        }
    };
}



実行して、ボタンをクリックすると、先ほど SDカードイメージへ転送した test.txt が表示されるのを確認できる。

byte[] byte のところで、new File( "/sdcard/test.txt" ).length() を使って、ファイルサイズと同サイズのメモリを確保。
BufferdInputStream f を使ってファイルをオープン。
f.read( buf ) で、buf配列へ読み込む。

String( buf, "SJIS" ) を使って、SJISコードをローカルコードに変換して、s に格納。
Windowsファイル特有の \r\n 改行になってるので、replaceAll を使って \r を除去。
TextView01.setText( s ) で、TextView01 に表示。

ちなみに、ファイルを書き出す場合は、manifest に permission の設定が必要らしい。
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

■まとめ
 (1) エミュレータの SDカードイメージは mksdcard を使う
 (2) SDカードへのアクセスは File, FileInputStream 等の Java標準のモノが使える
 (3) 書き込む場合は manifest へ permission の設定を追記する

以上。

[戻る]