차근차근/Android

안드로이드 위치정보 권한

예쁜꽃이피었으면 2015. 1. 7. 13:40

검색어 :안드로이드 위치정보 권한 



http://ankyu.entersoft.kr/Lecture/android/gps_01.asp


 안드로이드  > 위도/경로 - 위치 정보를 구하는 방법  

	이번 포스트에서는 안드로이드 앱이 위치 정보를 어떻게 구할 수 있는지 알아봅니다
	
	
	1. 먼저 위치 정보를 구하기 위한 권한을 설정합니다. 
	
		
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" > </uses-permission> <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" > </uses-permission>
2. LocationListener 인터페이스를 구현하는 클래스를 정의하세요. 이 클래스는 위치 정보를 위치 공급자로부터 지속적으로 받아오는 역할을 합니다. 오버라이드 해야 하는 메소드들은 다음과 같습니다. void onLocationChanged(Location location) . 위치 정보를 가져올 수 있는 메소드입니다. . 위치 이동이나 시간 경과 등으로 인해 호출됩니다. . 최신 위치는 location 파라메터가 가지고 있습니다. . 최신 위치를 가져오려면, location 파라메터를 이용하시면 됩니다. void onProviderDisabled(String provider) . 위치 공급자가 사용 불가능해질(disabled) 때 호출 됩니다. . 단순히 위치 정보를 구한다면, 코드를 작성하실 필요는 없습니다. void onProviderEnabled(String provider) . 위치 공급자가 사용 가능해질(enabled) 때 호출 됩니다. . 단순히 위치 정보를 구한다면, 코드를 작성하실 필요는 없습니다. void onStatusChanged(String provider, int status, Bundle extras) . 위치 공급자의 상태가 바뀔 때 호출 됩니다. . 단순히 위치 정보를 구한다면, 코드를 작성하실 필요는 없습니다.
LocationListener locationListener = new LocationListener() { @Override public void onLocationChanged(Location location) { } @Override public void onProviderDisabled(String provider) { } @Override public void onProviderEnabled(String provider) { } @Override public void onStatusChanged(String provider, int status, Bundle extras) { } };
3. onLocationChanged 메소드에서 위치 정보를 읽어 오세요. location 파라메터로부터 읽으시면 됩니다. Location 객체로부터 위도(latitude)와 경도(longitude)를 비롯한 위치 정보를 구할 수 있습니다.
double latitude = location.getLatitude(); double longitude = location.getLongitude();
사용예)
private Location lastKnownLocation = null ; private LocationListener locationListener = new LocationListener() { @Override public void onLocationChanged(Location location) { LocationManager lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE); // Get the last location. lastKnownLocation = location; } @Override public void onProviderDisabled(String provider) {} @Override public void onProviderEnabled(String provider) {} @Override public void onStatusChanged(String provider, int status, Bundle extras) {} };
4. 컨텍스트로부터 위치 관리자를 구하세요. 액티비티 클래스 내에서 위치 관리자를 구한다고 가정합니다. 그러면 액티비티의 상위 클래스인 Context 클래스의 getSystemService 메소드를 호출하면 되는 것이죠.
LocationManager lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
5. 위치 관리자에게 위치의 갱신을 요청하세요. 필요한 메소드는 LocationManager의 requestLocationUpdates입니다. 파라메터는 다음과 같습니다. String provider . 위치 공급자를 대입하세요. . 참고로 지정 가능한 값들은 다음과 같습니다. LocationManager.GPS_PROVIDER LocationManager.NETWORK_PROVIDER LocationManager.PASSIVE_PROVIDER long minTime . 위치 갱신하는데 필요한 최소 시간 간격입니다. 단위는 millisecond입니다. float minDistance . 위치를 갱신하는데 필요한 최소 거리입니다. 단위는 미터입니다. LocationListener listener . 위치 갱신을 처리할 리스너입니다. 2에서 구현한 리스너 객체의 이름을 대입해 주시면 되겠습니다. 위치 공급자가 GPS이고, 갱신에 필요한 최소 시간 간격이 1초(1000 milliseconds)이며, 최소 거리가 10미터인 위치 갱신을 요구한다고 가정해 봅시다. 코드는 다음과 같습니다. 리스너는 2에서 구현한 것을 listener 파라메터에 대입하였습니다.
lm.requestLocationUpdates( LocationManager.GPS_PROVIDER, 1000, 10, locationListener );
6. 위치 갱신이 더 이상 필요하지 않으면, LocationManager의 removeUpdates 메소드를 호출하세요. 파라메터는 다음과 같습니다. LocationListener listener . 위치 갱신을 처리하던 리스너입니다. 이것을 대입해야 위치 갱신이 중단됩니다. 위치 정보를 가져온 후 바로 갱신 중단을 원한다면, 다음과 같이 코드를 작성하시면 됩니다.
LocationListener locationListener = new LocationListener() { @Override public void onLocationChanged(Location location) { LocationManager lm = (LocationManager)getSystemService(Context. LOCATION_SERVICE); // Get the last location. lastKnownLocation = location; // Stop the update as soon as get the location. lm.removeUpdates(locationListener); } @Override public void onProviderDisabled(String provider) { } @Override public void onProviderEnabled(String provider) {} @Override public void onStatusChanged(String provider, int status, Bundle extras) { } };
아래 예제는 버튼을 눌러 GPS 로 부터 위도/경도 값을 뽑아 Toast 로 보여주는 예제 입니다.
import android.app.Activity; import android.content.Context; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.os.Bundle; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.Toast; public class GpsLocation extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.gpslocation); Button button01 = (Button) findViewById(R.id.button01); button01.setOnClickListener(new OnClickListener() { public void onClick(View v) { // startLocationService startLocationService(); } }); } private void startLocationService() { // get manager instance LocationManager manager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); // set listener GPSListener gpsListener = new GPSListener(); long minTime = 10000; float minDistance = 0; manager.requestLocationUpdates( LocationManager.GPS_PROVIDER, minTime, minDistance, gpsListener); Toast.makeText(getApplicationContext(), "Location Service started.\nyou can test using DDMS.", 2000).show(); } private class GPSListener implements LocationListener { public void onLocationChanged(Location location) { //capture location data sent by current provider Double latitude = location.getLatitude(); Double longitude = location.getLongitude(); String msg = "Latitude : "+ latitude + "\nLongitude:"+ longitude; Log.i("GPSLocationService", msg); Toast.makeText(getApplicationContext(), msg, 2000).show(); } public void onProviderDisabled(String provider) { } public void onProviderEnabled(String provider) { } public void onStatusChanged(String provider, int status, Bundle extras) { } } }



[Android] GPS를 이용해 현재 위치 지도에서 보여주기(심화)

http://ilililililililililili.blogspot.kr/2013/07/android-gps_9929.html

1. 사전 준비과정 및 지식

1.1 맵뷰와 맵액티비티

- 애플리케이션에 지도를 넣기 위해서는 화면 영역을 할당 받을 수 있도록 맵뷰(MapView)사용한다.
- 맵뷰를 사용할 때는 맵액티비티(MapActivity)를 같이 사용한다.

1.2 지도 API 키

- 구글맵을 사용할 때는 지도 API키를 발급받아 등록해야 구글서버에서 지도 데이터를 받을 수 있다.
- 지도키 받는 절차 링크 : http://ilililililililililili.blogspot.kr/2013/07/android-googlemap-api.html

1.3 구글 라이브러리의 사용

- 구글맵은 Google API가 포함된 플랫폼으로 에뮬레이터를 실행해야 한다.

1.4 매니페스트 수정

-지도를 추가하게 되면 크게 두 가지 권한(인터넷 접속 권한, GPS 위치정보 확인 권한)이 필요하다.
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
-구글 라이브러리를 사용할때는 application 태그 안에 아래와같은 태그를 넣어주어야한다
    <uses-library android:name="com.google.android.maps"/>

1.5 레이아웃에 맵뷰 추가하기

-xml 코드
    <com.google.android.maps.MapView
        android:id="@+id/mapview"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_above="@+id/scrollview"
        android:layout_below="@+id/button01"
        android:clickable="true"
        android:apikey="xxx" />
2. 예제
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
 
import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;
 
public class MyLocationMapActivity extends MapActivity {
 
 TextView text01;
 LocationManager manager;
 MapView mapview;
 
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
   
  text01 = (TextView) findViewById(R.id.text01);
  mapview = (MapView) findViewById(R.id.mapview);
   
  // 줌인 줌아웃 버튼이 나오게 하는 설정
  mapview.setBuiltInZoomControls(true);
   
  Button button01 = (Button) findViewById(R.id.button01);
  button01.setOnClickListener(new OnClickListener() {
 
   @Override
   public void onClick(View v) {
    // LocationManager 객체 초기화 , LocationListener 리스너 설정
    getMyLocation();
   }
  });
   
 
 }
 
 // LocationManager 객체 초기화 , LocationListener 리스너 설정
 private void getMyLocation() {
  if (manager == null) {
   manager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
  }
  // provider 기지국||GPS 를 통해서 받을건지 알려주는 Stirng 변수
  // minTime 최소한 얼마만의 시간이 흐른후 위치정보를 받을건지 시간간격을 설정 설정하는 변수
  // minDistance 얼마만의 거리가 떨어지면 위치정보를 받을건지 설정하는 변수
  // manager.requestLocationUpdates(provider, minTime, minDistance, listener);
 
  // 10초
  long minTime = 10000;
   
  // 거리는 0으로 설정
  // 그래서 시간과 거리 변수만 보면 움직이지않고 10초뒤에 다시 위치정보를 받는다
  float minDistance = 0;
 
  MyLocationListener listener = new MyLocationListener();
 
  manager.requestLocationUpdates(LocationManager.GPS_PROVIDER, minTime, minDistance, listener);
 
  appendText("내 위치를 요청 했습니다.");
 }
 
 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
  // Inflate the menu; this adds items to the action bar if it is present.
  getMenuInflater().inflate(R.menu.my_location, menu);
  return true;
 }
 
 private void appendText(String msg) {
  text01.append(msg + "\n");
 }
 
 class MyLocationListener implements LocationListener {
 
  // 위치정보는 아래 메서드를 통해서 전달된다.
  @Override
  public void onLocationChanged(Location location) {
   appendText("onLocationChanged()가 호출되었습니다");
 
   double latitude = location.getLatitude();
   double longitude = location.getLongitude();
 
   appendText("현재 위치:" + latitude + "," + longitude);
    
   showMyLocation(latitude,longitude);
  }
 
  @Override
  public void onProviderDisabled(String provider) {
 
  }
 
  @Override
  public void onProviderEnabled(String provider) {
 
  }
 
  @Override
  public void onStatusChanged(String provider, int status, Bundle extras) {
 
  }
 
 }
  
 private void showMyLocation(double latitude,double longitude){
  int intlatitude = new Double(latitude).intValue();
  int intlongitude = new Double(longitude).intValue();
   
  // GeoPoint - 경도와 위도를 한점으로 표시하는 객체
  GeoPoint myPoint = new GeoPoint(intlatitude, intlongitude);
   
  // 맵뷰의 속성등을 컨트롤하는 클래스(맵뷰 어뎁터)
  MapController controller = mapview.getController();
   
  // 애니메이션 효과가 나면서 점으로 이동
  controller.animateTo(myPoint);
   
  // 줌에는 단계가 있는데 정수값으로 표기한다
  controller.setZoom(17);
   
 }
 
 @Override
 protected boolean isRouteDisplayed() {
  // TODO Auto-generated method stub
  return false;
 }
}







반응형