Warning: include(/home/users/2/lolipop.jp-a-virtual/web/dhmo/dhmo/wp-content/advanced-cache.php): failed to open stream: No such file or directory in /home/users/2/lolipop.jp-a-virtual/web/dhmo/dhmo/wp-settings.php on line 74

Warning: include(/home/users/2/lolipop.jp-a-virtual/web/dhmo/dhmo/wp-content/advanced-cache.php): failed to open stream: No such file or directory in /home/users/2/lolipop.jp-a-virtual/web/dhmo/dhmo/wp-settings.php on line 74

Warning: include(): Failed opening '/home/users/2/lolipop.jp-a-virtual/web/dhmo/dhmo/wp-content/advanced-cache.php' for inclusion (include_path='.:/usr/local/php/5.4/lib/php') in /home/users/2/lolipop.jp-a-virtual/web/dhmo/dhmo/wp-settings.php on line 74
画像をストレージに保存するを実装する方法|マーケット公開済みアプリのソース公開します。 – Androidアプリつくったった

画像をストレージに保存するを実装する方法|マーケット公開済みアプリのソース公開します。

SDカードに保存

画像をストレージに保存するを実装する方法|マーケット公開済みアプリのソース公開します。

STEP0 データストアの使い分け|データ特性に合った場所に保存しよう

STEP0としたのも、この段階でそもそもそのアプリケーションが
ストレージへの保存を必要としているかが振り分けられるからです。

◎データストアとは
一言でいえば『データを特定の形式で保存する場所』です。
Android端末は様々な保存先を設定することが可能です。
データの特性に合わせて使い分けることでユーザビリティを高めることができます。

—-具体的な種類と使いどころをまとめると
個人的な使い分けですがご参考あれ


① 外部サーバ    —- ネット接続環境下でないと保存できない。
     容量はある意味用意しただけいくらでも増加可能です。
     (ソーシャルゲーム等、外部と共有するまたは,預ける大きなデータがあるとき)
② 外部ストレージ(ファイル) —- 大きなデータを取り扱いたいときはココを指定した方がよい
③ 内部ストレージ(ファイル) —- アクセス制御が必要なある程度の大きさのデータを保存する場合
④ SQLite    —- 定型データに対して抽出の方法が色々なパターンが考えられる時
⑤ SharedPrefence   —- 定型データをキーとセットでシンプルにコンパクトに保存したい時
⑥ ContentProvider   —- 動作しているアプリ間でデータをやり取りする場合に使用


STEP1 まずはパーミッション
外部ストレージ(SD カードなど)への書き込みを許可する場合、ファイルの修正、
削除も可能にする場合にはパーミッション『WRITE_EXTERNAL_STORAGE 』が必要です。
エラーの中に『Permission denied』とあればパーミッションと分かるのですが
はずかしいのでやめましょう。

SDに・・・となったら条件反射的にパーミッションを浮かぶようになりましょう。

Manifest.xmlに以下を記載します(必須)。

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

※JellyBeanでREAD_EXTERNAL_STORAGE権限が追加されたとのことです。
(コチラのサイトで紹介されています)まだ仮らしいが、ご注意あれ
パーミッションは現在全部で400種類前後ありますが、相当数このような予約された権限が存在しています。
こんなところからAndroidの将来を予想するのも楽しそうですね。

ソースを書くとこんな感じです。

<permission android:name="android.permission.READ_EXTERNAL_STORAGE"
    android:permissionGroup="android.permission-group.DEVELOPMENT_TOOLS"
    android:label="@string/permlab_sdcardRead"
    android:description="@string/permdesc_sdcardRead"
    android:protectionLevel="normal" />

簡単なサンプルから

ボタンを押すとフォーム内のテキストをストレージ内のテキストに
書き込むというだけのものです。(最低限の動作ソースです。)

実際にはどんな想定が必要か考えながらソースを見てみましょう。

Button saveBtn = (Button)findViewById(R.id.saveBtn);
saveBtn.setOnClickListener(new OnClickListener(){
    @Override
    public void onClick(View v) {
        String filePath = Environment.getExternalStorageDirectory() + "/sample.txt";
        File file = new File(filePath);
        file.getParentFile().mkdir();

        FileOutputStream fos;
        try {
            fos = new FileOutputStream(file, true);
            OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");
            BufferedWriter bw = new BufferedWriter(osw);
            String str = ((EditText) findViewById(R.id.editTxt)).getText().toString();
            bw.write(str);
            bw.flush();
            bw.close();
        } catch (Exception e) {
        }
    };
});

それでは今回メインの

さて、先のソースを見て足りないところは分かりましたか?
なにも気がつかなっかった人は純粋過ぎます。

実際にはディレクトリがないかもしれませんし
SDが利用できないかもしれません。
そんなところを踏まえて本番で使用しているソースをどうぞ。

		public void onClick(View v) {
			Button button = (Button)findViewById(R.id.button1);
			View layout = button.getRootView().findViewById(R.id.webView1);
			layout.setDrawingCacheEnabled(true);
			Bitmap bitmap = layout.getDrawingCache();
			//SDカードが利用可能か調べる
			String status = Environment.getExternalStorageState();
			File sdcardDir;
			if(status.equals(Environment.MEDIA_MOUNTED)){
				String sdcardDirPath =
						Environment
						.getExternalStorageDirectory()
						.getAbsolutePath()+"/image";
				sdcardDir =new File(sdcardDirPath);
				//ディレクトリがなければ作成する
				if(!sdcardDir.exists()){
					sdcardDir.mkdir();
				}
			}else{
				Toast.makeText(getBaseContext(), "Could not access SD card",
										Toast.LENGTH_LONG).show();
				return;
			}
			//ファイル名を日付時刻に設定する。
			long msec = System.currentTimeMillis();
			String fname =
					DateFormat.format("yyyy-MM-dd_kk.mm.ss", msec).toString();
			fname =sdcardDir.getAbsolutePath() + "/" + fname+".png";

			//画像をファイルに書き込む
			try{
				FileOutputStream outstream =new FileOutputStream(fname);
				bitmap.compress(CompressFormat.PNG, 100, outstream);
				outstream.flush();//ファイルとして出力
				outstream.close();//使ったらすぐに閉じる
			}catch(IOException ie){
				System.out.println("ERROR ie="+ie);
				Toast.makeText(getBaseContext(), "ファイルの書き込みができませんでした。",
										Toast.LENGTH_SHORT).show();
			}
			ContentResolver contentResolver = getContentResolver();///
			ContentValues contentValues = new ContentValues();
			contentValues.put(MediaStore.MediaColumns.MIME_TYPE, "image/png");
			contentValues.put(MediaStore.MediaColumns.DATA, fname);
			contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
								   contentValues);
			Toast.makeText(getBaseContext(), "無事キャプチャが取れました。" +
					"画像はimageにおいておきました。",
					Toast.LENGTH_LONG).show();
		}

以上です。

参考になれば幸いです。

▼ 関連記事・最近の投稿は記事の下にあります。コチラもご参考ください。


About the Author

dhmo
Author:DHMO(ディベロッパー名) 仕事では自社サービス・メディアの開発を行ってます。 趣味でAndroidアプリ製作を行っています。 カラオケではランキングバトルにはまっております。 Mail: dihydromooxide7@gmail.com 

Be the first to comment on "画像をストレージに保存するを実装する方法|マーケット公開済みアプリのソース公開します。"

Leave a comment

Your email address will not be published.


*