写真をSDカードに保存する機能を書きます

アンドロイド用のアプリケーションを作成する過程で、フラッシュドライブ上のファイルに任意の画像を保存するタスクがありました。 この記事では、この問題をどのように解決したか、プロセスで遭遇した困難、およびそれらの解決方法について説明します。 私は.NETプログラマーであり、小さなものを作成する必要があるために運命を私にもたらした(したがって、すぐにmonodroidはありません)と、インターフェースの面で非常にシンプルなAndroidアプリケーションであることに注意してください。 これは、私も勉強しているということです。つまり、専門家からのアドバイスやコメントに満足しているということです。





そのため、ファイルとして必要な画像を含むImageViewがあるとします。 最初の質問は、この写真をどこに保存するかです。



最も正確でGoogleが承認した方法では、アプリケーションに特別に割り当てられたキャッシュフォルダーに画像が保存されます。

関数を呼び出すことで、絶対パスを取得できます。



context.getCacheDir();
      
      







このフォルダーは、アプリケーションがアンインストールされるとクリアされ、さらにそのサイズはシステムによって監視され、十分な内部メモリがない場合、そこからのファイルはアンドロイドによって自動的に削除されます。



このソリューションには欠点もあります。 最も重要なことは、アプリケーションキャッシュフォルダーがデバイスの内部メモリに含まれていることです。これは常に欠落しています。 一時ファイルのみを保存し、非常に大きなファイルは保存しないことをお勧めします。ここに大量の重い写真を保存することは望ましくありません。



関数によって取得できるパスであるSDカードのアプリケーションキャッシュフォルダーを使用することをお勧めします。



 context.getExternalCacheDir();
      
      







このフォルダーは、アプリケーションがアンインストールされるときにもクリアされますが、そのサイズはシステムによって監視されないため、ファイルを保存する前に、コマンドでそのステータスを確認することをお勧めします。



 Environment.getExternalStorageState();
      
      







私の場合、さまざまな要因の組み合わせにより、両方の標準ソリューションは最適ではないと思われたので、SDカードのルートにファイルを保存するだけで、そこにあるパスは関数によって取得できます:



 Environment.getExternalStorageDirectory();
      
      







保存手順自体については、そのコードを以下に示します。



 ImageView iv; // ImageView,  ,    String folderToSave = Environment.getExternalStorageDirectory().toString(); //   ,    -  SD- private String SavePicture(ImageView iv, String folderToSave) { OutputStream fOut = null; Time time = new Time(); time.setToNow(); try { File file = new File(folderToSave, Integer.toString(time.year) + Integer.toString(time.month) + Integer.toString(time.monthDay) + Integer.toString(time.hour) + Integer.toString(time.minute) + Integer.toString(time.second) +".jpg"); //          fOut = new FileOutputStream(file); Bitmap bitmap = (BitmapDrawable) iv.getDrawable().getBitmap(); bitmap.compress(Bitmap.CompressFormat.JPEG, 85, fOut); //    jpeg-  85% . fOut.flush(); fOut.close(); MediaStore.Images.Media.insertImage(getContentResolver(), file.getAbsolutePath(), file.getName(), file.getName()); //    } catch (Exception e) //        ,  Exception     { return e.getMessage(); } return ""; }
      
      







コードに関するいくつかの説明。



 File file = new File(folderToSave, Integer.toString(time.year) + Integer.toString(time.month+1) + Integer.toString(time.monthDay) + Integer.toString(time.hour) + Integer.toString(time.minute) + Integer.toString(time.second) +".jpg");
      
      







非常にエレガントではありませんが、鉛筆のようにシンプルで、並べ替えに便利な形式でファイルの一意の名前を取得する実際に機能するソリューション-「2011 11 17 20 31 49.jpg」

ここにちょっとしたトリックがあります。 time.month + 1に気づきましたか?

事実、Javaはゼロから数か月を数え、11月は10メートルであり、誰もがそうであったように1か月ではありません。 混乱。



 bitmap.compress(Bitmap.CompressFormat.JPEG, 85, fOut);
      
      







ここでも、すべてが自明であり、圧縮の割合についてのみ紛争が発生する可能性があります。 85%が最良の選択肢であるように思えますが、誰もが自分の意見とタスクの条件を持っていることができます。



 MediaStore.Images.Media.insertImage(getContentResolver(), file.getAbsolutePath(), file.getName(), file.getName());
      
      







多くの人が忘れている興味深いフェイント。 すべてのAndroidユーザーが、ファイルシステムのパスを表示したとしても、保存したファイルを検索できるほど高度ではありません。 しかし、誰もがフォトアルバムアプリケーションについて知っています(ここで、今撮った写真を見ることができます)。 上記の行をコードに追加すると、画像は目的のディレクトリに保存されるだけでなく、フォトアルバムにも登録され、ユーザーは常に問題なく検索できます。



ちなみに、上記の機能は、インターネットからのランダムな写真を表示する実際に動作するランダム写真アプリケーションから取得され、有料版のプログラムでは、任意の写真をUSBフラッシュドライブに保存できます。



Androidマーケットで無料のランダム画像無料 ランダム写真無料







説明されているファイル保存機能は、有料版でのみ機能します。 その価格は45ルーブルですが、ホーカーのために-もちろん、それは無料でレイアウトされています。 (良い伝統、私は言わなければならない!)コメントの著者からのリンク。



All Articles