MapManager.java의 mListener 부분에 추가시켜준다.
    		sAddress = "";
    		sAddress = getGeocode(location.getLatitude(), location.getLongitude()); // 주소 받아옴
    		Toast.makeText(contxet, ""+sAddress, Toast.LENGTH_SHORT).show();
위치 정보를 받아오면 해당 위치의 주소를 반환시킨다.


MapManager.java에 추가시켜준다.
/* 주소 검색 */
	private String getGeocode(double ALatitude, double ALongitude) {
		String sResult = "";

    	Geocoder mGeocoder = new Geocoder(contxet);
        try {
            Iterator
mAddresses = mGeocoder.getFromLocation(ALatitude, ALongitude, 1).iterator(); if (mAddresses != null) { while (mAddresses.hasNext()) { Address namedLoc = mAddresses.next(); String addLine = namedLoc.getAddressLine(0); sResult += String.format("%s\n", addLine); } } return sResult; } catch (IOException e) { return "주소 검색 실패"; } } // getGeocode
위치 정보 수신시 접근. 주소를 반환한다.
getFromLocation(위도, 경도, 1~5); 3번째 인자값이 커지면 더 많은 주소를 반환. 





추가 파일
MapManager.java : 위치 찾기
DialogManager.java : 다이얼로그 관리


MainActivity에 MapManager 인스턴스 생성.

MapManager.java
import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapController;

public class MapManager {

	private DialogManager mDialogManager;
	private MapController mMapController;
	private LocationManager mLocationManager;
	private String mProvider;					// 공급자
	
	public MapManager(Context context) {
		mDialogManager = new DialogManager(context);
		
		mMapController = MyGps.mMapController;
		
		mLocationManager = (LocationManager)context.getSystemService(context.LOCATION_SERVICE);
	//	mProvider = mLocationManager.GPS_PROVIDER; 				// GPS
		mProvider = mLocationManager.NETWORK_PROVIDER;			// NETWORK
	}
	
	/* 위치 찾기 */
	public void SearchLocation() {
		mLocationManager.requestLocationUpdates(mProvider, 1000, 0, mListener);
		mDialogManager.Loading();
	}
	
    LocationListener mListener = new LocationListener() {
    	public void onLocationChanged(Location location) {
    		GeoPoint point = new GeoPoint((int)(location.getLatitude()*1E6), (int)(location.getLongitude()*1E6));
    		mMapController.animateTo(point); 									// 위치로 이동
    		mLocationManager.removeUpdates(mListener);							// 해제
    		mDialogManager.LoadingEnd();
    	}

    	public void onProviderDisabled(String provider) {
    		// 추가 : 공급자 사용불가 처리
    	}

    	public void onProviderEnabled(String provider) {
    	}

    	public void onStatusChanged(String provider, int status, Bundle extras) {
    	}
	}; // mListener
}
- mProvider : 공급자 선택 ( GPS를 사용하면 더욱 정확한 위치 확인가능. )
mLocationManager.requestLocationUpdates(mProvider, 1000, 0, mListener); (공급자, 1초, 0m, mListener);  시간과 거리는 AND가 아닌 OR. ex) 100초, 1000m 일경우, 1000m를 움직이지 않아도 100초 후에는 자동으로 갱신이 된다. 
- MainActivity에서 만든 메뉴 1번에 SearchLocation();을 연결한다. 메뉴 선택 후 '위치찾기'시 위치를 찾는중이라는 다이얼로그를 띄워준다. 
 위치를 찾으면 다이얼로그와 위치찾기를 해제시킨다. ( 배터리 소모 방지 ) 


DialogManager.java
import android.app.ProgressDialog;
import android.content.Context;

public class DialogManager {

	private Context context;
	private ProgressDialog mProgressDialog;
	
	public DialogManager(Context context) {
		this.context = context;
	}
	
	/* loading 구현*/
    public void Loading() {
    	mProgressDialog = ProgressDialog.show(context, null, "위치 정보 받는중...", true, false);
    }
    
    /* loading 끝 */
    public void LoadingEnd() {
    	mProgressDialog.dismiss();
    }
}
위치를 찾을때는 보여주고, 찾고 난 후 제거해 준다.



앞으로 구글맵을 공부하면서 넣을 기능.

1. 내 위치 찾기
2. 내 위치 저장하기
3. 저장된 위치 삭제하기
4. 저장된 위치와 내 위치 비교(선 긋기)
5. 나침반

일단 구글맵을 띄우고 메뉴버튼을 눌렀을때 옵션을 넣었습니다.


public abstract MenuItem add (int groupId, int itemId, int order, CharSequence titleRes)
메뉴의 그룹과 정렬 방식은 필요하지 않으니 0으로 두고 고유번호와 이름만 넣었습니다.

MyGps.java

  /* 옵션 추가 */
  @Override
  public boolean onCreateOptionsMenu(Menu menu) {
    menu.add(010"내 위치");
        menu.add(020"위치 저장");
        menu.add(030"저장된 위치");
        menu.add(040"종료");
        return true;
  }

  /* 옵션 기능 */
  @Override
  public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
      case 1:    // 내 위치
        break;
      case 2:    // 위치 저장
        break;
      case 3:    // 저장된 위치
        break;
      case 4:    // 종료
        finish();
    }
    return true;
  }

ERROR/MapActivity(8037): Couldn't get connection factory client

구글맵을 띄우려고 했는데 단말기에서 테스트를 해봤더니 에러가뜬다...



구글맵을 띄우려면 API KEY가 있어야합니다

에뮬상에서는 디버그용키만 있어도 사용이 가능하지만 실제 단말기에서는 릴리즈용키가 없다면 바둑판모양 배경만 보입니다.

하루종일 찾아봤지만 릴리즈용키에대한 정보는 그리 많은것 같지않아 정리해둬야겠다는 생각이..

릴리즈용키로 API KEY를 얻게되면 APK가 서명되지 않았다면 맵이 정상적으로 작동하지 않아요.


일단, 릴리즈용키를 만들려면 서명된 keystore가 있어야하구요.

keystore 생성 참고
http://www.androidpub.com/?mid=android_dev_info&sort_index=voted_count&order_type=desc&document_srl=56913



jdk\bin 폴더안에 keytool이 있는데, 이를 편하게 사용하기 위해 환경변수 설정이 안되어있다면

bin폴더를 환경변수에 추가시켜줍니다.





환경변수 설정이 끝났으면 윈도우키 + R을 누르고 cmd를 입력하여 명령프롬프트창을 열고

서명이 완료된 keystore가 있는곳으로 이동.

keytool -list -v -keystore androidkeystore 라고 입력을하고 keystore에 설정했던 비밀번호를 입력.



keystore를 만들때 입력했던 정보가 뜨는데, 이중에서 MD5라고 쓰여있는 FE:5D:...........82:8E 모두 복사.


 

위 페이지로 이동해 복사한 값을 빈칸에 적어주고 Generate API Key 클릭!

빨간색 사각형안에 있는 Key값을 잘 저장해 놓으면 됩니다.



처음에 이 키값을 넣고 맵으 띄웠는데 바둑판 모양만 나와서 왜그런가 했는데..

크롬으로 돌려보니 서명이 된 응용프로그램에서 사용 할 수 있다고 쓰여있군요...


키값을 넣어주고 APK에 서명을 해준뒤 실행해 보았더니 잘되네요!



Manifest


    

    
        
            
                
                
            
        
	
    
    
	

퍼미션과 라이브러리 추가.
 

 

main.xml


	

위에서 얻어온 Key 값을 대입해 준다.
 

 

MainActivity.java
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;

import android.os.Bundle;

public class MyGps extends MapActivity {
    /** Called when the activity is first created. */

	public static MapView mMapView;
	public static MapController mMapController;
	
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

		mMapView = (MapView)findViewById(R.id.mapView);
		mMapController = mMapView.getController();
		mMapController.setZoom(18);						// 기본줌 18
		mMapView.setBuiltInZoomControls(true);			// 확대 축소 기능

	//	mMapView.setSatellite(true);					// 위성모드
		mMapView.setStreetView(true);					// 지도모드
    }

	@Override
	protected boolean isRouteDisplayed() {
		// TODO Auto-generated method stub
		return false;
	}
}
지도 출력시 줌을 18로 설정.
setZoom(); 1 ~ 21 까지 사용 가능. 위성지도 사용시 한국에서는 보안상 최대 16까지 사용가능. (15였나?)



'Android > GPS' 카테고리의 다른 글

[MyGps_04] 주소 가져오기  (0) 2011.04.18
[MyGps_03] 내 위치 찾기  (0) 2011.04.17
[MyGps_02] 구글맵 메뉴 옵션 넣기  (0) 2011.01.26

+ Recent posts