2016년 5월 30일 월요일

Android Studio : 웹페이지 읽어 오기.

안드로이드에선 http 통신으로 웹페이지를 읽어오는 방법이 많이 있다.
대부분은 외부 라이브러리를 사용하는 방법인데, 그만큼 기본으로 제공하는 기능이 많이 빈약하기 때문.

하지만, 가급적이면 외부 라이브러리 없이 구현.

일단 기본 틀은 이전에 작업했던 폼을 사용.

리스트 뷰 사용 : http://son10001.blogspot.kr/2016/05/android-studio-listview.html


여기다 버튼을 하나 추가해서 기능을 구현해 본다.


버튼을 하나 추가해 놓고...


메인 액티비티에 클릭 이벤트 등록해 놓고...


클릭 이벤트 리스너와 웹 페이지 조회 루틴 작성.


package com.son10001.formbasic;

import android.os.AsyncTask;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;

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 class BasicActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_basic);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });

        String[] names = {"Item01", "Item02", "Item03", "Item04", "Item05"};
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, names);

        ListView listView = (ListView) findViewById(R.id.listView);
        listView.setAdapter(adapter);

        // 클릭이벤트
        findViewById(R.id.btnGetWeb).setOnClickListener(mClickListener);

    }

    Button.OnClickListener mClickListener = new View.OnClickListener() {
        public void onClick(View v) {
            try {
                new HttpUtil().execute();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    };

    private URL Url;
    private String strUrl,strCookie,result;

    public class HttpUtil extends AsyncTask<Void, Void, Void> {
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            strUrl = "http://192.168.0.181:916/gettest.aspx";
        }

        @Override
        protected Void doInBackground(Void... voids) {
            try{
                Url = new URL(strUrl);
                HttpURLConnection conn = (HttpURLConnection) Url.openConnection();
                conn.setRequestMethod("GET"); // get방식 통신
                conn.setDoOutput(true); 
                conn.setDoInput(true);
                conn.setUseCaches(false);
                conn.setDefaultUseCaches(false);

                strCookie = conn.getHeaderField("Set-Cookie");
                InputStream is = conn.getInputStream();

                StringBuilder builder = new StringBuilder();
                BufferedReader reader = new BufferedReader(new InputStreamReader(is,"UTF-8"));
                String line;

                while ((line = reader.readLine()) != null) {
                    builder.append(line+ "\n");
                }

                result = builder.toString();
            }catch(MalformedURLException | ProtocolException exception) {
                exception.printStackTrace();
            }catch(IOException io){
                io.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(Void aVoid) {
            super.onPostExecute(aVoid);
            System.out.println(result);
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_basic, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();

        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}


여기까지 작성되었으면...
AndroidManifest.xml 에 인터넷 접속 가능 속성 지정.


<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />


이제 실행을 해보면...


이렇게 버튼을 클릭 할때 마다 지정한 웹 페이지의 내용을 로그로 출력해 준다.