2014年3月16日日曜日

AndroidでのSDカードへの画像保存

Androidでプロジェクト内部の画像をSDカードに保存する方法を書きます。ちなみに今回はdrawableフォルダに置かれたbg_dot.pngという画像をSDカードに保存します。

String saveDir = Environment.getExternalStorageDirectory().getPath()+"/test";
    File file = new File(saveDir);
    if(!file.exists()){
     if(!file.mkdir()){
      Log.e("debug","Make Dir Error");
     }
    }
    //SDカードに画像保存
    String imgPath = saveDir+"/"+"bt_dot.jpg";
    Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.bg_dot);
    try {
     FileOutputStream output = new FileOutputStream(imgPath);
     bitmap.compress(Bitmap.CompressFormat.PNG, 100, output);
     output.close();
    } catch (FileNotFoundException e) {
     e.printStackTrace();
    } catch (IOException e) {
     e.printStackTrace();
    }
    
    //画像をギャラリーに反映
    String[] paths = {imgPath};
    String[] mimeTypes = {"image/png"};
    MediaScannerConnection.scanFile(getApplicationContext(), paths, mimeTypes, new OnScanCompletedListener(){
     @Override
     public void onScanCompleted(String path, Uri uri) {
      Log.d("MediaScannerConnection", "Scanned " + path + ":");
      Log.d("MediaScannerConnection", "-> uri=" + uri);
     }
    });

最初のfile.mkdir()で保存するディレクトリを作成しています。その後、ファイルをBitmapオブジェクトとして取り出して保存します。

FileOutputStreamを利用して画像の保存処理をしただけでは、保存した画像は再起動しないとギャラリーに反映されません。23行目以降のMediaScannerConnection以降の処理を行うことで再起動することなく画像をギャラリーに反映できます。
また、AndroidManifest.xmlには次のパーミッション記述が必要です。
結果はこんな感じ。SDカード内にtestフォルダが作られ、画像が保存されました。

参考:https://northerndarkstg.at.webry.info/201207/article_3.html

0 件のコメント:

コメントを投稿