본문 바로가기
안드로이드 웹앱 콘테츠 개발자 양성(국비지원)/Open API

Android Studio Open API 3

by 차누감 2019. 9. 20.
반응형

 

영화진흥위원회에서 xml을 받아서 영화 순위를 보여주는 앱을 만들어 보자.

<실행 화면>

버튼을 누르면 가져온 API 정보를 화면에 보여준다.

일단 API를 찾는 방법을 알아보자.

보통은 구글에서 검색을 하자.

우리는 REST 방식이고
위 빨간색 박스 내용이 샘플키이다 우선 예제에서 저걸 사용하자 마지막 숫자를 보면 일일박스오피스 날짜를 의미한다.20120101

페이지 및에 보면 XML이 있다. 이걸 눌러보거나, 주소창에 복붙하면

마지막 날짜가2012년으로 되어 있어서 현재 날짜 전으로 바꿔보니 최신 내용 xml이 나온다.

일단 xml을 가져오기 전에 먼저 

 

AndroidManifest.xml에 이 코드를 작성해보자. (인터넷에 정보를 가져오는 것이라 무조건 저 한 줄을 써줘야함.. 다른 코드가 제대로해도 저 한줄을 안써주면 동작을 안한다.)

화면을 먼저 구성해보자.

activity_main.xml

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="16dp"
    tools:context=".MainActivity">
 
   <Button
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:text="load data from network"
       android:textAllCaps="false"
       android:onClick="clickBtn"/>
    <ListView
        android:id="@+id/listview"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        
    </ListView>
 
</LinearLayout>
 
 

화면 구성

main코드 작성 전에 어디서 xml을 가져오는지, 왜 주소 뒤에 ? key=...오는지 알고 보자.

처음에는 샘플주소로 해보고, 나중에 잘되면 키 값과 날짜를 변수로 만들어서 수정하기 쉽게 만들자.

아래 사진처럼 보라색 xml을 먼저 사용하고 잘되는것을 확인하면 이제 빨간색 네모처럼 만들어서 사용하자.

코드가 길어서 대략적인 순서를 말하면 (순서를 대략 말한것이라 정확한 코드는 아래 박스 전체코드를 보자)

버튼을 클릭했을때

1) 어드레드 변수에 복사해온 핑크색 내용을 준다.

 

2) 주소를 알았으니 URL객체를 만들어 스트림열고, InputStream에게 준다.

 

3)이 InputStream은 바이트 스트림(바이트씩 데이터 전송) 불편하므로 다시 문자 스트림으로InputStreamReader 으로 바꾼다.

 

4)바꾼 InputStreamReader을 XmlPullParser에 주면 끝난다. 그러나 그전에 XmlPullParser를 만들려면 

XmlPullParserFactory가 필요해서 팩토리를 먼저 만들고 XmlPullParser를 만든다.

그러면 결론 InputStreamReader을 XmlPullParser에 주면 끝난다.

 

5)XmlPullParser에 가져온 xml정보가 다 있다. 여기서 원하는 정보만 얻어서 StringBuffer에 저장했다가.

이 예제에서는 문자열로 바꾸어서 ArrayList<String>에 add() 시킨다.

 

6) adapter= new ArrayAdapter(this,android.R.layout.simple_list_item_1,ArrayList<String>);
//원래 layout .xml을 만들어야 하지만 예제이므로 안드로이에서 제공하는 것(android.R.layout.simple_list_item_1)을 사용
listView.setAdapter(adapter); 하면 화면에 표시된다.

(위에 6) 내용은 onCreate에 있으므로 버튼을 눌렀을때 화면이 바꿨다고 adapter.notifyDataSetChanged(); 써줘야 화면이 갱신이 된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
 
 
 
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;
 
 
public class MainActivity extends AppCompatActivity {
 
    //영화진흥위원회 통합전산망에서 발급받은 인증키
    String apiKey="430156241533f1d058c603178cc3ca0e";
 
    ListView listView;
    ArrayAdapter adapter;
 
    ArrayList<String> items=new ArrayList<String>();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        listView=findViewById(R.id.listview);
        adapter= new ArrayAdapter(this,android.R.layout.simple_list_item_1,items);
        //원래 layout을 .xml을 만들어야 하지만 예제이므로 안드로이에서 제공하는 것(android.R.layout.simple_list_item_1)을 사용
        listView.setAdapter(adapter);
    }
 
    public void clickBtn(View view) {
        //네트워크를 통해서 xml문서를 읽어오기..
        new Thread(){
            @Override
            public void run() {
                //영화진흥위원회 open API를 통해
                //일일박스오피스 정보를 가진 xml문서를
                //읽어와서 분석하여 Listview에 보여주기
                items.clear();
 
                Date date=new Date();//현재 날짜와 시간을 가진 객체
                date.setTime(date.getTime()-(1000*60*60*24)); //현재 날짜의 1일을 뺀 날짜
 
                SimpleDateFormat sdf= new SimpleDateFormat("yyyyMMdd"); //SimpleDateFormat 자동으로 편리하게 포맷을 넣을 수 있다.
                String dateStr=sdf.format(date);
 
                                +"?key="+apiKey
                                +"&targetDt="+dateStr
                                +"&itemPerPage=10";
                                    //주소 뒤에 [? key=Value & key = value id= aaa & pw= 1234] 이게 GET방식
 
                //위 xml문서의 주소(address)에 스트림을 연결하여 데이터를 읽어오기
 
 
                try {
                    //URL객체생성
                    URL url= new URL(adress);
 
                    //Stream 열기                                     //is는 바이트 스트림이라 문자열로 받기위해 isr이 필요하고 isr을 pullparser에게 줘야하는데
                    InputStream is= url.openStream(); //바이트스트림
                    //문자스트림으로 변환
                    InputStreamReader isr=new InputStreamReader(is);
 
                    //읽어들인 XML문서를 분석(parse)해주는 객체 생성    //pullparser를 만들려면 Factory가 필요해서 팩토리 만들고 pullparser를 만들었다. 결론, 그리고 pullparser에게 isr연결
                    XmlPullParserFactory factory= XmlPullParserFactory.newInstance();
                    XmlPullParser xpp=factory.newPullParser();
                    xpp.setInput(isr);
 
                    //xpp를 이용해서 xml문서를 분석
 
                    int eventType= xpp.getEventType();
 
                    String tagName;
                    StringBuffer buffer=null;
 
                    while(eventType!=XmlPullParser.END_DOCUMENT){
 
                        switch (eventType){
                            case XmlPullParser.START_DOCUMENT:
 
                                runOnUiThread(new Runnable() {  //여기는 별도 스레드이므로 화면 구성을 하려면 runOnUiThread 필요
                                    @Override
                                    public void run() {
                                        Toast.makeText(MainActivity.this,"파싱을 시작했다.",Toast.LENGTH_SHORT).show();
                                    }
                                });
 
                                break;
 
                            case XmlPullParser.START_TAG:
                                tagName=xpp.getName();
                                if(tagName.equals("dailyBoxOffice")){
                                    buffer=new StringBuffer();
 
                                }else if(tagName.equals("rank")){
                                    buffer.append("순위:");
                                    xpp.next();
                                    buffer.append(xpp.getText()+"\n");  //아래 두줄을 한줄로 줄일 수 있다.
//                                    String text = xpp.getText();
//                                    buffer.append(text+"\n");
 
                                }else if(tagName.equals("movieNm")){
                                    buffer.append("제목:");
                                    xpp.next();
                                    buffer.append(xpp.getText()+"\n");
 
                                }else if(tagName.equals("openDt")){
                                    buffer.append("개봉일:");
                                    xpp.next();
                                    buffer.append(xpp.getText()+"\n");
 
                                }else if(tagName.equals("audiAcc")){
                                    buffer.append("누적관객수:");
                                    xpp.next();
                                    buffer.append(xpp.getText()+"\n");
                                }
                                break;
 
                            case XmlPullParser.TEXT:
                                break;
 
                            case XmlPullParser.END_TAG:
                                tagName = xpp.getName();
                                if(tagName.equals("dailyBoxOffice")){
 
                                    items.add(buffer.toString());
 
                                    //리스트뷰 갱신
                                    runOnUiThread(new Runnable() {
                                        @Override
                                        public void run() {
                                            adapter.notifyDataSetChanged();
                                        }
                                    });
                                }
                                break;
                        }
 
                        eventType=xpp.next();
                            //                        xpp.next();   //두줄을 한줄로 쓸 수 있다.
                            //                        eventType=xpp.getEventType();
                    }//while ..
 
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            Toast.makeText(MainActivity.this"파싱종료!!",Toast.LENGTH_SHORT).show();
                        }
                    });
 
 
                } catch (MalformedURLException e) { e.printStackTrace();} catch (IOException e) {e.printStackTrace();} catch (XmlPullParserException e) {e.printStackTrace();}
 
 
            }// run() ..
        }.start();
    }
}
 
 
 

<실행 화면>

버튼을 누르면 가져온 API 정보를 화면에 보여준다.

이 예제는 Sample코드를 쓴 것이라 실행은 되지만, 구글 스토어 같은 곳에 앱을 올릴 것이라면 

키 발급을 받아서 발급받은 키로 해야한다. (키 발급은 해당 사이트에서 회원 가입하고 받으면 된다.)

반응형

댓글