data.go.kr 이용 해외 현지 연락처 보기
- data.go.kr에서 현지 연락처 등록
- 이름 : 현지 연락처
- 서비스 유형 : REST
- 분류 : 문화체육관광 > 관광
- 제공기관 : 외교부
- 새프로젝트 생성(소스코드 : googledrive/소스코드/WhanDataGoKr.zip)
- Target Android Devices : Phone and Table(API 15 이상 선택)
- Add and Activity to Mobile : Navigation Drawer Activity
- /layout/content_main.xml 수정
12345678910111213141516171819202122<?xml version="1.0" encoding="utf-8"?><android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:ads="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"app:layout_behavior="@string/appbar_scrolling_view_behavior"tools:context="kr.co.moak.proj001address.MainActivity"tools:showIn="@layout/app_bar_main"><FrameLayoutandroid:id="@+id/container"android:layout_width="0dp"android:layout_height="0dp"app:layout_constraintBottom_toTopOf="parent"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent"></FrameLayout></android.support.constraint.ConstraintLayout>- TextView를 삭제하고 FrameLayout을 추가
- FrameLayout의 id를 container로 지정
- MainActivity.java : ft.replace(R.id.container, fragRegister);와 같이 ft.replace()에서사용
- layout_width : match_parent
- layout_height : match_parent
- /menu/activity_main_drawer.xml 수정
1234567891011121314151617181920212223242526272829303132333435363738<?xml version="1.0" encoding="utf-8"?><menu xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"tools:showIn="navigation_view"><group android:checkableBehavior="single"><itemandroid:id="@+id/nav_overseas"android:icon="@drawable/ic_menu_camera"android:title="해외 현지 연락처" /><itemandroid:id="@+id/nav_gallery"android:icon="@drawable/ic_menu_gallery"android:title="Gallery" /><itemandroid:id="@+id/nav_slideshow"android:icon="@drawable/ic_menu_slideshow"android:title="Slideshow" /><itemandroid:id="@+id/nav_manage"android:icon="@drawable/ic_menu_manage"android:title="Tools" /></group><item android:title="Communicate"><menu><itemandroid:id="@+id/nav_share"android:icon="@drawable/ic_menu_share"android:title="Share" /><itemandroid:id="@+id/nav_send"android:icon="@drawable/ic_menu_send"android:title="Send" /></menu></item></menu> - Androidmanifest.xml 에 Internet 사용 허가 요청
1234567891011121314151617181920212223242526<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"package="kr.co.moak.datagokr"><uses-permission android:name="android.permission.INTERNET"/><applicationandroid: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"><activityandroid:name=".MainActivity"android:label="@string/app_name"android:theme="@style/AppTheme.NoActionBar"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application></manifest> - /values/strings.xml 에 국가 코드 추가
123456789<string-array name="national_code"><item>GHA 가나</item><item>ESP 스페인</item><item>AND 안도라</item><item>IRQ 이라크</item><item>JPN 일본</item><item>HKG 홍콩</item>.....</string-array> - /layout/frag_overseas.xml 생성
123456789101112131415161718<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical" android:layout_width="match_parent"android:layout_height="match_parent"><Spinnerandroid:id="@+id/spinner"android:layout_width="match_parent"android:layout_height="wrap_content"android:entries="@array/national_code" /><WebViewandroid:id="@+id/webView"android:layout_width="match_parent"android:layout_height="match_parent" ></WebView></LinearLayout> - FragOverseas.java 생성
12345678910public class FragOverseas extends android.support.v4.app.Fragment {@Nullable@Overridepublic View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {View view = inflater.inflate(R.layout.frag_overseas, container, false);return view;}} - MainActivity.java의 onNavigationItemSelected() 메서드 수정
1234567891011121314151617181920@SuppressWarnings("StatementWithEmptyBody")@Overridepublic boolean onNavigationItemSelected(MenuItem item) {// Handle navigation view item clicks here.int id = item.getItemId();android.support.v4.app.FragmentTransaction ft = getSupportFragmentManager().beginTransaction();Fragment fragment = null;if (id == R.id.nav_overseas) {fragment = new FragOverseas();ft.replace(R.id.container, fragment);ft.commit();} else if (id == R.id.nav_camera) {}DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);drawer.closeDrawer(GravityCompat.START);return true;} - MyConst.java에 data.go.kr에서 부여받은 DATA_KEY 등록
123public class MyConst {public static final String DATA_KEY="본인이 부여받은 키 입력";} - FragOverseas.java 수정
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677public class FragOverseas extends Fragment {WebView m_webView = null;Spinner m_spinner;@Nullable@Overridepublic View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {View view = inflater.inflate(R.layout.frag_overseas, container, false);m_webView = (WebView)view.findViewById(R.id.webView);m_spinner = (Spinner)view.findViewById(R.id.spinner);m_spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {@Overridepublic void onItemSelected(AdapterView<?> parent, View view, int position, long id) {String strUrl = "http://apis.data.go.kr/1262000/ContactService/getContactList?"+ "ServiceKey=" + MyConst.DATA_KEY+ "&isoCode1=" + Uri.encode(m_spinner.getSelectedItem().toString().substring(0,3));Log.v("MYTAG", strUrl);new MyAsyncTask(getContext()).execute(strUrl);}@Overridepublic void onNothingSelected(AdapterView<?> parent) {}});return view;}private class MyAsyncTask extends AsyncTask<String, Integer, Document> {private Context m_context;public MyAsyncTask(Context context){this.m_context = context;}@Overrideprotected void onPreExecute() {super.onPreExecute();}@Overrideprotected Document doInBackground(String... urls) {URL url;Document doc = null;try{url = new URL(urls[0]);DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();DocumentBuilder db = dbf.newDocumentBuilder();doc = db.parse(new InputSource(url.openStream()));doc.getDocumentElement().normalize();}catch (Exception e){Log.v("MYTAG", "Parsing Error");}return doc;}@Overrideprotected void onPostExecute(Document doc) {NodeList nodeList = doc.getElementsByTagName("contact");String data = "정보가 없습니다";try {data = nodeList.item(0).getTextContent().toString();}catch (Exception e){}Log.v("MYTAG", data);m_webView.setWebViewClient(new WebViewClient());//webView.loadUrl("http://www.moak.co.kr");m_webView.loadData(data, "text/html; charset=utf-8", null);}}}- Uri.encode() : 파라미터로 한글 등을 보낼 때 URI 형식으로 변환
- <String, Integer, Document> : Document doInBackground(String)
- 첫번째 String : doInBackground()에서 받는 매개변수 타입
- 두번째 Integer : onProgressUpdate()에서 사용할 변수 타입
- 세번째 Document : doInBackground()의 리턴 타입
- onPreExecute() : 백그라운드 작업을 수행하기 전에 호출
- onProgressUpdate() :
- 백그라운드 작업의 진행 상태를 표시하기 위해 호출
- 작업 수행 중간 중간에 UI 객체에 접근하는 경우에 사용
- 작업 중간에 publishProgress()를 호출하면 실행 됨
- doInBackground() :
- 새로 만든 스레드에서 백그라운드 작업을 수행
- excute(인수1, 인수2,…)의 인수들을 배열로 전달받음
- new MyAsyncTask(getContext()).execute(strUrl);
- strUrl을 urls[0]로 받음
- onPostExecute()
- 백그라운드 작업이 끝난 후 호출
- 메인 스레드에서 실행되며 전송받은 내용을 레이아웃에 나타내거나 DB에 저장 등의 작업을 수행
- 전송된 XML을 onPostExecute()에서 파싱하여 화면 출력
- 전송된 XML
- onPostExecute() 처리
123456789101112131415@Overrideprotected void onPostExecute(Document doc) {NodeList nodeList = doc.getElementsByTagName("contact");String data = "정보가 없습니다";try {data = nodeList.item(0).getTextContent().toString();}catch (Exception e){}Log.v("MYTAG", data);m_webView.setWebViewClient(new WebViewClient());//webView.loadUrl("http://www.moak.co.kr");m_webView.loadData(data, "text/html; charset=utf-8", null);}- NodeList nodeList = doc.getElementsByTagName(“contact”);
- XML에서 <contact>…</contact>를 찾아서 List로 읽어옮
- 위 그림에서는 <contact>…</contact>가 2개 있으므로 List에는 2개 저장됨
- data = nodeList.item(0).getTextContent().toString();
- List의 첫(0)번째의 Text를 읽어와서 문자열로 바꿔 data에 입력
- NodeList nodeList = doc.getElementsByTagName(“contact”);
- 전송된 XML
- 또 다른 XML을 onPostExecute()에서 파싱하여 화면 출력 예
- 전송된 XML
- onPostExecute() 처리
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849@Overrideprotected void onPostExecute(Document doc) {ArrayList<AtmDTO> arList = new ArrayList<AtmDTO>();NodeList nodeList = doc.getElementsByTagName("list");try {for(int i=0; i<nodeList.getLength(); i++) {String baseDate = "";String insArea = "";String newAddr = "";String oldAddr = "";String operTime = "";Node node = nodeList.item(i).getFirstChild();while (node != null) {switch (node.getNodeName().toLowerCase()){//소문자로 변경case "basedate" :baseDate = node.getTextContent().toString();break;case "insarea" :insArea = node.getTextContent().toString();break;case "newaddr" :newAddr = node.getTextContent().toString();break;case "oldaddr" :oldAddr = node.getTextContent().toString();break;case "opertime" :operTime = node.getTextContent().toString();break;}node = node.getNextSibling();}Log.v("MYTAG", i + " " + baseDate + " " + insArea + " " + newAddr + " " + oldAddr + " " + operTime);AtmDTO dto = new AtmDTO(i, baseDate, insArea, newAddr, oldAddr, operTime);arList.add(dto);}}catch (Exception e){Log.v("MYTAG", "오류 발생");}AtmAdapter adapter = new AtmAdapter(getContext(), arList);m_listView.setAdapter(adapter);Log.v("MYTAG", "목록 개수 : "+arList.size());}- NodeList nodeList = doc.getElementsByTagName(“list”);
- XML에서 <list>…</list>를 찾아서 List로 읽어옮
- 위 그림에서는 <list>…</list>가 1개 있으므로 List에는 1개 저장됨
- Node node = nodeList.item(0).getFirstChild();
- List의 첫(0)번째의 첫번째 자식을 읽어서 node에 입력
- baseDate = node.getTextContent().toString();
- node의 Text를 읽어와서 문자열로 바꿔 data에 입력
- AtmDTO dto = new AtmDTO(i, baseDate, insArea, newAddr, oldAddr, operTime);
- 읽어들인 값들을 dto에 입력
- arList.add(dto);
- dto를 ArrayList에 추가
- AtmAdapter adapter = new AtmAdapter(getContext(), arList);
m_listView.setAdapter(adapter);- ListView에 연결
- NodeList nodeList = doc.getElementsByTagName(“list”);
- 전송된 XML