外部ストレージにファイルを保存
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" />
|
【用語解説】
XML
HTMLと同じような言語ですが、
すべての型の複雑なデータ構造を
送信するための設計ができる
ファイル型式。
オブジェクト
ある手続きを持った
データアイテムで、
他の手続きと関連づけされるもの
metaタグ
ウェブページに与える
情報の宣言につかわれ
検索エンジン・ウェブアプリ
などにウェブページの内容を
伝える役目をする。
metaタグの内容は
ページ内に表示されない。
コンストラクタ
オブジェクト指向
プログラミングで使われ
新しいオブジェクトが
作られ時に呼び出される
メソッドのこと。
クラス
オブジェクト指向
プログラミングでの
オブジェクトの型
オブジェクト指向プログラミング
プログラミングの
方式のことで、
プログラマはデータ型を
定義できるだけでなく
自動的にデータ型と
メソッドを関連付け
できる
アクティビティ
Androidにおける
アクティビティは
Androidアプリの画面に
相当するもの
ボタンやウェブページ
など表示されている
すべてのもののこと。
view
Androidのアプリを開発する
上で使う部品のことで、
トリガボタン・イメージボタン
チェックボックスなどのこと。
UI
ユーザインターフェースのこと。
Bind(バインド)
シンボルとデータを
関連させるため
または、データの一片と
他のものを関連させること。
以下は例。
・変数に値を入れる。
(変数の初期化)
・特定のEthernetポートと
ネットワークプロトコルを
関連付けする。
・Javaの変数のセット上に
XML文書を配置すること。
または、ほかの
プログラミング言語でも。
|