[Android] HttpURLConnection GET で画像をダウンロードする

ネットにHTTPアクセスしてデーターをダウンロードするためには、非同期での処理が必要です。以前はAsyncTaskを使っていましたが非推奨となり、代わりにjava.util.concurrent.Executorsを使います。

Android Studio
2021.2.1




HttpURLConnection

 

WebサーバとWebクライアント間でデータ送受信を行うために用いられるプロトコル(規約)をHTTPと言います。データの送受信にはGETとPOSTのメソッドがあり用途により使い分けます。
 
非同期など面倒な処理が必要なのですが、実はPicassoといライブラリーを使うと画像のダウンロードは簡単にできてしまいます。
(ただし、サードパーティのライブラリーはメンテナンスが多少不安ではあります)

picasso 00 100x100 - [Android] HttpURLConnection GET で画像をダウンロードする
ImgeViewで画面に表示させるときに、元画像のサイズ(縦横)が大きいと表示しきれない事があります。このPicassoを使っていましたがラ...

 

 

POST & GET

 

基本的には、両方とも送受信が可能
例えばGETでは画像が欲しいというリクエストを送信して画像データを受信する。POSTではデータベースの情報をサーバーに保存するために大量のデータを送るなど。以下は両者のザックリとした相違点

  • GET
    • サーバから情報を取得するケースに有効
    • データを送信できるのはテキストのみで少量しか送れない
    • https://www.google.co.jp/search?q=http+get&oq=http+get&aqs….のようにURLに付加して送信する
  • POST
    • サーバへ情報を登録するケース
    • バイナリーデータの送信
    • GETでのデータ送信限度を超えてしまう場合
    • 送信データをBODY部分に含めて送信できるので制限はない

今回はこのGETのメソッドを使って、サーバーから画像を受け取るケースを考えてみます。
 
Android6.0からApacheのHTTP Clientが基本的に使えなくなりました。
Apache HTTP Client の削除

 

Executors

 

何も考えずにネットにアクセスしてデーターをダウンロードしようとすると例外が出ます。
android.os.NetworkOnMainThreadException
at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork (StrictMode.java:1114)

非同期アクセスしないといけません。AsynTaskは非推奨になりました、代案としてはjava.util.concurrent
が推奨されているので

java.util.concurrent.Executor
java.util.concurrent.ExecutorService
単一のワーカー・スレッドだけを設定する
newSingleThreadExecutor()
を使っていきま

サンプルコード

 

URLをEditTextで入力して、ボタンをタップ
目的の画像を取得して表示するという流れです

1x1.trans - [Android] HttpURLConnection GET で画像をダウンロードする 
MainActivity.java

 
 
activity_main.xml

 
リソースです
strings.xml

 
マニフェストに INTERNET のパーミッションを入れるのを忘れずに
AndroidManifest.xml

 

サンプル動画

 

サンプル画像をサーバーに置いてダウンロードさせてみます。

 

 

お好みの画像が無ければこれでも落としてみてください
https://developer.android.com/images/home/android-p-clear-bg-with-shadow.png?hl=JA

1x1.trans - [Android] HttpURLConnection GET で画像をダウンロードする

エラーというかこのようなログで画像を落とせない場合はSSL通信ではないからです

 
ネットワーク セキュリティ構成にあるcleartextTrafficPermitted=”false がデフォルトで設定されるため暗号化されていないHTTP通信に失敗します。
SSL通信(https://)以外を除外する設定
AndroidManifest.xmlにnetworkSecurityConfigを設定しないといけないようです。
 
 
関連ページ:

シェアする

  • このエントリーをはてなブックマークに追加

フォローする