Androidは、ネットワークから画像表示を取得し、SDカードに保存する方法を実現する。


この例は、ネットワークから画像表示を取得してSDカードに保存する方法を説明する。皆さんに参考にしてあげます。具体的には以下の通りです。
問題:
どのようにして画像を取得して表示して、ビデオの効果を達成しますか?
コード:

public class GetPictureFromInternetActivity extends Activity 
{ 
 private ImageView imageView; 
 public void onCreate(Bundle savedInstanceState) 
 { 
 super.onCreate(savedInstanceState); 
 setContentView(R.layout.main); 
  String url = "http://img1.gcimg.net/att/day_120330/1203301402671605a8a7994804.png"; 
// String url = "http://www.gezila.com/uploads/allimg/110110/1_110110084544_1.jpg"; 
 imageView = (ImageView) this.findViewById(R.id.imageView); 
 Bitmap bitmap = getHttpBitmap(url);//        
 imageView.setImageBitmap(bitmap); 
 savePicture(bitmap);//     SD  
 } 
 public Bitmap getHttpBitmap(String url) 
 { 
 Bitmap bitmap = null; 
 try 
 { 
  URL pictureUrl = new URL(url); 
  InputStream in = pictureUrl.openStream(); 
  bitmap = BitmapFactory.decodeStream(in); 
  in.close(); 
 } catch (MalformedURLException e) 
 { 
  e.printStackTrace(); 
 } catch (IOException e) 
 { 
  e.printStackTrace(); 
 } 
 return bitmap; 
 } 
 public void savePicture(Bitmap bitmap) 
 { 
 String pictureName = "/mnt/sdcard/" + "car"+".jpg"; 
 File file = new File(pictureName); 
 FileOutputStream out; 
 try 
 { 
  out = new FileOutputStream(file); 
  bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out); 
  out.flush(); 
  out.close(); 
 } catch (FileNotFoundException e) 
 { 
  e.printStackTrace(); 
 } catch (IOException e) 
 { 
  e.printStackTrace(); 
 } 
 } 
 public boolean onCreateOptionsMenu(Menu menu) 
 { 
 super.onCreateOptionsMenu(menu); 
 MenuItem item = menu.add(Menu.NONE, Menu.NONE, Menu.NONE, "Exit"); 
 item.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() 
 { 
  public boolean onMenuItemClick(MenuItem item) 
  { 
  System.exit(0); 
  return true; 
  } 
 }); 
 return true; 
 } 
}

注意:1、権限問題
ネットワークに関する権限:
SDカードの読み書きに関する権限:
問題の分解:
問題1、どのようにしてネットワークから画像を取得して表示しますか?
問題2、どのように画像を表示し続けるか:
拡張:取得した画像をどのように保存しますか?
問題1解決案:
3つの選択肢があるように見えますが、実質は一つのパターンで、スープを変えても薬を換えません。まず、統一リソースポジショナURl(uniform resource location)により、読取画像ストリームを取得し、Bitmapに伸張して表示します。具体的な実現コードは以下の通りです。
選択1:直接クラスURLは一つのストリームを開き、最も簡単で実用的です。

public Bitmap getHttpBitmap(String url) 
{ 
 Bitmap bitmap = null; 
 try 
 { 
  URL pictureUrl = new URL(url); 
  InputStream in = pictureUrl.openStream(); 
  bitmap = BitmapFactory.decodeStream(in); 
  in.close(); 
 } catch (MalformedURLException e) 
 { 
  e.printStackTrace(); 
 } catch (IOException e) 
 { 
  e.printStackTrace(); 
 } 
 return bitmap; 
}

選択2:クラスURLConnectionで接続を開く

public Bitmap getHttpBitmap(String url) 
{ 
 Bitmap bitmap = null; 
 try 
 { 
  URL pictureUrl = new URL(url); 
  URLConnection con = pictureUrl.openConnection(); 
  InputStream in = con.getInputStream(); 
  bitmap = BitmapFactory.decodeStream(in); 
  in.close(); 
 } catch (MalformedURLException e) 
 { 
  e.printStackTrace(); 
 } catch (IOException e) 
 { 
  e.printStackTrace(); 
 } 
 return bitmap; 
}

選択3:クラスHttpURLConnectionで接続を開く

public Bitmap getHttpBitmap(String url) 
{ 
 Bitmap bitmap = null; 
 try 
 { 
  URL pictureUrl = new URL(url); 
  HttpURLConnection con = (HttpURLConnection) pictureUrl.openConnection(); 
  InputStream in = con.getInputStream(); 
  bitmap = BitmapFactory.decodeStream(in); 
  in.close(); 
 } catch (MalformedURLException e) 
 { 
  e.printStackTrace(); 
 } catch (IOException e) 
 { 
  e.printStackTrace(); 
 } 
 return bitmap; 
}

問題2解決案:
タイマーをオンにして、どのぐらいの間隔で実行しますか?
もう一つの案はスレッドを開いて、whileの死サイクルの中でsleepを使ってしばらく寝ることです。
取得した画像を保存する解決方法:
画像を保存すると、もちろんSDカード上のファイルの読み書き操作に関連します。ここではBitmapを直接ファイルに書き込みます。フローを使うのは間違いないと思いますが、Bitmap Factory類の強みを知る必要があります。システム時間でファイル名を保存するための実現過程を示しています。上書きやオフラインを考慮する必要がないという利点があります。

public void savePicture(Bitmap bitmap) 
{ 
 if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) 
 { 
 try 
 { 
 File sdcardDir = Environment 
 .getExternalStorageDirectory(); 
 Time t = new Time(); 
 t.setToNow();
 String filename = sdcardDir.getCanonicalPath() 
 + "/DCIM/camera" 
 + String.format( 
 "/ReeCam%04d%02d%02d%02d%02d%02d.jpg", 
 t.year, t.month + 1, t.monthDay, 
 t.hour, t.minute, t.second); 
 File file = new File(filename); 
 FileOutputStream out = new FileOutputStream(file); 
 bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out); 
 out.flush(); 
 out.close(); 
 } catch (FileNotFoundException e) 
 { 
 e.printStackTrace(); 
 } catch (IOException e) 
 { 
 e.printStackTrace(); 
 }
 } 
}

ここで使っているbitmapは上で生成されたbitmapです。
この問題を見ていると、高校時代の総合問題のように、簡単な問題に分解して、小さな問題ごとに解決すれば、複雑な問題は自然に解決できると思います。先日の招待状を見ましたが、テーマは「問題がより小さい問題に分解された後、すべての問題がこんなに簡単になり、しかもすべての問題がこのように分解されます。」牛人とは、複雑な問題に直面した時に、はっきりした考えを持ち、問題を分析するプロセスであり、それを十分に小さい問題に分解し、一つ一つ解決し、最後に組み合わせます。もし一台の小型車を見たら、部品が多くて、ちょっと複雑ですよね。でも、私達は下に下りて分解します。4つの車輪と車の外殻、そして輪を再び分けて、鉄輪とタイヤの皮を分けて、タイヤの皮を内胎と外胎に分解します。そしてあなたがやるべきことは、タイヤとコイルを生産するメーカーを見つけてこの二つの部品を買って、第三者または他の工具を利用して車輪に組み立てることです。ここのタイヤと鋼輪はJavaの中の類に相当して、第三者あるいはその他の組み立てのツール、あなたのコードのように、それらをエンジンと一緒に組み立てて、車の走る機能を実現しました。分解思惟をマスターして、最も常用したのは二分法で、もちろん具体的な問題を具体的に分析しなければなりません。
ここで述べたように、皆さんのAndroidプログラムの設計に役に立ちます。