Edited at

Xamarin.Androidで作ったアプリ内で画像を保存する時の話

More than 1 year has passed since last update.


はじめに

Xamarin.Androidでアプリ開発した時、アプリ内で内部ストレージに画像保存する時についての資料があんまりなかったので、忘れないようにの備忘録です。

内部ストレージに画像保存でググると大抵Java.IOとSystem.IOあたりで詰まってしまうので、そんな方向けにも。調べ方が悪かったかもだけど

私自身まだまだ知識不足なところがあるので、細かい指摘などお待ちしております。


どんな時に読んで欲しい

Xamarinで作ったアプリ内で画像保存したい。でもその画像あとでギャラリーアプリとかで見たい。

しかしどうすればいいかわからない。Sysytem.IOとJava.IOとかで積んだ。そんな人向けです。


Xamarinで作ったアプリ内で画像を保存する時

今回はSDカードとかの外部ストレージではなく、内部ストレージに保存するという前提です。

なのでパーミッションWRITE_EXTERNAL_STORAGEを忘れずに。


ImageSave.cs

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とかに送る