ヽ|∵|ゝ(Fantom) の 開発blog? ホーム »内部ストレージ
このページの記事一覧

【Android】【Java】内部ストレージに画像ファイルを保存する(jpg)  


 前回の「内部ストレージに画像ファイルを保存する(png)」と同じもの。画像フォーマットを変えただけ。

//内部ストレージに、画像ファイルを保存する(jpg) (Android 用)
public static final boolean saveJpegLocalStorage(String fileName, Bitmap bitmap, int quality, Context context)
throws IOException, IllegalArgumentException {
BufferedOutputStream bos = null;
Bitmap tmp = null;
try {
bos = new BufferedOutputStream(context.openFileOutput(fileName, Context.MODE_PRIVATE)); //他アプリアクセス不可
tmp = bitmap.copy(Config.ARGB_8888, true);
return tmp.compress(Bitmap.CompressFormat.JPEG, quality, bos);
} finally {
if (tmp != null) {
tmp.recycle();
tmp = null;
}
try {
bos.close();
} catch (Exception e) {
//IOException, NullPointerException
}
}
}

//メインでは... (※例外処理は省略)
String fileName = "sample.jpg"; // "data/data/[パッケージ名]/files/sample.jpg" となる
saveJpegLocalStorage(fileName, bitmap, 60, this); //bitmap は保存する画像/this は起動した Activity が良い(Context)
//ファイルが保存されていれば成功(エミュレータならDDMSで確認できる)

 例外処理は手抜きしてるので、必要あれば適当に。

 前回の PNG フォーマットと、画質の引数(quality)を合わせて1つの関数にしても良いが、高圧縮→jpg、無圧縮→png と使いわける事が多いため、あえて分離してある。エンコードは Bitmap クラスの compress() メソッドを使っているが、他のエンコーダーを用意しても良い。戻値の boolean は compress() の成功をそのまま返しているが、必要なければ無視しても良い。

 また、引数 quality は 0~100 の値(0:低画質で高圧縮、100:高画質で低圧縮)でなれけば、IllegalArgumentException が発生する。面倒なら、関数内で修正するコードを付け加えても良いかも知れない。

 ちなみにファイルの削除は Context.deleteFile() で簡単にできる。


(関連記事)
【Android】内部ストレージに画像ファイルを保存する(png)
【Android】内部ストレージから画像ファイルを読み込む
【Android】内部ストレージからテキストファイルを読み込む
【Android】内部ストレージにテキストファイルを保存する
【Android】SDカードに画像ファイルを保存する(png)
【Android】SDカードに画像ファイルを保存する(jpg)
【Android】assets フォルダから画像ファイルを読み込む
【Android】【Applet】【Java】テキストファイルの読み込み・保存 まとめ


スポンサーサイト

category: Android

thread: プログラミング

janre: コンピュータ

tag: 画像ファイル保存  内部ストレージ 
tb: 0   cm: --

【Android】【Java】内部ストレージに画像ファイルを保存する(png)  


 基本的には「内部ストレージにテキストファイルを保存する」と同じ考え方で、ストリームを開いた後は、画像フォーマットによるエンコード処理に置き換えれば良い。

//内部ストレージに、画像ファイルを保存する(png) (Android 用)
public static final boolean savePngLocalStorage(String fileName, Bitmap bitmap, Context context) throws IOException {
BufferedOutputStream bos = null;
Bitmap tmp = null;
try {
bos = new BufferedOutputStream(context.openFileOutput(fileName, Context.MODE_PRIVATE)); //他アプリアクセス不可
tmp = bitmap.copy(Config.ARGB_8888, true);
return tmp.compress(Bitmap.CompressFormat.PNG, 100, bos);
} finally {
if (tmp != null) {
tmp.recycle();
tmp = null;
}
try {
bos.close();
} catch (Exception e) {
//IOException, NullPointerException
}
}
}


//メインでは... (※例外処理は省略)
String fileName = "sample.png"; // "data/data/[パッケージ名]/files/sample.png" となる
savePngLocalStorage(fileName, bitmap, this); //bitmap は保存する画像/this は起動した Activity が良い(Context)
//ファイルが保存されていれば成功(エミュレータならDDMSで確認できる)

 例外処理は手抜きしてるので、必要あれば適当に。

 とりあえず、PNG フォーマットで、画質100固定になっているので、引数で変更しても良いだろう。エンコードは Bitmap クラスの compress() メソッドを使っているが、他のエンコーダーを用意しても良い。戻値の boolean は compress() の成功をそのまま返しているが、必要なければ無視しても良い。

 ちなみにファイルの削除は Context.deleteFile() で簡単にできる。


(関連記事)
【Android】内部ストレージに画像ファイルを保存する(jpg)
【Android】内部ストレージから画像ファイルを読み込む
【Android】内部ストレージからテキストファイルを読み込む
【Android】内部ストレージにテキストファイルを保存する
【Android】SDカードに画像ファイルを保存する(png)
【Android】SDカードに画像ファイルを保存する(jpg)
【Android】assets フォルダから画像ファイルを読み込む
【Android】【Applet】【Java】テキストファイルの読み込み・保存 まとめ


category: Android

thread: プログラミング

janre: コンピュータ

tag: 画像ファイル保存  内部ストレージ 
tb: 0   cm: --

【Android】【Java】内部ストレージから画像ファイルを読み込む  


 これも基本は「内部ストレージからテキストファイルを読み込む」と同じ。変更点はストリームを開いた後のデコーダーを、画像用に書き換えれば良いだけ。

//内部ストレージから、画像ファイルを読み込む(Android 用)
public static final Bitmap loadBitmapLocalStorage(String fileName, Context context)
throws IOException, FileNotFoundException {
BufferedInputStream bis = null;
try {
bis = new BufferedInputStream(context.openFileInput(fileName));
return BitmapFactory.decodeStream(bis);
} finally {
try {
bis.close();
} catch (Exception e) {
//IOException, NullPointerException
}
}
}


//メインでは... (※例外処理は省略)
String fileName = "sample.jpg"; // "data/data/[パッケージ名]/files/sample.jpg" になる
Bitmap bitmap = loadBitmapLocalStorage(fileName, this); //this は起動した Activity が良い(Context)

 例外処理は手抜きしてるので、必要あれば適当に。

 DDMS で覗いて、保存フォルダが作られていれば、右上の方にある [push] ボタンからファイル転送もできるが、無い場合は、Context クラスの openFileOutput() で書き込めばフォルダが自動的に作られる。


(関連記事)
【Android】内部ストレージに画像ファイルを保存する(png)
【Android】内部ストレージに画像ファイルを保存する(jpg)
【Android】内部ストレージからテキストファイルを読み込む
【Android】内部ストレージにテキストファイルを保存する
【Android】SDカードから画像ファイルを読み込む
【Android】assets フォルダから画像ファイルを読み込む
【Android】【Applet】【Java】テキストファイルの読み込み・保存 まとめ


category: Android

thread: プログラミング

janre: コンピュータ

tag: 画像ファイル読み込み  内部ストレージ 
tb: 0   cm: --

【Android】【Java】内部ストレージにテキストファイルを保存する  


 ついでなので、前回の「内部ストレージからテキストファイルを読み込む」のテストにも使えるように、簡単な保存機能も書いてみる。ストリームにて書き込みも必要なので、簡単なものを用意した。読み込みの loadText() はサイズ不定でも良いように、最後まで while ループで読み込んでいるが、保存の場合はサイズがわかってるので、1つのメソッドで済ませている。あまりに巨大なファイルでなければ、これで十分だろう。正確にはファイルを保存というより、出力先に転送みたいな感じなのだが、出力先をファイルに限定して、loadText() と対に使っても良いだろう。

//設定値
private static final String DEFAULT_ENCORDING = "UTF-8"; //デフォルトのエンコード

//出力ストリームにてテキストを保存(汎用)
public static final void saveText(OutputStream outputStream, String text, String charsetName)
throws IOException, UnsupportedEncodingException {
BufferedOutputStream bos = null;
try {
bos = new BufferedOutputStream(outputStream);
bos.write(text.getBytes(charsetName)); //すべての byte[] を取得
bos.flush();
} finally {
try {
bos.close();
} catch (Exception e) {
//IOException
}
}
}


//内部ストレージに、テキストファイルを保存する(Android 用)
public static final void saveTextLocalStorage(String fileName, String text, Context context) throws IOException {
// "data/data/[パッケージ名]/files/" 直下に保存。他アプリアクセス不可(MODE_PRIVATE)
OutputStream os = context.openFileOutput(fileName, Context.MODE_PRIVATE);
saveText(os, text, DEFAULT_ENCORDING);
}


//メインでは... (※例外処理は省略)
String fileName = "sample.txt"; // "data/data/[パッケージ名]/files/sample.txt" となる
String text = "保存する文字列";
saveTextLocalStorage(fileName, text, this); //this は起動した Activity が良い(Context)
//ファイルが保存されていれば成功(エミュレータならDDMSで確認できる)

 文字エンコーディングは読み込みに合わせて "UTF-8" にした方が良いだろう。他のものにしたいなら、ストリームに渡す前に変更してやれば良い。

 実機の場合は確認しずらいかも知れないが、端末のアプリケーション管理から、該当アプリの情報を覗いてみると、「保存先」のような項目があり、データ容量が増えている事でもわかる(メニューは端末による)。

 ちなみにファイルの削除は Context.deleteFile() で簡単にできる。

 Android にはその他に、外部ストレージ機能というものもある。一番身近なものはSDカードだ。これはエミュレータでも実験できるので、次回はそれらに必要ないくつかの関数を組み合わせて、SDカードからテキストファイルを読み込む機能を作ってみよう。

 テキストファイルの読み込みや保存をまとめたページは→こちら


(関連記事)
【Android】内部ストレージからテキストファイルを読み込む
【Android】内部ストレージから画像ファイルを読み込む
【Android】内部ストレージに画像ファイルを保存する(png)
【Android】内部ストレージに画像ファイルを保存する(jpg)
【Android】SDカードにテキストファイルを保存する
【Android】【Applet】【Java】テキストファイルの読み込み・保存 まとめ
【Android】Preference 機能を使ってデータを読み込み・保存する



category: Android

thread: プログラミング

janre: コンピュータ

tag: テキストファイル保存  内部ストレージ 
tb: 0   cm: --

【Android】【Java】内部ストレージからテキストファイルを読み込む  


 Android には「内部ストレージ」というアプリケーションごとにデータを保存できる場所がある。そのファイルは、端末の「/data/data/[パッケージ名]/files/」に置かれる。Eclipse を使っているのなら、「DDMS」に切り替えれば見れるだろう(エミュレータを起動している時のみ)。与えるパーミッションによっては他のアプリからも読めるが、通常はセキュリティを考えて、各アプリ固有のファイルに設定する。アプリケーション間でデータを共有したい場合は、ContentProvider の機能を使う。

 Context クラスの getDir() など、Android 専用のメソッドで、配下にフォルダなども作れるが、「/data/data/[パッケージ名]/app_[フォルダ名]/」のように一定形式で作られるので、それに準拠してないと上手く読めない恐れがある。大量のファイルを管理するのには向いてないかも知れない。とりあえず、そのアプリ固有のデフォルトの保存場所での使い方。

 ストリームからのテキストファイル読み込みは例によって以前作ったものをそのまま使う。

 loadText() - ストリームからテキストファイルを読み込む

 手順を簡単に説明すると、次のようになる。

1.内部ストレージ(ローカルストレージ)の入力ストリームを開く。
2.ストリームからテキストエンコーディングして文字列を返す。


●内部ストレージの入力ストリームを開く部分 [Android 用]
//設定値
private static final String DEFAULT_ENCORDING = "UTF-8"; //デフォルトのエンコード

//内部ストレージから、テキストファイルを読み込む(Android 用)
public static final String loadTextLocalStorage(String fileName, Context context)
throws IOException, FileNotFoundException {
InputStream is = context.openFileInput(fileName); // "data/data/[パッケージ名]/files/" 直下
return loadText(is, DEFAULT_ENCORDING);
}

//メインでは... (※例外処理は省略)
String fileName = "sample.txt"; // "data/data/[パッケージ名]/files/sample.txt" になる
String text = loadTextLocalStorage(fileName, this); //this は起動した Activity が良い(Context)
System.out.println(text); //Log.d("tag", text); でも良い

 DDMS で覗いて、保存フォルダが作られていれば、右上の方にある [push] ボタンからファイル転送もできるが、無い場合は、Context クラスの openFileOutput() で書き込めばフォルダが自動的に作られる。

●ストリームからテキストエンコーディングして読み込む部分 [汎用](- loadText() ※以前作ったものを使い回し)
//設定値
private static final int DEFAULT_READ_LENGTH = 8192; //一度に読み込むバッファサイズ

//ストリームから読み込み、バイト配列で返す
public static final byte[] readStream(InputStream inputStream, int readLength) throws IOException {
final ByteArrayOutputStream byteStream = new ByteArrayOutputStream(readLength); //一時バッファのように使う
final byte[] bytes = new byte[readLength]; //read() 毎に読み込むバッファ
final BufferedInputStream bis = new BufferedInputStream(inputStream, readLength);

try {
int len = 0;
while ((len = bis.read(bytes, 0, readLength)) > 0) {
byteStream.write(bytes, 0, len); //ストリームバッファに溜め込む
}
return byteStream.toByteArray(); //byte[] に変換

} finally {
try {
byteStream.reset(); //すべてのデータを破棄
bis.close(); //ストリームを閉じる
} catch (Exception e) {
//IOException
}
}
}

//ストリームから読み込み、テキストエンコードして返す
public static final String loadText(InputStream inputStream, String charsetName)
throws IOException, UnsupportedEncodingException {
return new String(readStream(inputStream, DEFAULT_READ_LENGTH), charsetName);
}


 ついでなので、次回は内部ストレージにテキストファイルを保存してみよう。

 テキストファイルの読み込みや保存をまとめたページは→こちら


(関連記事)
【Android】内部ストレージにテキストファイルを保存する
【Android】内部ストレージから画像ファイルを読み込む
【Android】res/raw リソースフォルダからテキストファイルを読み込む
【Android】assets フォルダからテキストファイルを読み込む
【Android】SDカードからテキストファイルを読み込む
【汎用】ストリームからテキストファイルを読み込む(ストリームから読み込み、テキストエンコードして返す)
【汎用】ローカルシステム(Windows 等)から、テキストファイルを読み込む
【Applet/汎用】URL経由でWebサーバ上のテキストファイルを読み込む
【Applet】jar 内リソースからテキストファイルを読み込む
【Android】【Applet】【Java】テキストファイルの読み込み・保存 まとめ
【Android】Preference 機能を使ってデータを読み込み・保存する



category: Android

thread: プログラミング

janre: コンピュータ

tag: テキストファイル読み込み  内部ストレージ 
tb: 0   cm: --


プロフィール

Social

検索フォーム

全記事一覧

カテゴリ

ユーザータグ

最新記事

リンク

PR

▲ Pagetop