Pobranie źródła strony

0

Witam,
Chciałbym pobrać zawartość strony i wydobyć z niej jedną wartość. Pogrzebałem nieco w necie i znalazłem kilka przykładów jak się do tego zabrać. Niestety po mimo iż przykładów jest sporo, żaden z nich nie chce zadziałać i przestaje działać na tym samym etapie. Dodam tylko iż korzystam z Android Studio 1.4. Poniżej zamieszczam jeden z przykładowych programów:

package com.aszejda.goldcalc;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class GoldCalculator extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_gold_calculator);

        Button next = (Button) findViewById(R.id.button1);
        next.setOnClickListener(new View.OnClickListener() {

            public void onClick(View view) {
                try {
                    String x = pobierz("http://www.google.pl");
                    Toast.makeText(getApplicationContext(), x, Toast.LENGTH_LONG).show();
                } catch (MalformedURLException e) {
                    Toast.makeText(getApplicationContext(), (CharSequence) e, Toast.LENGTH_LONG).show();
                } catch (IOException e) {
                    Toast.makeText(getApplicationContext(), (CharSequence) e, Toast.LENGTH_LONG).show();

                }
            }
        });
    }
    public static String pobierz(String link) throws MalformedURLException, IOException {
        String source = "";
        URL akt = new URL(link);
        BufferedReader in = new BufferedReader(new InputStreamReader(akt.openStream(), "utf-8"));  // <--- tu program postanawia przerwać swoją dalszą pracę w metodzie i przeskakuje do etapu catch  (IOException e)
        String linia;
        while ((linia = in.readLine()) != null) {
            source += linia + "\n";
        }
        in.close();
        return source;
    }

}

Podobny kod który nie działa pod androidem, odpalany w NetBeans jako zwykła aplikacja java zadziałał bez problemu:


import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.HttpURLConnection;
import java.net.URL;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

public class Main extends JFrame {
  JButton go = new JButton("Get Source");

  JTextArea codeArea = new JTextArea();

  public Main() {
    JPanel inputPanel = new JPanel(new BorderLayout(3, 3));
    go.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        try {
          URL pageURL = new URL("http://www.google.com");
          HttpURLConnection urlConnection = (HttpURLConnection) pageURL.openConnection();
          int respCode = urlConnection.getResponseCode();
          String response = urlConnection.getResponseMessage();
          codeArea.setText("HTTP/1.x " + respCode + " " + response + "\n");
          int count = 1;
          while (true) {
            String header = urlConnection.getHeaderField(count);
            String key = urlConnection.getHeaderFieldKey(count);
            if (header == null || key == null) {
              break;
            }
            codeArea.append(urlConnection.getHeaderFieldKey(count) + ": " + header + "\n");
            count++;
          }
          InputStream in = new BufferedInputStream(urlConnection.getInputStream());
          Reader r = new InputStreamReader(in);
          int c;
          while ((c = r.read()) != -1) {
            codeArea.append(String.valueOf((char) c));
          }
          codeArea.setCaretPosition(1);
        } catch (Exception ee) {
        }
      }
    });
    inputPanel.add(BorderLayout.EAST, go);
    JScrollPane codeScroller = new JScrollPane(codeArea);
    add(BorderLayout.NORTH, inputPanel);
    add(BorderLayout.CENTER, codeScroller);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setSize(700, 500);
    this.setVisible(true);
  }

  public static void main(String[] args) {
    JFrame webPageSourceViewer = new Main();
  }
}

0

Zgaduję, że jest jakiś problem z połączeniem.
A tak w ogóle to przydałoby się chociaż przytoczyć jaki wyjątek jest wyrzucany.

1

Robisz to w głównym wątku. Niestety Android na to niepozwala i operacje takie jak połączenie z internetem muszą odbywać się w osobnym wątku. Masz uprawnienia w Manifeście?

0

Strzał w dziesiątkę. Brakowało uprawnienia + połączenie trzeba było przenieść do innego wątku. Oczywiście mam teraz problem z wydobyciem pobranego kodu html ale tu chyba muszę poczytać o callable.

Wielkie dzięki za pomoc.

1 użytkowników online, w tym zalogowanych: 0, gości: 1