SDカードへのデータの保存

アプリの内部ストレージ(アプリ専用の)ではなく、SDカードのような外部メモリにデータを保存する方法について紹介します。

SDカードへの書き込みは次の3つの手順を実行します。

  1. 外部領域への書き込み権限の取得
  2. SDカードが利用できるか確認
  3. SDカードにデータを書き込み

外部領域への書き込み権限を設定する

アプリのマニュフェストファイル(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のエクスプローラーの画像

DDMSのファイルエクスプローラーで見るとstorage/sdcard以下に上の画像のようにファイルが生成されているはずです。

関連項目
プライバシーポリシー