SDカードへのデータの保存
アプリの内部ストレージ(アプリ専用の)ではなく、SDカードのような外部メモリにデータを保存する方法について紹介します。
SDカードへの書き込みは次の3つの手順を実行します。
外部領域への書き込み権限を設定する
アプリのマニュフェストファイル(AndroidManifest.xml)のapplication要素の終了タグの後に以下のパーミッションタグを追加します。
</application>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<!--上の1行を追加-->
</manifest>
パーミッションを変更し、もしエミュレーターが動いているようだったら再起動して設定を有効にします。
SDカードが使用可能か確認する
次にSDカードにデータを書き込めるようになっているかを確認します。
確認するためのコードは次のようになります。
String state = Environment.getExternalStorageState(); if(Environment.MEDIA_MOUNTED.equals(state)){ //読み書き両方ができる。 Log.i("MainActivity : ", "読み書き両方可能"); }else if(Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)){ //読み込みのみ可能 Log.i("MainActivity : ", "読み込みのみ可能"); }else{ //読み書きが両方できない。 Log.i("MainActivity : ", "読み書きできない"); }
読み書きがでいる場合とできないときの処理をここで分離します。
SDカードに書き込む
では、SDカードに何かデータを書き込んでみます。
Environmentクラスを使ってSDカードの画像の共有ディレクトリにアクセスし、そこにファイルを作成してみます。
File extDir = Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_PICTURES); File file = new File(extDir.getAbsoluteFile() + "/Android/data/" + getActivity().getPackageName() + "image.png"); try{ FileOutputStream fos = new FileOutputStream(file,true); OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8"); PrintWriter pw = new PrintWriter(osw); pw.append(""); pw.close(); osw.close(); fos.close(); } catch(IOException e){ Log.e("MainActivity : ", "SDカードの書き込み不可"); }
EnvironmentクラスのgetExternalStoragePublicDirectoryメソッドからSDカードの共有ディレクトリ(どのアプリからでも参照可能)を取得できます。
このメソッドには保存したいデータの種類に応じて、たとえば音楽ならDIRECTORY_MUSIC、画像ならDIRECTORY_PICTURESなどをタイプとして指定できます。
共有ディレクトリーのタイプについてはEnvironmentのリファレンスを参照しましょう。
そのパスから直接Fileインスタントを作っています。その後APIレベルが7未満の場合を考慮して共有ディレクトリの後に"Android/data/[パッケージ名]"ディレクトリを作ります。もしAPIレベルが7以上なら共有ディレクトリ以下に直接作ってもOKみたいです。
あとはその中に普通にディレクトリやファイルを作成できます。
最後に書き込みが成功してファイルができたか確認してみます。
DDMSのファイルエクスプローラーで見るとstorage/sdcard以下に上の画像のようにファイルが生成されているはずです。