facebook twitter hatena line email

Android/ストレージ/sdカードに画像保存

提供: 初心者エンジニアの簡易メモ
移動: 案内検索
  • AndroidManivest.xmlに追加
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
  • src/info/nonip/android/lib/entity/SdcardEntity.java
package info.nonip.android.lib.entity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Environment;
import android.util.Log;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
/**
 * SDカードエンティティ
 *
 * @ex
 * SdcardEntity sdcard = SdcardEntity.getInstance();
 * sdcard.setDir("hoge");// sdカード内にhogeディレクトリを作成
 * sdcard.saveBitmapPng(bitmap, "fuga");
 */
public class SdcardEntity {
    // このクラスに唯一のインスタンス
    private static SdcardEntity singleton = new SdcardEntity();
    // SDカードrootpath
    private File mSdDirPath;
    // dirパス
    private String mDirPath;
    // newでのインスタンス生成防止
    private SdcardEntity() {
        // sdcardフォルダを指定
        mSdDirPath = Environment.getExternalStorageDirectory();
    }
    // インスタンス取得メソッド
    public static SdcardEntity getInstance() {
        return singleton;
    }
    // dirpath設定
    public void setDirPath(String dir) {
        mDirPath = mSdDirPath + "/" + dir;
        // dir生成
        mkdir();
    }
    // png画像保存
    public String saveBitmapPng(Bitmap mBitmap, String filepath) {
        String uristr = null;
        try {
            // 保存処理開始
            FileOutputStream fos = null;
            // fos = new FileOutputStream(new File(sdpath, fileName.format(mDate) + ".png"));
            // 保存uri
            uristr = mDirPath + "/"+ filepath + ".png";
            fos = new FileOutputStream(new File(uristr));
            // jpegで保存
            // mBitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);
            mBitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);
            // 画像解放
            mBitmap = null;
            // 保存処理終了
            fos.close();
        } catch (IOException e) {
Log.e("SdcardUtil", "" + e.toString());
        }
Log.d("SdcardUtil", "sdcard save=" + uristr);
        return uristr;
    }
    // jpg画像保存
    public String saveBitmapJpg(Bitmap mBitmap, String filepath) {
        String uristr = null;
        try {
            // 保存処理開始
            FileOutputStream fos = null;
            // 保存uri
            uristr = mDirPath + "/"+ filepath + ".jpg";
            fos = new FileOutputStream(new File(uristr));
            mBitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);
            // 画像解放
            mBitmap = null;
            // 保存処理終了
            fos.close();
        } catch (IOException e) {
Log.e("SdcardUtil", "" + e.toString());
        }
Log.d("SdcardUtil", "sdcard save=" + uristr);
        return uristr;
    }
    // ディレクトリ作成
    public void mkdir() {
        File dir = new File(mDirPath);
        if (!dir.exists()) {
            dir.mkdirs();
        }
Log.d("SdcardUtil", "mkdir=" + mDirPath);
    }
    // ファイルリスト取得
    public ArrayList<String> getFiles() {
        ArrayList<String> imgList = new ArrayList<String>();
        try {
            //選択ボックスで表示するファイル名のリストを作成
            File dir = new File(mDirPath);
            final File[] files = dir.listFiles();
            for (int i = 0; i < files.length; i++) {
                File file = files[i];
Log.d("SdcardUtil", "filepath=" + mDirPath + "/" + file.getName());
                imgList.add(mDirPath + "/" + file.getName());
            }
            return imgList;
        } catch (NullPointerException e) {
Log.e("SdcardUtil", "NullPointerException ストレージがマウントされていないか確認");
            return imgList;
        }
    }
    // 指定dir内のファイル削除
    public void delFiles() {
        ArrayList<String> paths = getFiles();
        for (String path : paths) {
            File file = new File(path);
            file.delete();
        }
    }
    // filepathから画像取得
    public Bitmap getBitmapByPath(String filepath) {
        String uristr = mDirPath + "/"+ filepath;
        File f = new File(uristr);
        BitmapFactory.Options bmOp = new BitmapFactory.Options();
        //bmOp.inSampleSize = 20;
        return BitmapFactory.decodeFile(f.getPath(), bmOp);
    }
}

open failed: EACCES (Permission denied) エラーが出る場合

android6以上の場合はmanifest宣言以外にアプリ側でも許可が必要となっている

設定方法:設定/アプリ/使用アプリを選択/許可/ストレージ