자바 웹 개발자가 될거야/JAVA

[Android] 부산 주차장 데이터 가져와서 어플 만들기

whitz 2022. 1. 13. 12:21

< 부산 공영주차장 위치 어플리케이션 만들기 >

 

- busanparking 라는 이름으로 프로젝트 생성

 

 

① 데이터 수집

 

- data.go.kr로 접속

 

-  '부산광역시_공영주차장 정보 조회' 데이터가 존재함

 

- 활용신청해서 서비스키값 받아서 활용

 

- 맨 아래 Example code 중 자바 선택해서 메인 메서드 안 코드 복사

 

- MainActivity 안에 메서드 하나 만들고 붙여넣기

 

private void searchParking() throws IOException{

    StringBuilder urlBuilder = new StringBuilder("http://apis.data.go.kr/6260000/BusanPblcPrkngInfoService/getPblcPrkngInfo"); /*URL*/
    urlBuilder.append("?" + URLEncoder.encode("serviceKey","UTF-8") + "=서비스키"); /*Service Key*/
    urlBuilder.append("&" + URLEncoder.encode("pageNo","UTF-8") + "=" + URLEncoder.encode("1", "UTF-8")); /*페이지번호*/
    urlBuilder.append("&" + URLEncoder.encode("numOfRows","UTF-8") + "=" + URLEncoder.encode("10", "UTF-8")); /*한 페이지 결과 수*/
    urlBuilder.append("&" + URLEncoder.encode("resultType","UTF-8") + "=" + URLEncoder.encode("json", "UTF-8")); /*JSON방식으로 호출 시 파라미터 resultType=json 입력*/
    URL url = new URL(urlBuilder.toString());
    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
    conn.setRequestMethod("GET");
    conn.setRequestProperty("Content-type", "application/json");
    Log.i("mytag","Response code: " + conn.getResponseCode());
    BufferedReader rd;
    if(conn.getResponseCode() >= 200 && conn.getResponseCode() <= 300) {
        rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
    } else {
        rd = new BufferedReader(new InputStreamReader(conn.getErrorStream()));
    }
    StringBuilder sb = new StringBuilder();
    String line;
    while ((line = rd.readLine()) != null) {
        sb.append(line);
    }
    rd.close();
    conn.disconnect();
    Log.i("mytag",sb.toString());
}

 

 

② 인터넷 접속 허용하기

 

- AndroidManifest 파일로 가서  uses-permission 추가하기 & Traffic = "true"로 설정

 

③ MainActivity.java

 

- onCreate에서 호출해서 searchParking() 메서드 사용

 

protected  void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Thread t1 = new Thread(new Runnable(){
        @Override
        public void run(){
            try{
                searchParking();
            }catch(IOException e){
                Log.i("mytag",e.getLocalizeMessage());
            }
        }
    });
    t1.start();    
}

 

  · searchParking() 메서드가 throws IOException 했기 때문에 try~catch문에 넣어줬다.

  · 쓰레드로 진행

 

- 이 상태로 실행시키고 Logcat 값 보면 10개 정도 정보 볼 수 있음

 

 

 

④ activity_main.xml

 

- 주차장 목록을 listview로 보여주도록 디자인하기

 

- MainActivity로 돌아와서 onCreate() 메서드에 추가

setTitle("부산광역시 공용 주차장 목록);

 

 

- searchParking()을 void에서 String 타입으로 변환해서 반환값이 있도록 수정

return sb.toString();

 

- JSON 파싱하기 위해서 쓰레드 한 곳 안에는 변수 result로 searchParking 리턴값 받아옴

protected  void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Thread t1 = new Thread(new Runnable(){
        @Override
        public void run(){
            try{
                String result = searchParking();
                jsonParsing(result);
            }catch(Exception e){
                Log.i("mytag",e.getLocalizeMessage());
            }
        }
    });
    t1.start();    
}
private void jsonParsing(String jData) throws JSONException{
    //ArrayList<BusanParking> resultList = new ArrayList<>();
    String jarryData = jData.substring(jData.indexOf('['),jData.indexOf(']')+1);
    JSONArry jArry = new JSONArray(jarryData);
    pkNams = new String[jArry.length()];
    for(int i=0; i<jArry.length(); i++){
        JSONObject obj = jArry.getJSONObject(i);
        String guNm = obj.getString("guNm");
        String pkNam = obj.getString("pkNam");
        String addr1 = obj.getString("doroAddr");
        String addr2 = obj.getString("jibunAddr");
        resultList.add(new BusanParking(guNm,pkNam,addr1,addr2));
        pkNams[i] = pkNam;
    }    
}

  · 구이름, 주차장이름, 도로주소, 지번주소 필요한 데이터들을 들고올거임

  · 홈페이지에 변수명 다 나와있으니까 참고하시길

  · 한번에 10개 값씩 나오는데 그것들을 배열에 담아둘거다

 

 

⑤ DTO 방식의 클래스 생성

 

- java 폴더 안에 있는 com.example.busanparking 우클릭하고 New Java Class(BusanParking.java) 생성

 

public class BusanParking{

    String guNm;
    String pkNam;
    String addr1;
    String addr2;
    
    getter, setter 추가 ...

}

  · Code -  Generate - getter, setter 추가

 

- JSONParsing 한 결과값을 ListView에 뿌려줄거임

ArrayList<BusanParking> resultList = new ArrayList();
String[] pkNams;
ListView lv1;
protected  void onCreate(Bundle savedInstanceState){
    lv1 = findViewById(R.id.lv1);
    Thread t1 = new Thread(new Runnable(){
    @Override
        public void run(){
           try{
                ...
                jsonParsing(result);
                ArrayAdapter<String> adapter = new ArrayAdapter<>(MainActivity.this, 
                                                    android.R.layout.simple_list_item_1,pkNams);
                runOnUiThread(new Runnable(){
                    public void run(){
                        lv1.setAdapter(adapter);
                    }
                });
            }catch(Exception e){
                Log.i("mytag",e.getLocalizedMessage());
            }
            });
    t1.start();    
}

  · onCreate() 메서드 thread 안에 추가하기

  · jsonParsing 아래에

 

 

 

 

- 주차장 이름을 클릭하면 지도가 뜨도록 만들어보겠다 !

 

- 구글 지도 이용하되 도로명주소나 지번주소로 intent로 구현

 

lv1.setOnItemClickListner(new AdapterView.OnItemClickListner(){
    public void onItemClick(AdapterView<?> adapterView, View view, int i, long l){
        String addr = null;
        if(resultList.get(i).getAddr2().equals("-")){
            addr = resultList.get(i).getAddr1();
        }else{
            addr = resultList.get(i).getAddr2();
        }
        
        Uri uri = new Uri.parse("http://maps.goolge.com/maps?q="+addr);
        Intent intent = new Intent(Intent.ACTION_VIEW, uri);
        startActivity(intent);
    }
});

  · if문을 통해서 도로명이 없으면 지번주소로, 도로명이 있으면 도로명 주소로 설정