서울 열린데이터광장에서 발급받은 Open API 인증키로 Android 에서 호출해볼 수 있는 앱을 간단하게 만들어보았다.

이런 꿀 정보를 제공하는 앱들은 이미 많지 않을까라는 생각이 들지만,,

UI 를 이쁘게 만들어서 앱 출시를 해봐도 좋을 것 같다..ㅎㅎ

 

Open API 인증키 발급 정보는 아래 링크에서 확인!

https://mkdevlab.tistory.com/15

 

서울열린데이터 광장 API 인증키 발급

1. 서울 열린데이터 광장 로그인 https://data.seoul.go.kr/index.do 열린데이터광장 메인 데이터분류,데이터검색,데이터활용 data.seoul.go.kr 2. 인증키 정보 발급 받은 인증키는 '서울시 문화 행사 정보' 다.

mkdevlab.tistory.com

 

사용 Tool : Android Studio

1. Android Studio 에서 project 를 하나 생성한다.

OpenApiSample01 로 하나 만듦.

 

2. AndroidManifest.xml 수정

인터넷 사용이 필요하기 때문에 아래 권한을 manifest 하위에 추가 함.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.mkdevlab.openapisample01">

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

    ...생략...
    
</manifest>

3. 조회 화면 구성

RecyclerView 를 사용하여 간단하게 작성하였다.

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:layout_editor_absoluteX="1dp"
        tools:layout_editor_absoluteY="1dp"
        tools:ignore="MissingConstraints" />
</androidx.constraintlayout.widget.ConstraintLayout>

아이템이 구성 레이아웃은 다음과 같이 간단하게 작성

<item_event.xml>

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:paddingHorizontal="20dp"
    android:paddingVertical="10dp">

    <TextView
        android:id="@+id/date"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentStart="true"
        android:text="날짜"/>

    <TextView
        android:id="@+id/code_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentEnd="true"
        android:text="전시종"/>

    <TextView
        android:id="@+id/event_title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/code_name"
        android:paddingVertical="10dp"
        android:text="제목"
        android:lines="1"
        android:textSize="18sp"
        android:textStyle="bold"/>

    <View
        android:layout_width="match_parent"
        android:layout_height="0.5dp"
        android:layout_marginTop="10dp"
        android:background="@android:color/darker_gray"
        android:layout_below="@+id/event_title"/>
</RelativeLayout>

아래와 같은 레이아웃이다..

맨 아래 결과를 보면 이해가 더 쉬울 것이다..

 

4. 조회 코드 작성

RecyclerView 를 사용하고 있기 때문에 별도 커스텀 Adapter 를 만들어서 View 에 데이터를 보여주게끔 하였다.

Open API URL 를 조회하는 자바 코드는 다음과 같다.

 

urlAddress 에 사용된 URL 및 KEY 정보는 상수로 만들어져있다.

코드를 작성하면서 return 되는 값을 그때그때 확인하기 위해 log 를 남겨보았다.

public void fetch() {

        Log.d("main", "fetch() started::");

        String urlAddress = URL_1 + KEY + URL_2;

        new Thread() {
            @Override
            public void run() {
                super.run();

                try {
                    URL url = new URL(urlAddress);

                    InputStream is = url.openStream();
                    InputStreamReader isr = new InputStreamReader(is);
                    BufferedReader reader = new BufferedReader(isr);

                    StringBuffer buffer = new StringBuffer();
                    String line = reader.readLine();
                    while(line != null){
                        buffer.append(line + "\n");
                        line = reader.readLine();
                    }
                    String jsonData = buffer.toString();

                    JSONObject obj = new JSONObject(jsonData);

                    JSONObject culturalEventInfo = (JSONObject) obj.get("culturalEventInfo");

                    JSONObject result = (JSONObject) culturalEventInfo.get("RESULT");

                    //Log.d("main","result : " + result);
                    Log.d("main","code : " + result.get("CODE"));
                    Log.d("main","message : " + result.get("MESSAGE"));

                    JSONArray rowArray = culturalEventInfo.getJSONArray("row");

                    Log.d("main", "row : "  + rowArray);

                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {

                            try {

                                for (int i = 0; i < rowArray.length(); i++){
                                    JSONObject tempOjb = rowArray.getJSONObject(i);
                                    String codeName = tempOjb.getString("CODENAME");
                                    String title = tempOjb.getString("TITLE");
                                    String place = tempOjb.getString("PLACE");
                                    String date = tempOjb.getString("DATE");
                                    String useTarget = tempOjb.getString("USE_TRGT");
                                    String useFee = tempOjb.getString("USE_FEE");
                                    String orgLink = tempOjb.getString("ORG_LINK");
                                    String mainImg = tempOjb.getString("MAIN_IMG");

                                    //Log.d("main", "row : " + i + ", codeName : " + codeName + ", title : " + title);
                                    EventData eventData = new EventData(codeName, title, place, date, useTarget, useFee, orgLink, mainImg);
                                    list.add(eventData);
                                }

                                eventAdapter.setEventList(list);

                                Log.d("main","list : " + list);

                            } catch (JSONException e) {
                                e.printStackTrace();
                            }
                        }
                    });


                } catch (IOException | JSONException e) {
                    e.printStackTrace();
                }

            }
        }.start();

    }

 

5. Emulator 를 실행 후 결과

 

짠! 내가 구성한 item 레이아웃으로 결과가 조회된 것을 볼수 있다.

10개를 조회했기 때문에 아래로 스크롤도 가능하다.

 

이제 각 item을 클릭했을 때 자세한 정보를 보여줄 수 있는 화면을 하나 만들어봐야겠다.

'개발이야기 > Android 개발' 카테고리의 다른 글

클래식 숫자야구 게임  (0) 2022.04.03

친구랑 수첩에 적어서 플레이하던 추억 속의.. 숫자야구를 앱으로 만들어봤다.

(1년이 넘었지만...)

 

3 스트라이크가 정석이지만, 재미를 위해 4, 5 를 추가 했다..

 

게임 기록은 안드로이드에서 가볍게 사용할 수 있는 내부 DB.. SQLite 를 사용 함.

 

소스 코드는 다음에 기회가 되면 github에 올려야지~

https://play.google.com/store/apps/details?id=play.classic.baseballgameapp 

 

숫자야구 - Google Play 앱

숫자야구 게임

play.google.com

 

+ Recent posts