yoshi1966のガジェット日記

yoshi1966のコンピュータ関連情報を投稿しております

 

AndroidStudioを使って(仮想)携帯上でファイルを読み込む

一昔前はEclipse上でやったものだが、便利になったものだ(実は自分一切ふれたことなかったが。。。)

AndroidStudio

https://developer.android.com/sdk/index.html

インストール手法は他にまかせるとして、
(手順)

  1. プロジェクトを新規で作成。
    f:id:yoshi1966:20150923105625j:plain

  2. アプリの名前、プロジェクトの場所設定f:id:yoshi1966:20150923105904j:plainApplication nameは適当に"test"
    Company Domainはそのままデフォルト(変更可)
    Package nameがあとあと関係あるのでメモメモ。
    Project location→適当(変更可)
    Nextを押す。

  3. エミュレーター選択
    f:id:yoshi1966:20150923110418j:plain
    デフォで。Nextを押す。

  4. Activity選択
    f:id:yoshi1966:20150923110706j:plain
    Blank Activityを選択。Nextを押す。

  5. Activityカスタム
    f:id:yoshi1966:20150923110908j:plain
    そのままで。Finishを押す。
    プロジェクトが作成され、ビルド可能に。f:id:yoshi1966:20150923111402j:plain

  6. エミュレーターの確認
    "Tools"→"Android"→"AVD Manager"を選択f:id:yoshi1966:20150923111733j:plain
    デフォでは"Nexus 5"となっている。
    右のほうにある"鉛筆マーク(Edit THIS AVD)"を押してカスタマイズ。
    基本デフォでも問題なし。
    使用するメモリサイズや画面サイズ等はここで変更できる。
    ※エミュは重いので、カスタマイズして軽くするのも良し。

  7. エミュレーター起動
    ”三角マーク(Launch this AVD in the emulator)"を押す。
    しばらくすると携帯画面が現れる。
    f:id:yoshi1966:20150923115205j:plain
    以降、このエミュレーター上でデバッグを行う。(通常起動しっぱなし)

  8. ソース追加
    MainActivityクラスに関数追加。
    public class MainActivity extends AppCompatActivity {
      //設定値
      private static final String DEFAULT_ENCORDING = "UTF-8"; //デフォルトのエンコード
      private static final int DEFAULT_READ_LENGTH = 8192; //一度に読み込むバッファサイズ
      //ストリームから読み込み、バイト配列で返す
      public static final byte readStream(InputStream inputStream, int readLength) throws IOException {
        final ByteArrayOutputStream byteStream = new ByteArrayOutputStream(readLength); //一時バッファのように使う
        final byte bytes = new byte[readLength]; //read() 毎に読み込むバッファ

        final BufferedInputStream bis = new BufferedInputStream(inputStream, readLength);
        try {
          int len = 0;
          while ( ( len = bis.read(bytes, 0, readLength) ) > 0) {
            byteStream.write(bytes, 0, len); //ストリームバッファに溜め込む
          }
          return byteStream.toByteArray(); //byte[] に変換
      } finally {
        try {
          byteStream.reset(); //すべてのデータを破棄
          bis.close(); //ストリームを閉じる
        } catch (Exception e) {
          //IOException
        }
      }
      //ストリームから読み込み、テキストエンコードして返す
      public static final String loadText(InputStream inputStream, String charsetName)
      throws
    IOException, UnsupportedEncodingException {
        return new String(readStream(inputStream, DEFAULT_READ_LENGTH), charsetName);
      }
      // SDCard のマウント状態をチェックする(Android 用)
      public static final boolean isMountSDCard() {
        final String state = Environment.getExternalStorageState();
        if (state.equals(Environment.MEDIA_MOUNTED)) {
          return true; //マウントされている
        } else {
          return false; //マウントされていない
        }
      }
      // SDCard から、テキストファイルを読み込む(Android 用)
      public static String loadTextSDCard(String fileName) throws IOException {
      if (!isMountSDCard()) { //マウント状態のチェック
        throw new IOException("No Mount");
      }
      String str = "/sdcard/Android/data/com.example.yoshi.test/files/mydata/"+ fileName;
      InputStream is = new FileInputStream(str);
      return loadText(is, DEFAULT_ENCORDING);
    }

    青字は追記部分。赤字はImportされていないクラス。

  9. ビルド
    Importされていないクラスがあり、このままではビルドできないので
    適切なクラスをImportする。
    赤字の部分をクリックしてから、"Alt+ENTER"
    すべて行うと
    import java.io.BufferedInputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.UnsupportedEncodingException;
    が追加される。
    まずビルド。
    MainMenuから"Build"→"Make Project"(あるいは"Ctrl+F9")
    Messagesウィンドウに"0 errors"と出ていればOKである。
    (参考)http://fantom1x.blog130.fc2.com/blog-entry-123.html

  10. エミュレーター上で動かす
    MainMenuからRunをクリック。f:id:yoshi1966:20150923130234j:plain
    すでに起動しているエミュレーターを選択。OKを押す。
    f:id:yoshi1966:20150923130448j:plain
    "Hello world!"と表示される。
    (これでアプリ用のフォルダが作られる。)

  11. テキストファイルをエミュレーター上のSDカードへコピ
    ここはハマリポイントであるが、エミュレーター上から読み書きできる
    場所はアプリにより一意に決まる。(パーミッション制限)
    すでにソースに記述してあるが、
    /sdcard/Android/data/com.example.yoshi.test/files/mydata/
    である。"com.example.yoshi.test"は初期設定にあった"Package name"
    エミュレーターが起動している状態で、DOS窓より
    >adb.exe push sample.txt /sdcard/Android/data/com.example.yoshi.test/files/mydata/
    2 KB/s (14 bytes in 0.006s)
    sample.txtの中身
      test テスト
    ※OSのバージョンやエミュレーターの機種によりパスが違う。
     Android4.2以降では、
      AndroidManifest.xml
      <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
     が必要。
     かつ上記パスである。Android4.1以前は単に"/sdcard/"でよい。(機種依存)

    (参考)http://techbooster.org/android/application/16004/

  12. 表示する文字を変更
    MainActivity.java内追加
    @Override
    protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState);
      String fileName = "sample.txt";
      String text = null;
      try {
        text = loadTextSDCard(fileName);
      } catch (IOException e) {
        e.printStackTrace();
      }
      Log.d("tag", text);
      setContentView(R.layout.activity_main);
      TextView textView = (TextView) findViewById(R.id.textView);
      textView.setText(text);
    }
    また赤字の部分を"Alt+ENTER"でImportクラス。
    コンポーネントWidgetのidを"textView"として(緑字の部分)、
    activity_main.xmlを開き、そこの"id"にも設定。
    f:id:yoshi1966:20150923133247j:plain
    再度runすると、
    f:id:yoshi1966:20150923133513j:plain
    ファイルの中身が表示されました。

 

気が向いたらこちらもみてね

 

イラストでよくわかるAndroidアプリのつくり方 Android Studio対応版

イラストでよくわかるAndroidアプリのつくり方 Android Studio対応版