#はじめに
Xamarin.Androidでアプリ開発した時、アプリ内で内部ストレージに画像保存する時についての資料があんまりなかったので、忘れないようにの備忘録です。
内部ストレージに画像保存でググると大抵Java.IOとSystem.IOあたりで詰まってしまうので、そんな方向けにも。調べ方が悪かったかもだけど
私自身まだまだ知識不足なところがあるので、細かい指摘などお待ちしております。
#どんな時に読んで欲しい
Xamarinで作ったアプリ内で画像保存したい。でもその画像あとでギャラリーアプリとかで見たい。
しかしどうすればいいかわからない。Sysytem.IOとJava.IOとかで積んだ。そんな人向けです。
#Xamarinで作ったアプリ内で画像を保存する時
今回はSDカードとかの外部ストレージではなく、内部ストレージに保存するという前提です。
なのでパーミッションWRITE_EXTERNAL_STORAGE
を忘れずに。
Bitmap bitmap; //保存したいBitmapが格納済み
//保存する画像の名前を決める
String imgname = "img_";
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddkkmmss");
imgname += sdf.Format(date);
imgname += ".png";
//保存先のパスとか
ContextWrapper cw = new ContextWrapper(this.ApplicationContext);
Java.IO.File file = Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryDcim);
Java.IO.File myfile = new Java.IO.File(file, imgname);
//保存
using (var os = new System.IO.FileStream(myfile.AbsolutePath, System.IO.FileMode.Create))
{
bitmap.Compress(Android.Graphics.Bitmap.CompressFormat.Png, 100, os);
}
保存する際、画像の名前を決めるコードはここから引用させて頂きました。
###保存先のパス
今回保存先をわかりやすいように、内部ストレージのDCIMに保存することにしました。データディレクトリじゃないのは、一応画像処理された画像の保存なのでMyPicture的な所が良かっただけです。
この画像の保存先のパスの取得に詰まりました。
Java.IO.File file = Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryDcim);
Android.OS.Environment.DirectoryDcimの所でMyPictureとか色々と指定ができると思います。
###画像の保存
using (var os = new System.IO.FileStream(myfile.AbsolutePath, System.IO.FileMode.Create))
{
bitmap.Compress(Android.Graphics.Bitmap.CompressFormat.Png, 100, os);
}
JavaだとFileOutPutStream
などでJava.IOとSystem.IOの変換などが出来ないとかで色々と悩まされました。
System.IO.FileStreamというのがあったなんて。。。
#参考サイト
android - How to save an image to Internal Storage and then show it on another activity? - Stack Overflow
家の前にかむ犬がいた Intentでアプリ内画像をtwitterとかに送る