[Android] 부산 주차장 데이터 가져와서 어플 만들기
< 부산 공영주차장 위치 어플리케이션 만들기 >
- 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문을 통해서 도로명이 없으면 지번주소로, 도로명이 있으면 도로명 주소로 설정