반응형


요즘 만들고 있는 어플에 네이버 검색 API를 쓸 일이 있어 포스팅합니다.

네이버 오픈 API는 네이버 개발자 센터
http://dev.naver.com/openapI 로 가시면 상세한 설명을 보실 수 있습니다.

네이버 검색 API 중 지역 검색을 사용하는데요.
요청 URL(request url)요청변수(request parameter) target 값에 따라 검색 분야가 달라지네요.
지역 검색은 target값이 local입니다.
display는 받아올 결과의 수 입니다.

샘플 URL은 다음과 같습니다.
http://openapi.naver.com/search?key=test&query=%EA%B0%88%EB%B9%84%EC%A7%91&target=local&start=1&display=10

key에 자신이 받은 key값을 넣고 query에 검색할 키워드를 넣으시면됩니다.
검색어의 문자셋은 UTF-8을 써야한다고 하네요.
저는 일단 파싱만 하고 테스트만 할 목적이므로 샘플 URL에 key값만 넣어서 실행 했습니다.
샘플 URL의 검색어는 '갈비집'이네요.

출력결과로 다양한 값들이 있는데 저는 제게 필요한 것들만 받아옵니다.
우선 결과를 먼저 보여 드리면 이렇습니다.^^;; 허접하죠


결과로 주어지는 항목들은 네이버 개발자 센터에 테이블로 잘 정리가 되있습니다 ㅎㅎ
PullParser를 사용할건데요 뭐 속도가 느릴거라는 말도 있던데 어차피 전 테스트이므로 4개만 받아올거라서 크게 못 느낄 것 같아요.(그렇겠죠??????아닌가??)

package ksk06.naverapi;
import java.net.URL;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
public class NaverTest extends Activity {
     
 /** Called when the activity is first created. */
 @Override   
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
        TextView status = (TextView)findViewById(R.id.status);
        TextView status1 = (TextView)findViewById(R.id.status1); //파싱된 결과를 보자
        TextView status2 = (TextView)findViewById(R.id.status2);
          
        boolean inItem = false, inTitle = false, inAddress = false, inMapx = false, inMapy = false;
       
  String title = null, address = null, mapx = null, mapy = null;
  String query = "%EA%B0%88%EB%B9%84%EC%A7%91"; //이부부은 검색어를 UTF-8로 넣어줄거임.
  System.out.println(query);
  
        try{
            URL url = new URL("http://openapi.naver.com/search?"
           +"key=여기에 발급받은 키값을 넣으세요"
           +"&query="+query //여기는 쿼리를 넣으세요(검색어)
           +"&target=local&start=1&display=4");
            
      
         XmlPullParserFactory parserCreator = XmlPullParserFactory.newInstance();
         XmlPullParser parser = parserCreator.newPullParser();
           
         parser.setInput(url.openStream(), null);
                  
         status.setText("파싱 중이에요..");
         
         int parserEvent = parser.getEventType();
         
         while (parserEvent != XmlPullParser.END_DOCUMENT){
          switch(parserEvent){                     
           case XmlPullParser.START_TAG:  //parser가 시작 태그를 만나면 실행
            if(parser.getName().equals("item")){
             inItem = true;
            }
            if(parser.getName().equals("title")){ //title 만나면 내용을 받을수 있게 하자 
             inTitle = true;              
            }
            if(parser.getName().equals("address")){ //address 만나면 내용을 받을수 있게 하자
            inAddress = true;              
            }
            if(parser.getName().equals("mapx")){ //mapx 만나면 내용을 받을수 있게 하자  
             inMapx = true;              
            }
            if(parser.getName().equals("mapy")){ //mapy 만나면 내용을 받을수 있게 하자  
             inMapy = true;              
            }            
            if(parser.getName().equals("message")){ //message 태그를 만나면 에러 출력
             status1.setText(status1.getText()+"에러");
              //여기에 에러코드에 따라 다른 메세지를 출력하도록 할 수 있다.
            }            
            break;
            
           case XmlPullParser.TEXT://parser가 내용에 접근했을때
            if(inTitle){ //isTitle이 true일 때 태그의 내용을 저장.
             title = parser.getText();             
                inTitle = false;
            }
            if(inAddress){ //isAddress이 true일 때 태그의 내용을 저장.
             address = parser.getText();             
                inAddress = false;
            }
            if(inMapx){ //isMapx이 true일 때 태그의 내용을 저장.
             mapx = parser.getText();             
                inMapx = false;
            }
            if(inMapy){ //isMapy이 true일 때 태그의 내용을 저장.
             mapy = parser.getText();             
                inMapy = false;
            }
            break;            
           case XmlPullParser.END_TAG:
            if(parser.getName().equals("item")){
             status1.setText(status1.getText()+"상호 : "+ title +"\n주소 : "+ address +"\n좌표 : " + mapx + ", " + mapy+"\n\n");
             inItem = false;
            }
            break;                   
          }          
           parserEvent = parser.next();
         }
         status2.setText("파싱 끝!");
        } catch(Exception e){
         status1.setText("에러가..났습니다...");
        }       
    }
}

레이아웃은 간단히 파싱되는걸 확인만 할거라서 텍스트뷰로 만들었습니다.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView
 android:id="@+id/status" 
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    />
    <TextView
 android:id="@+id/status1" 
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    />
    <TextView
 android:id="@+id/status2" 
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    />
</LinearLayout>

절대로 빠뜨리시면 안될 한가지가 있습니다.
AndroidManifest.xml 파일에 인터넷에 접근하기 위한 권한을 설정해 주셔야합니다^^
<uses-permission android:name="android.permission.INTERNET"/>

저는 이렇게 간단히 검색어에 대한 건색 결과 중 상호와, 주소, map의 좌표를 받아 온 것을 String에 넣어서 출려해 봤습니다. 실제로 편리하게 쓰시려면 List 같은 걸 사용하시면 더 좋을 거 같아요.

네이버의 다른 오픈 검색 API 도 똑같은 URL을 사용하기 때문에 target값만 바꿔 주시고 받아올 결과들에 대한 코드만 수정해 주시면 다른 검색도 쉽게 사용하실 수 있을겁니다. 
반응형
반응형

   안드로이드 앱에는 적절한 권한만 있으면 누구나 인스턴스화할 수 있는 4개의 컴포넌트가 있고 main()같은 유일한 진입점이 따로 없이 처음으로 생성되는 인스턴스의 생성자가 실질적 진입점이 됩니다.


4가지 구성요소

  Activity
 사용자 인터페이스의 기본 단위로 눈에 보이는 화면 하나를 뜻합니다. 여러 개의 View로 구성되며 App은  필요한 만큼 Activity를 가질 수 있고 그 중에 어떤 것을 화면에 띄울지 결정합니다.

  Service
UI 없이 백그라운드에서 실행되는 요소로 예를 들면 음악을 재생하는 코드를 들 수 있습니다. UI가 없기 때문에 사용자의 명령을 받아들일 수 있는 Activity와 연결해서 사용합니다.

  Broadcast Receiver(BR)
BR도 UI가 없는 것으로 시스템으로부터 전달되는 Broadcast를 대기하고 있다가 신호가 전달되면 수신하여 적절한 activity를 띄웁니다. 배터리가 떨어졌다는 신호나 데이터 전송이 완료 되었다는 등의 신호를 수신하는 역할로 이해하시면 되겠습니다.

  Content Provider(CP)
서로 다른 Application 사이에 데이터를 함부로 액세스 하지 못하도록 되어 있어 CP를 통해 프로그램간의 데이터를 공유할 수 있게 합니다. 예를 들자면 카카오톡 같은 프로그램에서 주소록의 데이터를 이용하는 것을 들 수 있겠지요.


Application은 4가지 요소 중 일부를 가질 수도 있고 여러 개를 가질 수도 있습니다.
이런 구성요소들의 구성은 manifest파일에 저장 관리 되며 최초 실행 시에 어떤 Activity를 화면에 띄울지도 같은 파일에 저장됩니다.

  구성요소간의 통신 수단 Intent
intent는 각 구성요소간의 통신을 위한 장치로 메시지에 대한 상세한 정보를 가지고 구체적인 행동을 설명하는 메카니즘입니다. 만약 '주소록 편집' activity를 호출하면 '누구의 주소를 어떻게 편집할지'가 intent에 실려 전달 됩니다. 
반응형

'컴퓨터&IT > 안드로이드 Android' 카테고리의 다른 글

Android - Activity  (0) 2011.08.24
Android 인터페이스  (0) 2011.08.24
Android application의 구조와 Life cycle  (0) 2011.08.24
Dalvik VM (Dalvik Virtual Machine)  (0) 2011.08.24
안드로이드 ? (Android)  (1) 2011.08.24
반응형

Google Android 에 대한 첫 번째 글입니다.
저도 이제 막 공부를 시작하려니 설레이네요 ^^

Android리눅스를 모바일 환경에 맞게 개조해서 만든 공개 운영체제입니다.
안드로이드 개발에는 다른 언어도 사용 가능하지만 공식적으로는 Java 언어를 사용하고 있다네요.
다양한 라이브러리를 제공하고, 써드파티 라이브러리까지 내장하고 있어서 어떤 책에서는 '오픈소소 집대성'이라는 표현도 사용하고 있습니다.
               


그리고 내장된 빌트인 프로그램과 사용자가 만든 프로그램이 동일한 API를 사용하기 때문에 모든 프로그램이 평등하다고 합니다.

안드로이드의 아키텍쳐는 아래와 같습니다.

Android System Architecture
그림 출처: http://developer.android.com/guide/basics/what-is-android.html

  먼저 제일 하위에 리눅스 커널(LINUX Kernel)이 있어서 백그라운드 스레드와 메모리를 관리하고, 보안, 디바이스 드라이버 등 저 수준의 관리를 담당합니다.

  다음 커널 위 계층에는 시스템 라이브러리(Libraries)가 있는데 이 라이브러리들의 동작이 장비의 전반적인 속도를 결정하기 때문에  Java가 아닌 C 또는 C++ 로 작성되어 있다고 합니다. 그리고 이 계층에 Android Runtime도 있는데요 Runtime은 자바 코어 라이브러리와 Dalvik 가상 머신(Dalvik VM)으로 구성됩니다. Dalvik 가상 머신은 모바일 디바이스용으로 최적화해 구현된 구글의 Java 격으로 이해 하시면 될것 같습니다. 

  세번째로 프레임워크(Application Framework) 계층에는 안드로이드의 API가 있습니다. Application은 직접 시스템 라이브러리나 하위 커널을 호출할 수 없기 때문에 API를 통해서 이들을 호출합니다.

  마지막 Applications 계층은 우리가 사용하고 보는 '앱'들이 되겠지요^^

여기까지 간단하게 안드로이드가 무엇인지에 대해 알아봤습니다.
혹시나 틀린 정보가 있다면 딴지 걸어주시길..^^
반응형

+ Recent posts