画像の保存パスと、画像をバイト配列にしたデータを指定して、MediaStoreに保存する
@param context 呼び出し元コンテキスト
@param imgPath 画像ファイルの絶対パス
@param data 画像データのバイト配列
@return boolean 保存されているか 保存されたtrue 保存されていないfalse
public static boolean save2sdcard(Context context, String imgPath, byte[] data) {
FileOutputStream fileOutputStream = null;
OutputStream outputStream = null;
ContentValues values = null;
ContentResolver resolver = null;
Uri uri = null;
// 処理結果
boolean result = false;
if (!hasSDCard()) {
return false;
}
if(!isExternalStorageWritable()){
return false;
}
try {
final boolean is10 = Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q;
// Android9以前の場合はfalseを返す
// Android9以前の場合
if (!is10) {
Log.e("Android Version Error", "Your OS IS under Androi10");
// return false;
} else {
// Android10の場合
String fileName = getSaveFileName(imgPath);
values = new ContentValues();
values.put(MediaStore.Images.Media.DISPLAY_NAME, fileName);
values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");
//values.put("data",imgPath);
values.put(MediaStore.Images.Media.DATA, imgPath);
// 書込み時にメディア ファイルに排他的にアクセスする
values.put(MediaStore.Images.Media.IS_PENDING, 1);
resolver = context.getContentResolver();
Uri collection=MediaStore.Images.Media.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY);
// 外部メディア参照
Uri item = resolver.insert(collection, values);
outputStream = resolver.openOutputStream(item);
outputStream.write(data);
values.clear();
// 排他的にアクセスの解除
values.put(MediaStore.Images.Media.IS_PENDING, 0);
resolver.update(item, values, null, null);
result = true;
}
} catch (FileNotFoundException e) {
if(Build.VERSION.SDK_INT < Build.VERSION_CODES.Q){
resolver.delete(uri,null,null);
}
e.printStackTrace();
throw new IllegalStateException(e);
} catch (IOException e) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {
resolver.delete(uri, null, null);
}
e.printStackTrace();
}catch (Exception e){
e.printStackTrace();
}finally {
if(outputStream!=null){
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return result;
}
public static boolean isExternalStorageWritable() {
String state = Environment.getExternalStorageState();
return (Environment.MEDIA_MOUNTED.equals(state));
}