Android
 Computer >> コンピューター >  >> プログラミング >> Android

Androidで指定したURLから画像をダウンロードして表示する方法を徹底解説

AndroidでURLから画像をダウンロードする方法

このチュートリアルでは、Androidアプリで指定したURLから画像をダウンロードし、画面に表示する方法を段階的に解説します。ネットワーク通信はメインスレッドで行うとアプリがフリーズするため、AsyncTaskを使ってバックグラウンドで処理するのがポイントです。

手順1:新しいプロジェクトを作成する

Android Studioを起動し、メニューから「File」→「New Project」を選択して、必要な情報を入力して新しいプロジェクトを作成します。

手順2:レイアウトファイル(activity_main.xml)を編集する

res/layout/activity_main.xml に以下のコードを追加します。ダウンロード用のボタンと、取得した画像を表示するImageViewを配置しています。

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
    xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:app="https://schemas.android.com/apk/res-auto"
    android:id="@+id/coordinatorLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <Button
        android:id="@+id/btnDownload"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Download Image"
        android:layout_margin="25dp"
        android:layout_gravity="top|center_horizontal" />
    <ImageView
        android:id="@+id/imageView"
        android:layout_width="match_parent"
        android:layout_height="200dp"
        android:scaleType="centerCrop"
        app:layout_anchor="@id/btnDownload"
        android:layout_gravity="bottom"
        app:layout_anchorGravity="bottom"
        android:layout_margin="10dp" />
</android.support.design.widget.CoordinatorLayout>

手順3:MainActivity.java にダウンロード処理を実装する

src/MainActivity.java に以下のコードを記述します。ボタンがタップされると、AsyncTaskが起動してバックグラウンドで画像をダウンロードし、完了後にImageViewへ表示します。処理中はプログレスダイアログが表示される仕組みです。

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.support.design.widget.CoordinatorLayout;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
public class MainActivity extends AppCompatActivity {
    Context context;
    Activity activity;
    CoordinatorLayout coordinatorLayout;
    Button button;
    ProgressDialog mProgressDialog;
    ImageView mImageView;
    URL url;
    AsyncTask mMyTask;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        context = getApplicationContext();
        activity = MainActivity.this;
        coordinatorLayout = findViewById(R.id.coordinatorLayout);
        button = findViewById(R.id.btnDownload);
        mImageView = findViewById(R.id.imageView);
        mProgressDialog = new ProgressDialog(activity);
        mProgressDialog.setIndeterminate(true);
        mProgressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
        mProgressDialog.setTitle("AsyncTask");
        mProgressDialog.setMessage("Please wait, we are downloading your image file...");
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                mMyTask = new DownloadTask().execute(stringToURL());
            }
        });
    }
    private class DownloadTask extends AsyncTask<URL,Void,Bitmap>{
        protected void onPreExecute(){
            mProgressDialog.show();
        }
        protected Bitmap doInBackground(URL...urls){
            URL url = urls[0];
            HttpURLConnection connection = null;
            try{
                connection = (HttpURLConnection) url.openConnection();
                connection.connect();
                InputStream inputStream = connection.getInputStream();
                BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
                return BitmapFactory.decodeStream(bufferedInputStream);
            }catch(IOException e){
                e.printStackTrace();
            }
            return null;
        }
        // すべての非同期処理が完了したときに呼ばれる
        protected void onPostExecute(Bitmap result){
            // プログレスダイアログを閉じる
            mProgressDialog.dismiss();
            if(result!=null){
                mImageView.setImageBitmap(result);
            } else {
                // ダウンロード中にエラーが発生したことをユーザーに通知
                Toast.makeText(MainActivity.this, "Error", Toast.LENGTH_SHORT).show();
            }
        }
    }
    protected URL stringToURL() {
        try {
            url = new URL("https://wallpapersite.com/images/pages/pic_w/6408.jpg");
            return url;
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
        return null;
    }
}

手順4:AndroidManifest.xml にパーミッションを追加する

ネットワーク通信とストレージへのアクセスが必要なため、androidManifest.xml に以下の権限を追加します。これを忘れるとアプリがクラッシュするので注意してください。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android" package="app.com.sample">
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.INTERNET"/>
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

アプリを実行して動作を確認する

それでは、アプリを実行してみましょう。実機のAndroidスマートフォンをパソコンに接続していることを前提に説明します。Android Studioからプロジェクトのアクティビティファイルを開き、ツールバーの「Run」アイコンをクリックします。接続したデバイスを選択して実行すると、スマートフォンの画面に以下のように表示されます。

Androidで指定したURLから画像をダウンロードして表示する方法を徹底解説


Androidで指定したURLから画像をダウンロードして表示する方法を徹底解説

補足:最新のAndroid開発における注意点

本記事のコードは学習用のシンプルな例ですが、AsyncTaskはAPIレベル30(Android 11)で非推奨となっている点に注意してください。現在の開発では、以下の代替手段が推奨されています。

  • コルーチン(Kotlin Coroutines):Kotlinでの非同期処理の標準的な手法
  • ExecutorService:Javaでスレッド管理を行う場合の選択肢
  • WorkManager:バックグラウンドでの確実な実行が必要な処理に最適

また、画像のダウンロードと表示を頻繁に行う場合は、GlideCoilなどの画像ライブラリを利用すると、キャッシュ管理やメモリ最適化が自動的に行われるため、より効率的に開発できます。

  1. AndroidでTwitter(X)のGIFを保存する方法【アプリ・サイト別に解説】

    Twitter(現X)は、単なるSNSの枠を超え、世界で起きている出来事の情報収集だけでなく、企業や有名人、政治家、学生など、さまざまな人々が意見を発信・拡散するためのプラットフォームとして活用されています。このミニブログサービスでは、一般ユーザーでもTwitterハンドル(ユーザー名)を使ってメンションするだけで、著名人と直接やり取りすることも可能です。 Twitter上では、動画や写真から、今や大人気のGIFやミームまで、あらゆる形式のメディアが投稿されています。発音をめぐる議論はさておき、こうした短い動画クリップが、長文の文章に代わって感情や考えを伝える手段として定着しつつあるのは間違い

  2. AndroidでTwitter・Instagramの動画をダウンロードする方法を徹底解説

    SNSは、友人や家族とのつながりを保つための最も便利な手段のひとつです。Twitter(現X)やInstagramのタイムラインには、毎日膨大な数の写真や動画が投稿されています。しかし、残念ながらどちらのプラットフォームにも、動画を直接ダウンロードする機能は備わっていません。気になる動画を後でもう一度視聴したい場合は、ブックマークや「いいね」で保存できますが、端末本体に動画データを残したいときは、専用のダウンローダーアプリが必要になります。 この記事では、AndroidスマートフォンでTwitterとInstagramの動画をダウンロードする具体的な手順を、画像付きでわかりやすく解説します。