ウェブアプリケーション,インジェクション,コマンドインジェクション

Androidアプリ開発 データを持続させる

外部ストレージにファイルを保存

Saving Files to External Storage

cacheディレクトリにファイルを保存する
デバイスにあるアプリケーションのファイルシステムにデータを
保存する方法を示しました。
いくつかの場合では、デバイスの外部ストレージ
(SDカードなどの記憶装置)にファイルを保存したいことがあるかも
しれません。


ちょっと注釈

Androidの状況では、外部ストレージとは、
SDカードの様な物理的な外部ストレージの事を必ずしも指しません。
プロテクト(保護)された内部ストレージから分離されたデバイス上の
ストレージのことを指したりもします。
外部ストレージはユーザによりファイルシステムとしてマウントされ、
マウントされたり、削除された時にいつもアクセスできるわけでは
ありません。


外部ストレージから読み書きする前に、外部ストレージが利用できるか
書き込みできるかどうかをチェックすることが常に重要になります。
以下のコードは外部ストレージが使えるかどうかをチェックするものです。

package net.learn2develop.externalstorage;

import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;

public class MainActivity extends Activity{
  @Override
  public void onCreate(Bundle savedInstanceState){
   super.onCreate(savedInstanceState);
   setContentView(R.layout.activity_main);
  }

  public boolean IsExternalStorageAvailableAndWriteable(){
   boolean externalStorageAvailable = false;
   boolean externalStorageWriteable = false;
   String state = Environment.getExternalStrorageState();

   if(Environment.MEDIA_MOUNTED.equals(state)){
    //---you can read and write the media---
    externalStorageAvailable = externalStorageWriteable = true;
   }else if(Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)){
    //---you can only read the media---
    externalStorageAvailable = true;
    externalStorageWriteable = false;
   }else{
    //---you cannot read nor write the media---
    externalStorageAvailable = externalStorageWriteable = false;
   }
   return externalStorageAvailable && externalStorageWriteable;
  }
}

外部ストレージ上のアプリケーションの指定するフォルダにファイルを
保存するために、getExternalFilesDir()メソッドを使い、
(このメソッドはAPIレベルが8以上の時に収集可能です。)
このgetExternalFilesDir()メソッドに引数型を渡します。
もし型がnullなら、外部ファイルシステムにあるアプリケーションの
ディレクトリに絶対パスを返します。

package net.learn2develop.externalstorage;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.widget.Toast;

public class MainActivity extends Activity{
  @Override
  public void onCreate(Bundle savedInstanceState){
   super.onCreate(savedInstanceState);
   setContentView(R.layout.activity_main);
   //---writing to files---
   try{
    if(IsExternalStorageAvailableAndWriteable()){
     //---external storage---
     File extStorage = getExternalFilesDir(null);
     File file = new File(extStorage, "textfile.txt");
     FileOutputStream fOut = new FileOutputStream(file);
     OutputStreamWriter osw = new OutputStreamWriter(fOut)

     //---write the string to the file---
     osw.write("書きこむ文字列を入力します”);
     osw.flush();
     osw.close();

     //---display file saved message---
     Toast.makeText(getVaseContext(), "File saved successfully",
         Toast.LENGTH_SHORT).show();
    }
   }catch(IOException ioe){
    ioe.printStackTrace;
   }
  }

  public boolean Is ExternalStorageAvailableAndWriteable(){
  ...........
  }
}

上のコードは/mnt/sdcard/Android/data/<パッケージ名>/files
フォルダにtextfile.txtファイルを作ります。


ちょっと注釈

/mnt/sdcard/Android/data/<パッケージ名>フォルダ全体は、
ユーザがアプリケーションをアンインストールしたときに
削除されます。


以下のコードは外部ストレージから同じファイルを読み込みます。

package net.learn2develop.externalstorage;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.widget.Toast;

public class MainActivity extends Activity{
  static final int READ_BLOCK_SIZE = 100;

  @Override
  public void onCreate(Bundle savedInstanceState){
   super.onCreate(savedInstanceState);
   setContentView(R.layout.activity_main);

   //---writing to files---
   try{
    if(IsExternalStorageAvailableAndWriteable()){
    ..........
    }
   }catch(IOException ioe){
    ioe.printStackTrace();
   }

   //---reading from files---
   try{
    if(IsExternalStorageAvailableAndWriteable()){
     //---External Storage---
     File extStorage = getExternalFilesDir(null);
     FileInputStream fIn = new FileInputStream(file);

     char[] inputBuffer = new char[READ_BLOCK_SIZE];
     String s = "";
     int charRead;
     while ((charRead = isr.read(inputBuffer)) > 0){
      //---convert the chars to a String---
      String readString = String.copyValueOf(inputBuffer, 0, charRead);
      s += readString;
      inputBuffer = new char[READ_BLOCK_SIZE];
     }
     isr.close();
     Toast.makeText(getBaseContext(), "File loaded successfully" + s,
        Toast.LENGTH_SHORT).show();
    }catch(IOException ioe){
     ioe.printStackTrace();
    }
   }

   public boolean IsExternalStorageAvailableAndWriteable(){
   ......
   }
  }

もし、システムで自動的に発見され得る特別なディレクトリに
ファイルを保存したいのなら、getExternalFilesDir()メソッドの
文字定数に渡すことができます。
(getExternalFilesDir()メソッドはAPIレベルが8以上で入手可能です。)

File extStorage = getExternalFilesDir(Environment.DIRECTORY_PICTURES);

上のコードは
/mnt/sdcard/Android/data/<パッケージ名>/pictures
フォルダの内部にファイルを保存します。
もし外部ストレージにすでにあるパブリックディレクトリに
保存したければ、getExternalStoragePublicDirectory()メソッドを
使います。
(このgetExternalStoragePublicDirectory()メソッドも
    APIレベルが8以上で入手できます。)

File extStorage = Environment.getExternalStoragePublicDirectory(
    Environment/DIRECTTORY_PICTURES);

上のコードは/mnt/sdcard/Picturesフォルダ内部にファイルを
保存します。ファイルをパブリックディレクトリの1つに保存するときに、
そのファイルは、たとえユーザにアプリケーションをアンインストール
しても残ります。
もし、ファイルを外部ストレージのroot(ルート)フォルダに
保存したければ、getExternalStorageDirectory()メソッドが使えます。

File extStorage = Environment.getExternalStorageDirectory();
File directory = new File(extStorage.getAvsolutePath() + "/MyFiles");
directory.mkdirs();
File file = new File(directory, "textfile.txt");

上のコードは/mnt/sdcard/MyFilesフォルダ内部にファイルを
保存します。
最後に外部ストレージにファイルを保存することに注目し、
AndroidManifest.xmlファイルにWRITE_EXTERNAL_STRAGE
パーミッションを追加する必要があります。

<uses-permission
  android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
ホーム
便利堂ロゴ
inserted by FC2 system