目次

インターネット、Webにあるファイルを取得する (HTTPによるファイル取得) - Android

AndroidアプリケーションからWebにあるファイルを取得します。

注意

Android4でこの記事のコードを実行すると、"android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork"エラーが発生し動作しません。Android4でWebのファイルを取得する方法はこちらの記事を参照してください。

アプリケーション作成情報

  • ProjectName : HttpAccess
  • ApplicationName : HttpAccess
  • PackageName : iPentec.HttpAccess
  • Activity : HttpAccessActivity
  • Androidのバージョンは2.3.3にしました

UI

下図のUIを作成します。Buttonを1つ、TextViewを1つ配置します。Buttonの[OnClick]プロパティに[onClick_button1]を設定します。


パーミッションの設定

以下の手順で"android.permission.INTERNET"パーミッションを追加します。
EclipseでAndroidManifest.xmlを開きます。編集ウィンドウが表示されますので、下部の[Permissions]タブをクリックします。[Android Manigest Permissions]画面が表示されますので画面内の[Add...]ボタンを押します。


追加する要素を選択するダイアログが開きます。[Uses Permission]を選択し[OK]ボタンを押します。


[Uses Permission]が一覧に追加されます。


右側の[Name]コンボボックスを開きます。一覧から"android.permission.INTERNET"を選択します。




AndroidManifest.xmlに以下のタグが追加されます。
<uses-permission android:name="android.permission.INTERNET"/>


コード

以下のコードを実装します。
HttpAccessActivity.java
package iPentec.HttpAccess;

import android.app.Activity;
import android.os.Bundle;
import android.view.*;
import android.widget.TextView;

import org.apache.http.*;
import org.apache.http.util.*;
import org.apache.http.impl.client.*;
import org.apache.http.client.methods.*;

public class HttpAccessActivity extends Activity {
  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
  }

  public void onClick_button1(View view) {
    try {
      String url = "http://www.ipentec.com/document/";
      HttpGet httpGet = new HttpGet(url);

      DefaultHttpClient httpClient = new DefaultHttpClient();
      httpGet.setHeader("Connection", "Keep-Alive");

      HttpResponse response = httpClient.execute(httpGet);
      int status = response.getStatusLine().getStatusCode();
      if (status != HttpStatus.SC_OK) {
        throw new Exception("");
      } else {
        String receive = EntityUtils.toString(response.getEntity(), "UTF-8");
        TextView textView1 = (TextView) findViewById(R.id.textView1);
        textView1.setText(receive);
      }
    } catch (Exception e) {
      return;
    }
  }
}

解説

org.apache.httpの名前空間をインポートします。
import org.apache.http.*;
import org.apache.http.util.*;
import org.apache.http.impl.client.*;
import org.apache.http.client.methods.*;

URLからHttpGetクラスのインスタンスを作成します。
  String url = "http://www.ipentec.com/document/";
  HttpGet httpGet = new HttpGet(url);

DefaultHttpClientのインスタンスを作成します。
  DefaultHttpClient httpClient = new DefaultHttpClient();

HttpGetクラスのインスタンスのsetHeaderメソッドを呼び出し、ヘッダを設定します。
  httpGet.setHeader("Connection", "Keep-Alive");

DefaultHttpClientクラスのexecuteメソッドを呼び出しHttpでアクセスします。引数にはHttpGetクラスのインスタンスを与えいます。Httpのレスポンスは戻り値のHttpResponseクラスに格納されます。
  HttpResponse response = httpClient.execute(httpGet);

HttpResponseのステータスコードを取得します。
  int status = response.getStatusLine().getStatusCode();

ステータスコードがOKでない場合は例外を発生させます。ステータスコードがOKの場合はHttpレスポンスのデータをtextViewに表示します。テキストの文字コード変換はEntityUtils.toString()メソッドを用います上記のコードではHTTPで取得したテキストがUTF-8として、テキストを変換します。
  if (status != HttpStatus.SC_OK) {
    throw new Exception("");
  } else {
    String receive = EntityUtils.toString(response.getEntity(), "UTF-8");
    TextView textView1 = (TextView) findViewById(R.id.textView1);
    textView1.setText(receive);
  }

実行結果

アプリケーションを起動します。下図の画面が表示されます。


Buttonを押します。HTTPで指定のURLにアクセスし取得したHTMLをTextViewに表示します。


補足
上図の実行結果は日本語文字が文字化けしています。これは、shift-JISのコードをUTF-8として変換したためです。文字化けを防ぐためには
String receive = EntityUtils.toString(response.getEntity(), "UTF-8");
String receive = EntityUtils.toString(response.getEntity(), "shift_jis");
にします。


著者
iPentecのプログラマー、最近はAIの積極的な活用にも取り組み中。
とっても恥ずかしがり。
最終更新日: 2024-01-04
作成日: 2011-10-24
iPentec all rights reserverd.