質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.20%

androidでwebサイトのhtml文の取得ができない(いい方法を教えてください)

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,655
退会済みユーザー

退会済みユーザー

前提・実現したいこと

androidでwebサイトのhtml文(<html>...</html>)の取得をしたいと思い、以下のプログラムを実行したのですが、以下のエラーメッセージがでてきます。
エラーメッセージはHttpGetTaskクラスのcon.connect();で発生しています。
いろいろなサイトのものを実行してみましたが、全てここでエラーが出てしまいます。
原因としてなにが考えられるでしょうか。
よろしくお願いします。

今回の私の目的の場合、特定のwebサイトのhtml文をそのまま取得できればいいので
このプログラムでなくても、もっと簡単なプログラムサンプルがなどあれば教えてください。

参考url
http://www.programing-style.com/android/android-api/android-httpurlconnection-file-download/

発生している問題・エラーメッセージ

/////////////////emulaterでやったとき/////////////////
11-05 03:19:03.545 15936-15951/com.example.asd.sukureipinngu3 E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1
                                                                                   Process: com.example.asd.sukureipinngu3, PID: 15936
                                                                                   java.lang.RuntimeException: An error occurred while executing doInBackground()
                                                                                       at android.os.AsyncTask$3.done(AsyncTask.java:325)
                                                                                       at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354)
                                                                                       at java.util.concurrent.FutureTask.setException(FutureTask.java:223)
                                                                                       at java.util.concurrent.FutureTask.run(FutureTask.java:242)
                                                                                       at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:243)
                                                                                       at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
                                                                                       at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
                                                                                       at java.lang.Thread.run(Thread.java:761)
                                                                                    Caused by: java.lang.NullPointerException: charsetName
                                                                                       at java.io.InputStreamReader.<init>(InputStreamReader.java:99)
                                                                                       at com.example.asd.sukureipinngu3.HttpGetTask.doInBackground(HttpGetTask.java:42)
                                                                                       at com.example.asd.sukureipinngu3.HttpGetTask.doInBackground(HttpGetTask.java:19)
                                                                                       at android.os.AsyncTask$2.call(AsyncTask.java:305)
                                                                                       at java.util.concurrent.FutureTask.run(FutureTask.java:237)
                                                                                       at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:243) 
                                                                                       at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133) 
                                                                                       at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607) 
                                                                                       at java.lang.Thread.run(Thread.java:761//////////実機でやったとき(実機でのエラーの見方が正しいかわかりません)////////////
11-06 02:23:59.651 13810-13883/com.example.asd.sukureipinngu3 E/HAL: load: id=gralloc != hmi->id=gralloc

ソースコードMainActivity.java

package com.example.asd.sukureipinngu3;

import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

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

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

        try {
            new HttpGetTask().execute(new URL("http://www.yahoo.co.jp/"));
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
    }
}

ソースコードHttpGetTask.java

package com.example.asd.sukureipinngu3;

/**
 * Created by asd on 2016/11/05.
 */

import android.os.AsyncTask;
import android.util.Log;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.URL;

public final class HttpGetTask extends AsyncTask<URL, Void, String> {

    @Override
    protected String doInBackground(URL... urls) {
        // 取得したテキストを格納する変数
        final StringBuilder result = new StringBuilder();
        // アクセス先URL
        final URL url = urls[0];

        HttpURLConnection con = null;
        try {
            // ローカル処理
            // コネクション取得
            con = (HttpURLConnection) url.openConnection();
            con.connect();

            // HTTPレスポンスコード
            final int status = con.getResponseCode();
            if (status == HttpURLConnection.HTTP_OK) {
                // 通信に成功した
                // テキストを取得する
                final InputStream in = con.getInputStream();
                final String encoding = con.getContentEncoding();
                final InputStreamReader inReader = new InputStreamReader(in, encoding);
                final BufferedReader bufReader = new BufferedReader(inReader);
                String line = null;
                // 1行ずつテキストを読み込む
                while((line = bufReader.readLine()) != null) {
                    result.append(line);
                }
                bufReader.close();
                inReader.close();
                in.close();
            }

        } catch (MalformedURLException e1) {
            e1.printStackTrace();
        } catch (ProtocolException e1) {
            e1.printStackTrace();
        } catch (IOException e1) {
            e1.printStackTrace();
        } finally {
            if (con != null) {
                // コネクションを切断
                con.disconnect();
            }
        }
        return result.toString();
    }
}

試したこと

課題に対してアプローチしたことを記載してください

補足情報(言語/FW/ツール等のバージョンなど)

より詳細な情報

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • yona

    2016/11/06 12:18

    ログを省略せずに全て追記してください。

    キャンセル

  • KSwordOfHaste

    2016/11/06 21:10

    例外発生時のバックトレースが取得できているところまではいいと思います。ぜひそのバックトレースから「何を読み取ったか」を書いてほしいです。もしバックトレースから何も情報が得られないのであれば、本件の問題の原因より先にバックトレースの読み方を知る方が質問者さんにとって役立つはずと思います。

    キャンセル

回答 1

0

このエラーは?です
ただ、このコードでの問題点は
http://www.yahoo.co.jp/
へのアクセスでは

getContentEncoding()


はnullが返ってくると思いますので、そこで止まるのではないかと思います。
決め打ちで文字コードをutf-8にしてみたらどうでしょうか

InputStreamReader inReader = new InputStreamReader(in, "utf-8");

ただ、文字コードを取り出すには以下のような手順が必要だと思います。
https://groups.google.com/forum/#!topic/android-group-japan/7R-lmT3crwY

色んなページを扱いたい場合は「HTTP ヘッダ」または「metaタグ」のキャラクタセットを取得して処理する必要があります。
優先順位は
1.HTTP ヘッダの情報
2.mata タグの情報
3.上記以外は「UTF-8」として扱う
が、正しい形になると思います。
上記手順で化ける場合は、元のホームページが不正な状態ということで諦めるしかありません。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.20%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる