전자공학설계실험 A 보고서 화 6A ~ 9B 박종태교수님 제출기한 ( 화 ) Android I.S 작업환경 Eclipse_Juno ver. 전자공학부 이상엽전자공학부 오윤재전자공학부

Save this PDF as:
 WORD  PNG  TXT  JPG

Size: px
Start display at page:

Download "전자공학설계실험 A 보고서 화 6A ~ 9B 박종태교수님 제출기한 ( 화 ) Android I.S 작업환경 Eclipse_Juno ver. 전자공학부 이상엽전자공학부 오윤재전자공학부"

Transcription

1 전자공학설계실험 A 보고서 화 6A ~ 9B 박종태교수님 제출기한 ( 화 ) Android I.S 작업환경 Eclipse_Juno ver. 전자공학부 이상엽전자공학부 오윤재전자공학부 이준철

2 AppName Oh! My Taxi 택시요금예상측정기 목차 개발동기 본 App의차별성 기능구상 개발과정 동작원리및사용방법 사용도구및 Open Sources(API, Lib) 결과물및추후개발방향 소스코드세부사항 개발동기 이동수단으로택시를선택할때택시비에대한것이늘고민되고걱정된다. 타지에서방문한초행자이거나, 외국인, 버스운행시간종료시에효율적으로택시비를예상하여자금상황과견주어볼어플리케이션의필요성을느껴개발하게되었다. 번거로움없이지정된위치와현재위치간의계산을위하여각기능을추가하여개발하였다 타 App 과비교 < App > < Call Taxi App > 예 1 : 이동경로나미터기에대해 GPS 를이용하여추적하는 App 예 2 : 택시회사에서콜택시에대한서비스를제공하는 App 본 App 가원하는기능의응용은찾아보기힘들다.

3 기능구상 ( 제안내용 ) 및개발환경 기능구상 - 지도탑재 - 선택한위치간의최단경로구현 - 경로의거리측정 - 측정된거리를바탕으로요금계산 - 도착지정보를즐겨찾기로등록 - 즐겨찾기정보를이용하여현재위치를읽어동작 개발환경 - 운영체제 : Windows XP Pro sp3 x86(32bit) Android Icecream Sandwitch (AVD) 개발과정 개괄 - MapView를구현한다음위치를선택하여경로및거리를찾아내어택시요금을계산한다. - 도착지정보를즐겨찾기하여해당위치를출발 / 도착로세팅후현재위치를읽어서위치를선택한다. 단계별세부사항

4 동작원리및사용방법 동작원리 - 앱이시작되면 Map으로의전환과, 즐겨찾기 (DB) 된 ListView가출력된다. - MapView는 DaumOpenAPI를사용하여띄운다. - DaumMaps의메소드를통해위치정보를출발 / 도착지로설정하고해당정보를 ArrayList 로저장한다. - 각각 [0],[1] Node가출발 / 도착지로, 해당정보를가지고 DaumMap의길찾기항목의경로로전송하여 json 파일을받는다. - json파일을파싱하여 NODE별위치를얻어서 HashMap으로받아온다. - HashMap의내용을 Map에 Point를찍어 PolyLine을구현한다. - 도착지의정보 ( 좌표 ) 는 db에추가하여파일로저장한다. - db( 좌표 ) 를읽어와서도착 / 출발지로설정하고, 현위치를호출하여요금계산을수행한다. 사용방법 - 앱을실행시키면버튼과즐겨찾기가있는메인화면이보인다. < > - 위치지정버튼을누르면 MapView가있는화면으로전환된다. 원하는위치로 Map을이동시킨후길게누르면첫번째터치가출발지로, 두번째터치가도착지로지정된다. 기기에있는 Menu을눌러서도착지정보를즐겨찾기로추가할수있다. < MapView, > < >

5 - 요금계산버튼을누르면요금계산화면으로전환된다. 해당좌표값과거리가뜨는데, 상단의요금계산버튼을누르면일반택시 ( 할증 ) 모범택시의예상요금을알수있다. 위치확인버튼을누르면이전경로가표시된화면으로전환되고다시보기버튼을누르면경로가사라진화면으로전환된다. < > - 즐겨찾기추가후처음화면으로돌아가면리스트의형태로위치정보가표시됨을알수있다 출발지그림을누르면해당정보가출발지로, 도착지그림을누르면해당정보가도착지로 설정되고, 현재위치와의길찾기부터수행한다. < ListView, main > < >

6 사용도구및 OpenSources(API, Lib) Mobile DaumMap Open API - Daum에서제공하는 Android용모바일맵오픈 API - MapView, MapPoint, MapPointItem 등의메소드를지원한다. DaumMap Local API - Daum에서제공하는웹용오픈 API(java) - Mobile에서지원하지않는길찾기나좌표계변환기능을지원하고, 본 App에서해당기능을웹에서 Json 파일로받아오는데사용하였다. TransCoord Class - Daum 로컬 API의좌표계변환부분을 Android 용 Class로포팅한것. - Local API 의 Key( 권한 ) 없이사용할수있다. LocationManager - 위치정보를위해 Google에서제공하는 API로 Provider (Network, GPS) 를이용하여받아오는데이용하였다. - 본 App에서는 Network Provider을이용하여기지국정보로부터위치를받아와서사용했다. 결과물및추후개발방향 구현한기능 - 지정된위치에따른경로 ( 길찾기 ) 표시 - db를이용한즐겨찾기항목저장및리스트뷰를이용한즐겨찾기출력 - 네트워크프로바이더를이용한현위치트래킹 - 거리에따른택시요금계산 - 위치에따른경로표시 - 좌표계변환 미구현된기능 - (Reverse) Geo-coding( 주소 좌표 ) 를이용한위치표현 - 시간에따른택시과금적용 개발방향 - Mobile DaumMap API가길찾기기능을제공하지않으므로해당기능들을완전 open source 인 GoogleMaps로포팅 - 미구현기능의추가및예외처리향상 - UI 디자인강화, 도움말항목추가

7 소스코드 Layout & Manifest - addtemp.xml : 위치정보를추가하는 dialog 구성 <LinearLayout xmlns:android=" xmlns:tools=" android:orientation="horizontal" android:layout_width="wrap_content" android:layout_marginleft="5sp" android:textcolor="#ffff00" android:text=" 명칭 :" /> <EditText android:layout_marginleft="5sp" android:layout_marginright="5sp" /> </LinearLayout> - calcdistance.xml : 거리계산 Activity 구성 <LinearLayout xmlns:android=" xmlns:tools=" android:layout_height="fill_parent" android:orientation="vertical" >// 배경으로이미지를넣음 <Button android:layout_margintop="10sp" android:layout_marginbottom="10sp" android:text=" 요금계산 " /> android:text=" 시작지점 :" /> android:layout_height="50dp" /> android:text=" 끝지점 :" /> android:layout_height="50dp" /> android:text="* 거리 " /> android:layout_height="50dp" /> android:text="* 일반택시요금 " /> android:layout_height="50dp" />

8 android:text="* 모범택시요금 " /> android:layout_height="50dp" android:layout_marginbottom="10sp"/> <LinearLayout android:layout_gravity="bottom" android:gravity="center" android:orientation="horizontal" > <Button android:layout_width="80sp" android:layout_marginright="20sp" android:text=" 위치확인 " /> <Button android:layout_width="80sp" android:layout_marginright="20sp" android:text=" 다시지정 " /> <Button android:layout_width="80sp" android:text=" 처음으로 " /> </LinearLayout> </LinearLayout> - favorate.xml : ListView 의항목구성 (Custom ListView) <LinearLayout xmlns:android=" xmlns:tools=" android:gravity="center" android:paddingtop="5px" android:paddingbottom="5px" android:orientation="horizontal" > <LinearLayout android:layout_width="200dp" android:orientation="vertical"> android:gravity="center_vertical" android:textsize="30px" android:ellipsize="end" />" </LinearLayout> <ImageButton android:layout_width="60px" android:layout_height="60px" android:layout_gravity="center_vertical" 이미지버튼으로이미지등록 <ImageButton android:layout_width="60px" android:layout_height="60px" android:paddingleft="60px" android:layout_gravity="center_vertical" </LinearLayout> - main.xml : main Activity 에대한구성 <LinearLayout xmlns:android=" xmlns:tools=" android:layout_height="fill_parent" android:orientation="vertical" >// 레이아웃배경화면등록 <LinearLayout android:orientation="horizontal"

9 android:gravity="center" android:layout_margintop="10sp"> <Button android:text=" 위치지정 android:layout_width="130sp" android:layout_marginright="20sp" <Button android:text=" 종료 " android:layout_width="130sp" </LinearLayout> android:text="( 즐겨찾기 )" android:textcolor="#010bf2" android:textsize="17dp" android:layout_width="wrap_content" android:layout_margintop="10sp" android:layout_marginleft="20sp"/> <LinearLayout android:layout_marginbottom="10sp" android:layout_marginleft="10sp" android:layout_marginright="10sp" android:layout_margintop="10sp" android:layout_height="fill_parent" android:orientation="vertical"> <ListView android:layout_height="fill_parent" />//ListView 항목 </LinearLayout> </LinearLayout> - map.xml : 지도가나오는 Activity 에대한구성 (DaumMapView 탑재 ) <LinearLayout xmlns:android=" xmlns:tools=" android:layout_height="fill_parent" android:orientation="vertical" > <net.daum.mf.map.api.mapview android:layout_width="match_parent" android:layout_height="400dp" />//DaumMap View 를받아오는항목 <LinearLayout android:gravity="center" android:orientation="horizontal" android:layout_margintop="10sp" > <Button android:layout_width="130sp" android:layout_marginright="20sp" android:enabled="false" android:text=" 요금계산 " /> <Button android:layout_width="130sp" android:text=" 처음으로 " /> </LinearLayout> <EditText /> </LinearLayout>

10 Class(java) - calc.java : 계산 Activity 를구성하는 class package com.android.taximap; import android.app.activity; import android.content.intent; import android.os.bundle; import android.view.view; import android.widget.button; import android.widget.textview; import android.widget.toast; public class calc extends Activity{ Button btn_start,btn_loca,btn_tomain2,btn_reloca; TextView TVstart_pos, TVend_pos, TVdistance_meter, TVtaxi_fare,TVtaxi_faremodel; int fare, fareplus, faremodel; int distance_meter=jsondecode.distance_temp; double xpoint_start,ypoint_start, xpoint_end,ypoint_end;// public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.calcdistance); btn_start=(button)findviewbyid(r.id.btn_start); btn_loca=(button)findviewbyid(r.id.btn_loca); btn_tomain2=(button)findviewbyid(r.id.btn_tomain2); btn_reloca=(button)findviewbyid(r.id.btn_reloca); TVstart_pos=(TextView)findViewById(R.id.start_pos); TVend_pos=(TextView)findViewById(R.id.end_pos); TVdistance_meter=(TextView)findViewById(R.id.distance_meter); TVtaxi_fare=(TextView)findViewById(R.id.taxi_fare); TVtaxi_faremodel=(TextView)findViewById(R.id.taxi_faremodel); xpoint_start=daummap.alitems.get(0).getmappoint().getmappointwcongcoord().x; //DaumMap Class 에 alitem 의 ArrayList 0 번 index( 출발지 ) 저장된값을가지고옴 ypoint_start=daummap.alitems.get(0).getmappoint().getmappointwcongcoord().y; TVstart_pos.setText(" "+xpoint_start + ", " + ypoint_start); xpoint_end=daummap.alitems.get(1).getmappoint().getmappointwcongcoord().x; ypoint_end=daummap.alitems.get(1).getmappoint().getmappointwcongcoord().y; TVend_pos.setText(" "+xpoint_end + ", " + ypoint_end); TVdistance_meter.setText(" "+distance_meter + " M ("+(double)distance_meter/1000 +" Km )"); // 대구시요금체계 if (distance_meter < 2000) { fare = 2200; fareplus = 2640; faremodel = 4000; else if (distance_meter >= 2000 & distance_meter < 3000) { fare = (int) ( (distance_meter ) / 150 * 100); fareplus = (int) ( (distance_meter ) / 150 * 120); faremodel = (int) 4000; else if (distance_meter >= 3000) { fare = (int) ( (distance_meter ) / 150 * 100); fareplus = (int) ( (distance_meter ) / 150 * 120); faremodel = (int) ( (distance_meter ) / 150 * 200); // 버튼눌럿을때 btn_start.setonclicklistener(new View.OnClickListener() { public void onclick(view v) { TVtaxi_fare.setText(" 비할증시 : " + fare + " 원," + " " + " 할증시 :" + fareplus + " 원 "); TVtaxi_faremodel.setText(faremodel + " 원 "); ); btn_tomain2.setonclicklistener(new View.OnClickListener() { public void onclick(view v) { DaumMap.alitems.clear(); DaumMap._ID=0;// 동작구별을위한식별자를초기값으로세팅 Intent intent = new Intent(calc.this,MainActivity.class); startactivity(intent); Toast.makeText(getBaseContext(), " 처음화면으로...", Toast.LENGTH_SHORT).show();

11 ); btn_reloca.setonclicklistener(new View.OnClickListener() { public void onclick(view v) { DaumMap.alitems.clear(); DaumMap._ID=0; Intent intent = new Intent(calc.this,DaumMap.class); startactivity(intent); ); btn_loca.setonclicklistener(new View.OnClickListener() { public void onclick(view v) { onbackpressed();// 이전으로돌아가기위해 back 버튼을누른효과 ); - Database.java : DB 를구성하는내용에대한 class package com.android.taximap; import android.provider.basecolumns;//basecolumns 를상속받아 DB 를구성한다. public final class Database { public static final class creatdb implements BaseColumns{ public static final String ADDRESS="address"; public static final String XPOINT="xpoint"; public static final String YPOINT="ypoint"; public static final String _TABLE_NAME="locainfo"; public static final String CREATE= "create table "+_TABLE_NAME+"(" +_ID+" integer primary key autoincrement, " +ADDRESS+" text not null, " +XPOINT+" text not null, " +YPOINT+" text not null );"; //creatdb 클래스로각 Column 을정의하고구성한다. _ID 는자동으로증가하도록설정한다.( 입력받지않음 ) - DaumMap.java : MapView 가있는 Activity 를구성하는 class package com.android.taximap; import java.util.arraylist; import kr.hyosang.coordinate.coordpoint; import kr.hyosang.coordinate.transcoord; import net.daum.mf.map.api.mappoiitem; import net.daum.mf.map.api.mappoint; import net.daum.mf.map.api.mappolyline; import net.daum.mf.map.api.mapview; import android.app.activity; import android.app.alertdialog; import android.content.context; import android.content.dialoginterface; import android.content.intent; import android.graphics.color; import android.location.location; import android.location.locationlistener; import android.location.locationmanager; import android.os.bundle; import android.util.log; import android.view.layoutinflater; import android.view.menu; import android.view.menuitem; import android.view.view; import android.widget.button; import android.widget.edittext; import android.widget.textview; import android.widget.toast; public class DaumMap extends Activity implements MapView.MapViewEventListener { public jsondecode jsd=new jsondecode();//json 파싱을위한인스턴스선언 dbopenhelper mdbopenhelper;//db 를컨트롤하기위해선언 LocationManager locationmanager=null;// 위치정보를받아오기위해선언 Location here=null;// 위치정보를저장하기위해선언 static double xpoint=0,ypoint=0;// 위치정보를 (WCONG) 좌표계로저장 double xpoint_2=0,ypoint_2=0;// 받아온위치정보를저장하기위한변수

12 static public int _ID;// 기능구별을위한식별자 static public ArrayList<MapPOIItem> alitems;// 맵포인트를찍기위해 list 형태로선언 public MapPoint.PlainCoordinate Pcord; public MapPoint mappoint; public MapView mapview; Button public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.map); mapview=(mapview)findviewbyid(r.id.dmapview); mapview.setdaummapapikey("9a58163f57b1c380c276ec1370bd cb66c"); //DaumMap API 사용을위한인증값. mapview.setmapvieweventlistener(this); removeitems(0);//mapview 에찍힌포인트와경로를제거하는메서드 btn_fare=(button)findviewbyid(r.id.btn_distance); btn_tomain=(button)findviewbyid(r.id.btn_tomain); alitems=new ArrayList<MapPOIItem> (0); btn_fare.setonclicklistener(new View.OnClickListener() { public void onclick(view v) { Intent intent = new Intent(DaumMap.this,calc.class); startactivity(intent); ); btn_tomain.setonclicklistener(new View.OnClickListener() { public void onclick(view v) { removeitems(0); alitems.clear(); DaumMap._ID=0; Intent intent = new Intent(DaumMap.this,MainActivity.class); startactivity(intent);// 인식값및모든변수를초기화하고이전화면으로전환 ); Log.d("loca","_ID 비교전 : "+_ID); locationmanager=(locationmanager)getsystemservice(context.location_service); //LocationManager 변수선언, 지역정보를사용함 if(_id==1){// 식별값이 1( 출발지로선언 ) 일때 set_items(xpoint,ypoint,mapview,_id);// 식별값이 1( 출발지로선언 ) 일때 setgpsloca(_id);// 현재위치메서드호출 else if(_id==2){// 식별값이 2( 도착지로선언 ) 일때 setgpsloca(_id);// 현재위치를먼저찍고 set_items(xpoint,ypoint,mapview,_id);// 저장된좌표를도착지로찍음. else {// 아무설정이없을때초기화 _ID=0; public void removeitems(int cont){ mapview.removeallpoiitems();//poiitems메서드로찍힌 Polyline과포인트를삭제 mapview.removeallpolylines(); public void onmapviewcenterpointmoved(mapview mapview, MapPoint mapcenterpoint) { // 맵뷰중심위치가변했을때의값 (default) public void onmapviewdoubletapped(mapview mapview, MapPoint mappoint) { // 더블클릭되엇을때의값 (default로확대 / 축소를수행 ) public void onmapviewinitialized(mapview mapview) { //mapview가띄워졌을때초기위치에대한메소드 mapview.setmapcenterpointandzoomlevel(mappoint.mappointwithgeocoord( , ),5,true); // 초기위치를경북대의 Geo좌표계로선언 public void onmapviewlongpressed(mapview mapview, MapPoint mappoint) { // 길게터치가발생했을때 // 좌표값읽기 MapPoint.PlainCoordinate mappointgeo = mappoint.getmappointwcongcoord(); double xpoint = mappointgeo.x;// 해당위치의 x(wcong좌표 ) 를 xpoint에저장 double ypoint = mappointgeo.y; set_items(xpoint,ypoint,mapview,0); // 저장된좌표로포인트를찍는메서드를호출 Toast.makeText(getBaseContext(), String.format(" 위치선택 ( %.1f,.%.1f)", xpoint,ypoint),toast.length_short).show();// 토스트메시지로출력 public void onmapviewsingletapped(mapview mapview, MapPoint mappoint) { public void onmapviewzoomlevelchanged(mapview mapview, int zoomlevel) { public void set_items(double xpoint, double ypoint,mapview mapview,int id){ // 포인트를찍는메서드 MapPOIItem item=new MapPOIItem(); item.setdraggable(false); // 움직불가능마커표시 if((id==1 id==0)&&alitems.size()==0){ // 출발지로선언되거나아무설정이없고저장된값이없을때동작

13 item.setitemname(" 출발지 "); item.setmarkertype(mappoiitem.markertype.bluepin); item.setmappoint(mappoint.mappointwithwcongcoord(xpoint, ypoint)); item.setshowanimationtype(mappoiitem.showanimationtype.springfromground); mapview.addpoiitem(item); alitems.add(item); // 출발지로해당좌표를찍고 ArrayList(0) 번인덱스에추가한다. else if((id==2 id==0)&&alitems.size()==1){ // 도착지로선언되거나아무설정없이이미 ArrayList 에저장된값이있을때 item.setitemname(" 도착지 "); item.setmarkertype(mappoiitem.markertype.redpin); item.setmappoint(mappoint.mappointwithwcongcoord(xpoint, ypoint)); item.setshowanimationtype(mappoiitem.showanimationtype.springfromground); mapview.addpoiitem(item); btn_fare.setenabled(true); alitems.add(item); jsd.getroute(); // 값을추가하고루트를받아오는메서드를호출 DRaw(mapView); // 루트를그리는메서드를호출 public void DRaw(MapView mapview){ // 경로를그리는메서드 MapPolyline polyline = new MapPolyline(jsondecode.list_loc_point.size()); polyline.setlinecolor(color.argb(128, 0, 0, 255)); for(int i=0;i<jsondecode.list_loc_point.size();i++){ //json 을 parsing 해서저장된 AraayList 의크기만큼반복수행 double x = Double.valueOf(jsondecode.list_loc_point.get(i).get("xpoint"+i)); double y = Double.valueOf(jsondecode.list_loc_point.get(i).get("ypoint"+i)); //ArrayList<HashMap<"key","value">> 의값을각각읽어와서변수로저장하고 polyline.addpoint(mappoint.mappointwithwcongcoord(x, y)); // 해당포인트를추가한다. jsondecode.list_loc_point.clear(); // 기존포인트들을제거하고 mapview.addpolyline(polyline); // 맵뷰에해당포인트들을추가 ( 표시한다 ) mapview.fitmapviewareatoshowpolyline(polyline); // 경로가다보일수있게맵스케일을자동조정한다. LocationListener locationlistener=new LocationListener(){ // 위치정보에대한리스너 public void onlocationchanged(location location) { // 위치가변경되었을때 CoordPoint pt = new CoordPoint(location.getLongitude(),location.getLatitude()); CoordPoint tpt=transcoord.gettranscoord(pt, TransCoord.COORD_TYPE_WGS84, TransCoord.COORD_TYPE_WCONGNAMUL); //location 에저장된위치정보를콩나물좌표계로변환한다. xpoint_2=tpt.x; ypoint_2=tpt.y; public void onproviderdisabled(string provider) { // TODO Auto-generated method stub //Provider 가종료되었을때 public void onproviderenabled(string provider) { // TODO Auto-generated method stub //Provider 가활성화되었을때 public void onstatuschanged(string provider, int status, Bundle extras) { // TODO Auto-generated method stub //Provider 상태가변화되었을때 ; public void setgpsloca(int id){ // 위치정보를받는메서드 MapPoint map2; Log.d("loca"," 커런트로케이션이벤트호출전 : "+", "+xpoint+", "+ypoint+"id="+id); locationmanager.requestlocationupdates(locationmanager.network_provider, 5000, 1, this.locationlistener); // 위치정보변화를요구한다.(NETWORK_PROVIDER: 네트워크정보로부터위치전달 ) 5 초만큼 1 미터최소단위로 here=locationmanager.getlastknownlocation(locationmanager.network_provider); // 최근에획득한위치정보를 here 에저장한다. if(here!=null){ //Here 가값이있게되면 CoordPoint pt = new CoordPoint(here.getLongitude(),here.getLatitude()); CoordPoint tpt=transcoord.gettranscoord(pt, TransCoord.COORD_TYPE_WGS84, TransCoord.COORD_TYPE_WCONGNAMUL);

14 xpoint_2=tpt.x; ypoint_2=tpt.y; // 최근위치로포인트설정 map2 = MapPoint.mapPointWithWCONGCoord(xpoint_2, ypoint_2); // 해당포인트를맵포인트로지정 if(id==1){ set_items(map2.getmappointwcongcoord().x,map2.getmappointwcongcoord().y,this.mapview,2); // 출발지로되어있으면호출한현재위치를도착지로표기한다 else if(id==2){ set_items(map2.getmappointwcongcoord().x,map2.getmappointwcongcoord().y,this.mapview,1); // 도착지로되어있으면호출위치를출발지로표기한다. else{ set_items(map2.getmappointwcongcoord().x,map2.getmappointwcongcoord().y,this.mapview,0); // 둘다아니면설정이없이표기한다. try{ Thread.sleep(10000); //10 초만큼딜레이를둔다. catch(exception e){ Log.d("loca"," 딜레이예외 "); locationmanager.removeupdates(locationlistener); // 위치정보를받아오는것을종료한다. static public void setmappoint(favorate a, int id){ // 맵포인트를세팅하는메서드 DaumMap.xpoint=a.xpoint; DaumMap.ypoint=a.ypoint; public boolean oncreateoptionsmenu(menu menu) { menu.add(0, Menu.FIRST+1, Menu.NONE, " 즐겨찾기추가 "); return super.oncreateoptionsmenu(menu); // public boolean onoptionsitemselected(menuitem item) { // 다이아로그창을띄우기위해레이아웃을객채화한다. LayoutInflater inflater=layoutinflater.from(this); // 레이아웃객채화하는 layoutinflater inflater 선언 View addview=inflater.inflate(r.layout.addtemp, null); final TextView tview=(textview)addview.findviewbyid(r.id.tv_add_name); final EditText medit=(edittext)addview.findviewbyid(r.id.ev_andd_name); Log.d("dbdata", " 다이아로그전 "); AlertDialog.Builder dlg=new AlertDialog.Builder(this); mdbopenhelper=new dbopenhelper(this); mdbopenhelper.open(); Log.d("dbdata", " 헬퍼호출 "); dlg.settitle(" 도착지위치정보추가 ").setmessage(" 도착지의위치정보를 \n"+" 즐겨찾기하시겠습니까?").setView(addView).setPositiveButton("ok", new DialogInterface.OnClickListener() { public void onclick(dialoginterface dialog, int which) { Log.d("dbdata", "values 생성전 "); Log.d("dbdata", "alitem.get(1).x : "+alitems.get(1).getmappoint().getmappointwcongcoord().x); Log.d("dbdata"," 텍스트입력된거 : "+medit.gettext().tostring()); mdbopenhelper.insertcolumn(medit.gettext().tostring(), alitems.get(1).getmappoint().getmappointwcongcoord().x, alitems.get(1).getmappoint().getmappointwcongcoord().y); //Alitems 에저장된도착지정보를 db 로저장한다. mdbopenhelper.close(); Toast.makeText(getBaseContext(), " 위치정보가즐겨찾기되었습니다.", Toast.LENGTH_SHORT).show(); ).setnegativebutton("cancel", new DialogInterface.OnClickListener() { public void onclick(dialoginterface dialog, int which) { // TODO Auto-generated method stub ).show(); return super.onoptionsitemselected(item); - dbopenhelper : dbopenhelper(sqliteopenhelper 를상속받아구현 ) package com.android.taximap;

15 import android.content.contentvalues; import android.content.context; import android.database.cursor; import android.database.sqlexception; import android.database.sqlite.sqlitedatabase; import android.database.sqlite.sqlitedatabase.cursorfactory; import android.database.sqlite.sqliteopenhelper; public class dbopenhelper{ private static final String DATABASE_NAME = "adress.db";//db 이름설정 private static final int DATABASE_VERSION=1;//dB 버전 : 업데이트를위해사용 public static SQLiteDatabase mdb; private DatabaseHelper mdbhelper; private Context mctx; public class DatabaseHelper extends SQLiteOpenHelper{//SQLiteOpenHelper 상속받아구현 public DatabaseHelper(Context context, String name, CursorFactory factory, int version) { super(context, name, factory, public void oncreate(sqlitedatabase db) { public void onupgrade(sqlitedatabase db, int oldversion, int newversion) { db.execsql("drop TABLE IF EXISTS "+Database.creatDB._TABLE_NAME); oncreate(db); public dbopenhelper(context context){ this.mctx=context; public dbopenhelper open() throws SQLException{ mdbhelper=new DatabaseHelper(mCtx,DATABASE_NAME,null,DATABASE_VERSION); mdb=mdbhelper.getwritabledatabase(); return this; public void close(){ mdb.close(); public long insertcolumn(string address,double xpoint, double ypoint){// 추가에관한메서드 ContentValues values = new ContentValues(); values.put(database.creatdb.address, address); values.put(database.creatdb.xpoint, xpoint); values.put(database.creatdb.ypoint, ypoint); return mdb.insert(database.creatdb._table_name, null, values); public boolean updatecolumn(long id, String address, double xpoint, double ypoint){// 업데이트에관한메서드 ContentValues values = new ContentValues(); values.put(database.creatdb.address, address); values.put(database.creatdb.xpoint, xpoint); values.put(database.creatdb.ypoint, ypoint); return mdb.update(database.creatdb._table_name, values, "_id="+id, null)>0; public boolean deletecolumn(long id){// 삭제에관한메서드 return mdb.delete(database.creatdb._table_name, "_id="+id, null)>0; public Cursor getallcolumns(){ return mdb.query(database.creatdb._table_name, null, null, null, null, null, null); public Cursor getcolumn(long id){ Cursor c=mdb.query(database.creatdb._table_name, null, "_id="+id, null, null, null, null); if(c!=null && c.getcount()!=0){ c.movetofirst(); return c; - Favorate.java : list 를구성하는항목에대한 class package com.android.taximap; public class Favorate { public int _id; public String locate; public double xpoint; public double ypoint; public Favorate(int _id, String locate,double xpoint,double ypoint){ this._id=_id;

16 this.locate=locate; this.xpoint=xpoint; this.ypoint=ypoint; public String getloca(){ return this.locate; public double getxpoint(){ return this.xpoint; public double getypoint(){ return this.ypoint; - FavorateAdapter.java : CustomListView 를구현하기위한 CustomAdapter class package com.android.taximap; import java.util.arraylist; import android.content.context; import android.content.intent; import android.util.log; import android.view.layoutinflater; import android.view.view; import android.view.view.onclicklistener; import android.view.viewgroup; import android.widget.arrayadapter; import android.widget.imagebutton; import android.widget.textview; public class FavorateAdapter extends ArrayAdapter<Favorate>{// 커스텀어답터를구현하기위해 ArrayAdapter 을상속 private Context mcontext; private int mresource; private ArrayList<Favorate> Fitems; private LayoutInflater vi;// 레이아웃을객체화 public FavorateAdapter(Context context, int textviewresid, ArrayList<Favorate> Fitems){ super(context, textviewresid, Fitems); this.fitems=fitems; this.mcontext=context; this.mresource=textviewresid; public View getview(int position, View convertview, ViewGroup parent) { View v=convertview; if(v==null){ v=vi.inflate(r.layout.favorate, null);// 레이아웃에뷰어가없으면 favorate 를객체화하여가져온다 Favorate p=fitems.get(position); if(p!=null){ TextView Loca=(TextView)v.findViewById(R.id.location); Loca.setText(p.getLoca()); ImageButton bring_start=(imagebutton)v.findviewbyid(r.id.btn_bringstart); ImageButton bring_end=(imagebutton)v.findviewbyid(r.id.btn_bringend); bring_start.setfocusable(false); bring_end.setfocusable(false); bring_start.settag(position); bring_end.settag(position); bring_start.setonclicklistener(new OnClickListener(){ public void onclick(view v) { int position=integer.parseint(v.gettag().tostring()); Favorate p = Fitems.get(position); if(p!=null){ // 출발지로선언 // 이미지버튼이눌렸을때맵포인트를해당정보를새팅하고화면전환 DaumMap.setmapPoint(p,1); Intent intent = new Intent(mContext,DaumMap.class); mcontext.startactivity(intent); ); bring_end.setonclicklistener(new OnClickListener(){ public void onclick(view v) {

17 int position=integer.parseint(v.gettag().tostring()); Favorate p = Fitems.get(position); if(p!=null){ // 도착지로선언 // 즐겨찾기가져오기 double xpoint, ypoint; xpoint=fitems.get(position).xpoint; ypoint=fitems.get(position).ypoint; DaumMap.setmapPoint(p,2); Intent intent = new Intent(mContext,DaumMap.class); mcontext.startactivity(intent); ); return v; public void setarraylist(arraylist<favorate> array){ this.fitems=array; public ArrayList<Favorate> getarraylist(){ return this.fitems; - jsondecode.java : url 을구성하여전송하고 son 파일을받아 parsing 하는 class package com.android.taximap; import java.io.bufferedreader; import java.io.inputstreamreader; import java.net.httpurlconnection; import java.net.url; import java.util.arraylist; import java.util.hashmap; import java.util.list; import org.json.jsonarray; import org.json.jsonexception; import org.json.jsonobject; import android.content.context; import android.util.log; public class jsondecode { BufferedReader buffer=null;//json 을버퍼형태로가져오기위해선언 Context mcontext; static int distance_temp=0; static public List<HashMap<String, String>> list_loc_point = new ArrayList<HashMap<String,String>>(); HashMap<String, String> loc_point = new HashMap<String, String>(); // 값을저장하기위해 ArrayList<HashMap<"key","value">> 로선언 URL url=null; HttpURLConnection urlconnection=null; //URL 로값을주고받기위해선언 StringBuffer json_data=new StringBuffer(); //json 파일을저장하기위해선언 String Temp=null; public String geturl(){ String urlstring = new String(); urlstring=" =".replaceall("\\p{space","") +(Double.toString(DaumMap.alitems.get(0).getMapPoint().getMapPointWCONGCoord().x).replaceAll("\\p{Space","")) +"&sy=".replaceall("\\p{space","") +(Double.toString(DaumMap.alitems.get(0).getMapPoint().getMapPointWCONGCoord().y).replaceAll("\\p{Space","")) +"&ex=".replaceall("\\p{space","") +(Double.toString(DaumMap.alitems.get(1).getMapPoint().getMapPointWCONGCoord().x).replaceAll("\\p{Space","")) +"&ey=".replaceall("\\p{space","") +(Double.toString(DaumMap.alitems.get(1).getMapPoint().getMapPointWCONGCoord().y).replaceAll("\\p{Space","")).replaceAll("\\p{Space",""); return urlstring; // 저장된경로로 json 파일을받기위한 url 을구성

18 public void getjson(){ //json 을가져오는메서드 String line=null; String temp=geturl().tostring(); String mapurl=temp; try { url = new URL(mapURL); urlconnection=(httpurlconnection)url.openconnection(); Temp=urlConnection.toString(); buffer = new BufferedReader(new InputStreamReader(urlConnection.getInputStream(),"EUC-KR"),8192); //Url 스트림을열어 EUC-KR 로인코딩하여값을버퍼로읽어옴 while((line=buffer.readline())!=null){ json_data.append(line); // 버퍼의크기가다할때까지문장단위로 json_data 에붙임 urlconnection.disconnect(); //url 스트림을닫음 buffer.close(); // 버퍼를종료 catch (Exception e){ finally{ try{ buffer.close(); catch (Exception e2) { // 예외처리 public void parseforjson() throws JSONException{ //jasonparsing 을위한메서드 //json 구조를들어가기위해차례대로선언 JSONObject json = new JSONObject(json_data.toString()); json=json.getjsonobject("car"); distance_temp=integer.valueof(json.getstring("totallength")); JSONArray nodes_temp= json.getjsonarray("nodes"); //nodes 에있는정보를가지고옴 for(int i = 0; i < nodes_temp.length(); i++) { JSONObject jtemp=nodes_temp.getjsonobject(i); loc_point.put("ypoint"+i, jtemp.getstring("y")); loc_point.put("xpoint"+i, jtemp.getstring("x")); list_loc_point.add(loc_point); // 키값을읽어서값으로 ArrayList 에저장 public void getroute(){ //json 파일을가지고와서파싱까지수행하는메서드이메서드로값을얻는다. getjson(); try{ parseforjson(); catch (JSONException e){ Log.e(TAG,"getRoute() : "+e.tostring()); - MainActivity.java : 최초시작 Activity package com.android.taximap; import java.util.arraylist; import android.app.activity; import android.app.alertdialog; import android.content.dialoginterface; import android.content.intent; import android.database.cursor; import android.os.bundle; import android.view.view; import android.widget.adapterview; import android.widget.adapterview.onitemlongclicklistener; import android.widget.button; import android.widget.listview; import android.widget.toast; public class MainActivity extends Activity { Button btn_map,btn_exit;

19 ListView lv01; ArrayList<Favorate> mfavorarray; Favorate mfavorate; FavorateAdapter lvadapter; dbopenhelper mdbopenhelper; Cursor public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.main); btn_map=(button)findviewbyid(r.id.btn_showmap); btn_exit=(button)findviewbyid(r.id.btn_exit); lv01=(listview)findviewbyid(r.id.listview01); btn_map.setonclicklistener(new View.OnClickListener() { public void onclick(view v) { Intent intent=new Intent(MainActivity.this,DaumMap.class); startactivity(intent); Toast.makeText(getBaseContext(), " 위치지정화면으로이동합니다 ", Toast.LENGTH_SHORT).show(); ); btn_exit.setonclicklistener(new View.OnClickListener() { public void onclick(view v) { Toast.makeText(getBaseContext(), " 종료합니다.", Toast.LENGTH_SHORT).show(); Kill_app(); ); mfavorarray=new ArrayList<Favorate>();// 리스트뷰를구현하기위해 mdbopenhelper=new dbopenhelper(this); mdbopenhelper.open();//db 제어를위한헬퍼를개방 CursortoArray();// 리스트뷰에 db 내용을가져오기위한커서 lvadapter=new FavorateAdapter(this, R.layout.favorate, mfavorarray);// 커스텀어답터선언 lv01.setadapter(lvadapter);// 어답터를셋팅 lv01.setonitemlongclicklistener(new OnItemLongClickListener(){ // 리스트의아이템이선택되었을때의동작 public boolean onitemlongclick(adapterview<?> arg0, View arg1, final int position, long arg3) { final boolean result = mdbopenhelper.deletecolumn(position+1); AlertDialog.Builder dlg = new AlertDialog.Builder(MainActivity.this); dlg.settitle(" 삭제확인 ").setmessage(" 삭제하시겠습니까?").setPositiveButton("OK", new DialogInterface.OnClickListener() { public void onclick(dialoginterface dialog, int which) { if(result){ mfavorarray.remove(position); lvadapter.setarraylist(mfavorarray); lvadapter.notifydatasetchanged(); Toast.makeText(getBaseContext(), " 즐겨찾기항목삭제..", Toast.LENGTH_SHORT).show(); else{ Toast.makeText(getBaseContext(), "Index 오류 ", Toast.LENGTH_SHORT).show(); ).setnegativebutton("cancel",new DialogInterface.OnClickListener() { public void onclick(dialoginterface dialog, int which) { // TODO Auto-generated method stub ); ).show(); return false; protected void Kill_app() { movetasktoback(true); android.os.process.killprocess(android.os.process.mypid()); // 프로세스킬시키는함수 private void CursortoArray(){ mcursor=null; mcursor=mdbopenhelper.getallcolumns(); while(mcursor.movetonext()){ mfavorate=new Favorate(

20 mcursor.close(); //db 부터커서가가르키는것을리스트로가지고온다. mcursor.getint(mcursor.getcolumnindex("_id")), mcursor.getstring(mcursor.getcolumnindex("address")), mcursor.getdouble(mcursor.getcolumnindex("xpoint")), mcursor.getdouble(mcursor.getcolumnindex("ypoint")) ); mfavorarray.add(mfavorate);