[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を設定しないといけないようです。
 
 
関連ページ:







アプリ開発が上達するお勧め

アプリ開発を始めたけどわからないところがあり、誰かに聞きたいけど周りにはそんな人はいない…あるいは、会社で働いていて日中そんなに時間をとれないなど、オンラインのプログラミングスクールがいいでしょう。

TECH ACADEMY
オンライン説明会


侍エンジニア塾
侍エンジニア塾 無料体験レッスン


とても簡単なことなのに本やネットの画像だけでは分かりにくいことはあります。実際に質問してピンポイントで教えてもらうと、なんだそんなこと、と言うのがけっこうあります。


シェアする

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

フォローする