前回SharedPreferencesでテキストを保存というのをやりました。
SharedPreferencesはあくまで小規模なテキストなどの保存用で、画像などの大きなファイルの保存には向いていません。
大きなファイルの保存にはストリームを使います。
http://android.roof-balcony.com/shori/strage/localfile-2/
問題点は、ストリーム経由なのでめんどいのと、全部読み込みメソッドが何故か無いこと。
PHPで言うとfread()はあるのにfile_get_contents()が無い。
まあとりあえずやってみましょう。
pngファイルをビットマップとして開いてpngに変換してさらにバイト列にして保存とかがっかりにも程があるだろう。
なお、directory = "/data/data/" + this.getPackageName()はアプリのローカルディレクトリです。
ファイルエクスプローラーなどで確認できます。
特にパーミッションは指定していないのですが600だったので他のアプリから読まれる心配はない、のかなあ?
そこらへんよくわかりません。
さて、ファイルを保存する度にこんな面倒なことやってらんねえよ、ということでもう少しだけ簡単なメソッドが用意されています。
ファイルをストリームにする手間が省けただけで、画像をバイト列に変換する部分の野暮ったさはそのままです。
なお、書き込み先のディレクトリは"/data/data/" + this.getPackageName() + "/files/"で固定になり、サブディレクトリなどの指定はできません。
融通が利かない分、指定の必要もないため多少操作は楽になります。
でもね、本当にほしかったのはfilePutContents(String fileName, Bitmap bitmap)なんだよな。
いやまあ、メソッド作ればいいだけなのですが。
SharedPreferencesはあくまで小規模なテキストなどの保存用で、画像などの大きなファイルの保存には向いていません。
大きなファイルの保存にはストリームを使います。
http://android.roof-balcony.com/shori/strage/localfile-2/
問題点は、ストリーム経由なのでめんどいのと、全部読み込みメソッドが何故か無いこと。
PHPで言うとfread()はあるのにfile_get_contents()が無い。
まあとりあえずやってみましょう。
//画像を取得 Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.test); //画像をバイト列に ByteArrayOutputStream output = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.PNG, 100, output); byte[] byteArray = output.toByteArray(); //書き込むファイル String directory = "/data/data/" + this.getPackageName(); String filename = "fileName"; File file = new File(directory, filename); //ファイルをストリームに FileOutputStream outputStream = new FileOutputStream(file); //書き込みの実行 outputStream.write(byteArray); //読み込むファイル FileInputStream inputStream = new FileInputStream(file); //ストリームから画像に Bitmap bitmapFactory = BitmapFactory.decodeStream(inputStream); //ここからはImageViewに画像を突っ込んでるだけ View view = findViewById(R.id.imageView1); ImageView imageView = (ImageView)view; imageView.setImageBitmap(bitmapFactory);いやあ、これ絶対どこか間違ってるよ。
pngファイルをビットマップとして開いてpngに変換してさらにバイト列にして保存とかがっかりにも程があるだろう。
なお、directory = "/data/data/" + this.getPackageName()はアプリのローカルディレクトリです。
ファイルエクスプローラーなどで確認できます。
特にパーミッションは指定していないのですが600だったので他のアプリから読まれる心配はない、のかなあ?
そこらへんよくわかりません。
さて、ファイルを保存する度にこんな面倒なことやってらんねえよ、ということでもう少しだけ簡単なメソッドが用意されています。
//画像を取得 Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.test); ByteArrayOutputStream output = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.PNG, 100, output); byte[] byteArray = output.toByteArray(); //ファイル名 String filename =" fileName "; //書き込むストリーム OutputStream outputStream = openFileOutput(filename, Context.MODE_PRIVATE); //書き込み実行 outputStream.write(byteArray); //読み込み InputStream inputStream = openFileInput(filename); //ストリームから画像に Bitmap bitmapFactory = BitmapFactory.decodeStream(inputStream); //ここからはviewに画像を突っ込んでるだけ View view = findViewById(R.id.imageView1); ImageView imageView = (ImageView)view; imageView.setImageBitmap(bitmapFactory);openFileOutput()とopenFileInput()がそれなのですが……たいしてかわらないな。
ファイルをストリームにする手間が省けただけで、画像をバイト列に変換する部分の野暮ったさはそのままです。
なお、書き込み先のディレクトリは"/data/data/" + this.getPackageName() + "/files/"で固定になり、サブディレクトリなどの指定はできません。
融通が利かない分、指定の必要もないため多少操作は楽になります。
でもね、本当にほしかったのはfilePutContents(String fileName, Bitmap bitmap)なんだよな。
いやまあ、メソッド作ればいいだけなのですが。
PR
トラックバック
トラックバックURL: