상세 컨텐츠

본문 제목

[Android] 오픈API 사용하는 법(JAVA)

IT Convergence Engineering/Android Programming

by Soo_buglosschestnut 2021. 1. 10. 21:19

본문

오픈API 사용하는 법(JAVA)


오픈API를 사용할 일이 생겨서 처음 시도해봤다..! 처음에 조금 헤맸지만 무사히 해결!

 

나는 공공 데이터 포털을 이용했다. (www.data.go.kr/index.do)

 

건축물 대장과, 기상관측시간자료가 필요했기 때문이다~

 

  • 공공 데이터 포털에서 오픈API 신청하기

1. 공공 데이터 포털(www.data.go.kr/index.do)에 들어가서 필요한 공공데이터 활용 신청한다~

 

그러면 다음 사진과 같이 뜬다~

서비스키

각각 Click해보면 서비스정보 - 일반 인증키(UTF-8)에 있는 인증키를 활용할것이다~

 

2. AndroidManifest.xml에 Code 추가하기!

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

 

3. Activity에 Code 추가하기!

 

  • onCreate함수에서 parsing 하도록 하는 Code 작성!
public class RealActivity extends AppCompatActivity {
    final static String TAG = "SnowProject";
    
    Timer timer;

    TextView weather_text;
    TextView home_text;
    String weather_data;
    String home_data;

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

        weather_text = (TextView)findViewById(R.id.weather);
        home_text = (TextView)findViewById(R.id.home);

       
        new Thread(new Runnable() {
            @Override
            public void run() {
                // TODO Auto-generated method stub
                
                // 아래 메소드를 호출하여 XML data를 파싱해서 String 객체로 얻어오기
                // 날씨 API
                weather_data= getWeatherXmlData(); 
                
                // 건축물 API
                home_data = getHomeXmlData();
                
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        // TODO Auto-generated method stub
                        weather_text.setText(weather_data); //TextView에 문자열  data 출력
                        home_text.setText(home_data);
                    }
                });
            }
        }).start();
    }
    
 // 밑에 source code 더 있음!

 

  • 건축물API Parsing 하는 Code
// xml parsing part
    String getHomeXmlData(){
        StringBuffer buffer=new StringBuffer();

        String sigungu = "Your 시군구 number";
        String bjdong = "Your 법정동 number";
        String bun = "Your 번지수 number";
        String ji = "Your 번지수 number";
        String numOfRows = "1";
        String serviceKey = "Your Service Key";

        String queryUrl = "http://apis.data.go.kr/1611000/BldRgstService/getBrTitleInfo?sigunguCd="+sigungu+"&bjdongCd="+bjdong
                +"&bun="+bun+"&ji="+ji+"&numOfRows="+numOfRows+"&ServiceKey="+serviceKey;

        try {
            URL url= new URL(queryUrl);//문자열로 된 요청 url을 URL 객체로 생성.
            InputStream is= url.openStream(); //url위치로 입력스트림 연결

            XmlPullParserFactory factory= XmlPullParserFactory.newInstance();
            XmlPullParser xpp= factory.newPullParser();
            xpp.setInput( new InputStreamReader(is, "UTF-8") ); //inputstream 으로부터 xml 입력받기

            String tag;
            xpp.next();
            int eventType= xpp.getEventType();

            while(eventType != XmlPullParser.END_DOCUMENT){
                switch(eventType){
                    case XmlPullParser.START_DOCUMENT:
                        break;

                    case XmlPullParser.START_TAG:
                        tag= xpp.getName();//태그 이름 얻어오기

                        if(tag.equals("item")) ;
                        else if(tag.equals("newPlatPlc")) {
                            buffer.append("주소 : ");
                            xpp.next();
                            buffer.append(xpp.getText());
                            buffer.append("\n\n");
                        }
                        else if(tag.equals("mainPurpsCdNm")) {
                            buffer.append("용도 : ");
                            xpp.next();
                            buffer.append(xpp.getText());
                            buffer.append("\n\n");
                        }
                        else if(tag.equals("grndFlrCnt")) {
                            buffer.append("지상층수 : ");
                            xpp.next();
                            buffer.append(xpp.getText() +"층");
                            buffer.append("\n\n");
                        }
                        else if(tag.equals("ugrndFlrCnt")) {
                            buffer.append("지하층수 : ");
                            xpp.next();
                            buffer.append(xpp.getText() +"층");
                            buffer.append("\n\n");
                        }
                        else if(tag.equals("strctCdNm")) {
                            buffer.append("구조 : ");
                            xpp.next();
                            buffer.append(xpp.getText());
                            buffer.append("\n\n");
                        }
                        else if(tag.equals("etcRoof")) {
                            buffer.append("지붕 : ");
                            xpp.next();
                            buffer.append(xpp.getText());
                            buffer.append("\n\n");
                        }
                        break;
                    case XmlPullParser.TEXT:
                        break;

                    case XmlPullParser.END_TAG:
                        tag= xpp.getName();
                        if(tag.equals("item")) buffer.append("\n");
                        break;
                }
                eventType= xpp.next();
            }

        } catch (Exception e) {
            // TODO Auto-generated catch blocke.printStackTrace();
        }
        return buffer.toString();//StringBuffer 문자열 객체 반환
    }

 

  • 자신만의 변수 code 넣는 부분
String sigungu = "Your 시군구 number";
String bjdong = "Your 법정동 number";
String bun = "Your 번지수 number";
String ji = "Your 번지수 number";
String numOfRows = "1"; // 하고 싶은 만큼 하기!
String serviceKey = "Your Service Key";

ex> 

4128710600에서 

시군구 / 법정동

41287 / 10600  

이런식으로 되어있음 분리해서 적으면 됨!

 

 

  • 번지수 number는 bun이랑 ji가 분리되어있는데 도로명주소가 아닌 번지수 번호!

다음과 같이 작성해주면 된다~

 

ex> if  ~~동 111번지

 

bun = "0111" / ji = "0000"

 

ex> if  ~~동 123-55번지

 

bun = "0123" / ji = "0055"

 

  • Service Key는 밑에 사진에 있는 일반 인증키 복붙하면 된다!

 

 

  • tag 이름들은 참고 문서 파일에 나와있으므로 참고하면 된다!
  • 날씨API Parsing 하는 Code
  String getWeatherXmlData(){
        StringBuffer buffer=new StringBuffer();

        String serviceKey = "Your Service Key";
        String numOfRows = "7";
        String pageNo = "1";

        SimpleDateFormat real_time = new SimpleDateFormat("yyyyMMdd");
        Date time = new Date();
        String base_date = real_time.format(time);

        String base_time = "0230";
        String nx = "Your x좌표";
        String ny = "Your y좌표";


       String queryUrl = "http://apis.data.go.kr/1360000/VilageFcstInfoService/getVilageFcst?serviceKey="+serviceKey+
               "&numOfRows="+numOfRows+"&pageNo="+pageNo+"&base_date="+base_date+"&base_time="+base_time+"&nx="+nx+"&ny="+ny;

        try {
            URL url= new URL(queryUrl);//문자열로 된 요청 url을 URL 객체로 생성.
            InputStream is= url.openStream(); //url위치로 입력스트림 연결

            XmlPullParserFactory factory= XmlPullParserFactory.newInstance();
            XmlPullParser xpp= factory.newPullParser();
            xpp.setInput( new InputStreamReader(is, "UTF-8") ); //inputstream 으로부터 xml 입력받기

            String tag;
            int i =0;
            xpp.next();
            int eventType= xpp.getEventType();

            while(eventType != XmlPullParser.END_DOCUMENT){
                switch(eventType){
                    case XmlPullParser.START_DOCUMENT:
                        break;

                    case XmlPullParser.START_TAG:
                        tag= xpp.getName();//태그 이름 얻어오기

                        if(tag.equals("item")) ; // 첫번째 검색결과
                        else if(tag.equals("fcstValue")) {
                            i++;
                            if (i == 1) {
                                buffer.append("강수확률 : ");
                                xpp.next();
                                buffer.append(xpp.getText()+"%");
                                buffer.append("\n");
                            }
                            if (i == 2) {
                                buffer.append("강수형태 : ");
                                xpp.next();
                                if(xpp.getText().equals("0")){
                                    buffer.append("없음");
                                    buffer.append("\n");
                                }
                                else if(xpp.getText().equals("1")){
                                    buffer.append("비");
                                    buffer.append("\n");
                                }
                                else if(xpp.getText().equals("2")){
                                    buffer.append("비+눈(진눈개비)");
                                    buffer.append("\n");
                                }
                                else if(xpp.getText().equals("3")){
                                    buffer.append("눈");
                                    buffer.append("\n");
                                }
                                else if(xpp.getText().equals("4")){
                                    buffer.append("소나기");
                                    buffer.append("\n");
                                }
                                else if(xpp.getText().equals("5")){
                                    buffer.append("빗방울");
                                    buffer.append("\n");
                                }
                                else if(xpp.getText().equals("6")){
                                    buffer.append("빗방울+눈날림");
                                    buffer.append("\n");
                                }
                                else if(xpp.getText().equals("7")){
                                    buffer.append("눈날림");
                                    buffer.append("\n");
                                }
                            }
                            if(i==3){
                                buffer.append("6시간 강수량 : ");
                                xpp.next();
                                buffer.append(xpp.getText()+"mm");
                                buffer.append("\n");
                            }
                            if(i==4){
                                buffer.append("습도 : ");
                                xpp.next();
                                buffer.append(xpp.getText()+"%");
                                buffer.append("\n");
                            }
                            if(i==5){
                                buffer.append("6시간 신적설 : ");
                                xpp.next();
                                buffer.append(xpp.getText()+"cm");
                             //   buffer.append("\n");
                            }
                            if(i==7){
                                buffer.append("3시간 기온 : ");
                                xpp.next();
                                buffer.append(xpp.getText()+"℃");
                                buffer.append("\n");
                            }
                        }
                        break;

                    case XmlPullParser.TEXT:
                        break;

                    case XmlPullParser.END_TAG:
                        tag= xpp.getName(); //태그 이름 얻어오기
                        if(tag.equals("item")) buffer.append("\n");
                        break;
                }
                eventType= xpp.next();
           }

        } catch (Exception e) {
            // TODO Auto-generated catch blocke.printStackTrace();
        }
        return buffer.toString();a//StringBuffer 문자열 객체 반환
    }
}

 

  • 자신만의 변수 Code 넣는 부분
String serviceKey = "Your Service Key";

// 하고 싶은 만큼 하기!
String numOfRows = "7";
String pageNo = "1";

SimpleDateFormat real_time = new SimpleDateFormat("yyyyMMdd");
Date time = new Date();
String base_date = real_time.format(time);

String base_time = "0230";
String nx = "Your x좌표";
String ny = "Your y좌표";

 

  • Service Key는 밑에 사진에 있는 일반 인증키 복붙하면 된다!

 

  • base_date는 실시간으로 하고싶어서 다음과 같이 Code 작성했다!
SimpleDateFormat real_time = new SimpleDateFormat("yyyyMMdd");
Date time = new Date();
String base_date = real_time.format(time);

 

  • base_time, nx, ny는 참고문서에 있으니 참고해서 적으면 된다!
  • 앱 실행 화면

 

참고: 

movie13.tistory.com/1

 

[Android] 공공기관 데이터 포털 API 신청 + android xml 파싱

1. 공공기관 데이터 포털(https://www.data.go.kr/) 접속 후 원하는 개발 계정을 신청합니다. 저는 URL 요청하여 xml을 파싱 할 것이므로 일반 유형과 앱 개발로 신청했습니다.  2. 승인 완료 후 발급 받

movie13.tistory.com


ⓐmd image 넣기 & resize

bugloss-chestnut.tistory.com/entry/Github-READMEmd%EC%97%90-Image-%EB%84%A3%EA%B8%B0-Image-Size-%EC%A1%B0%EC%A0%88%ED%95%98%EA%B8%B0

 

[Github] README.md에 Image 넣기 & Image Size 조절하기

README.md에 Image 넣기 & Image Size 조절하기 README.md에 Image 넣기 1. issues - write에 사진 drop down 시킨 후, 주소(https://~~.jpg(.png)) 복사하기 Code 실행 화면 ↓ README.md에서 Image size..

bugloss-chestnut.tistory.com

android app icon 만드는방법

bugloss-chestnut.tistory.com/entry/Android-App-Icon-%EC%A0%81%EC%9A%A9%ED%95%98%EA%B8%B0

 

[Android] App Icon 적용하기

App Icon 적용하기 AI Mushroom App을 꾸며볼려고 App Icon으로 바꾸는 방법에 대해 찾아 보았다~ 위 프로젝트 한지 시간이 좀~ 흘렀지만 그래도 정리해야지~  Store에 적용되는 icon size는 512x512 이다. 그..

bugloss-chestnut.tistory.com

jupyter notebook chrome으로 실행하기

bugloss-chestnut.tistory.com/entry/Jupyter-Notebook-Chrome%EC%9C%BC%EB%A1%9C-%EC%8B%A4%ED%96%89%ED%95%98%EA%B8%B0-%EC%8B%A4%ED%96%89-%EC%9C%84%EC%B9%98-%EC%A7%80%EC%A0%95%ED%95%98%EA%B8%B0

 

[Jupyter Notebook] Chrome으로 실행하기 & 실행 위치 지정하기

Chrome으로 실행하기 & 실행 위치 지정하기 Jupyter Notebook(Anaconda3)을 실행시키면 Internet Exploer로 실행되서 조금 불편~ ㅠㅠ 그래서 또 Chrome으로 실행하는 방법을 열심히 구글링!! 1, jupyter_note..

bugloss-chestnut.tistory.com

git collaborators 추가 방법

bugloss-chestnut.tistory.com/entry/Github-How-to-add-Git-Collaborator

 

[Github] How to add Git Collaborator

How to add Git Collaborator How to add Git Collaborator Settings - Manage access Click! 2. Invite a collaborator Click! 3. Github ID 입력하기! → Add "Github ID" to this respository Click! 4. 확..

bugloss-chestnut.tistory.com

 

관련글 더보기