Android
[Android] 디바이스 위치: LocationManager
eyoo
2022. 7. 29. 10:12
위치 기반 서비스를 개발하기 위해선 LocationManager를 사용해야 한다.
LocationManager 매뉴얼:
https://developer.android.com/reference/android/location/LocationManager
LocationManager | Android Developers
android.net.wifi.hotspot2.omadm
developer.android.com
위치 권한을 주기위해 Manifest에서 위치권한을 준다.
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
이제 메인에서 locationManager와 locationListener를 사용해서 사용자의 위치를 위도 경도로 나타내게 한다.
public class MainActivity extends AppCompatActivity {
LocationManager locationManager;
LocationListener locationListener;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
locationManager = (LocationManager) this.getSystemService(LOCATION_SERVICE);
locationListener = new LocationListener() {
@Override
public void onLocationChanged(@NonNull Location location) {
Log.i("MyApp", "위도 " + location.getLatitude());
Log.i("MyApp", "경도 " + location.getLongitude());
}
};
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
3000, 3, locationListener);
# requestLocationUpdates에서 3000은 ms단위로 시간이 지날때마다 위치를 가져오는것이고, 그 다음 파라미터의 3은 3미터마다 움직이면 갱신된다.
이때 requestLocationUpdates의 코드가 붉게 변하는데 위치 권한을 사용자로 받아줄수 있도록 Add Permission check를 누른다.
그럼 그 위에 if문이 추가되는데 거기에서 퍼미션, 리퀘스트 코드를 작성한다.
public class MainActivity extends AppCompatActivity {
LocationManager locationManager;
LocationListener locationListener;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
locationManager = (LocationManager) this.getSystemService(LOCATION_SERVICE);
locationListener = new LocationListener() {
@Override
public void onLocationChanged(@NonNull Location location) {
Log.i("MyApp", "위도 " + location.getLatitude());
Log.i("MyApp", "경도 " + location.getLongitude());
}
};
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
// 퍼미션, 리퀘스트코드
ActivityCompat.requestPermissions(MainActivity.this,
new String[]{Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION}, 100);
return;
}
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
3000, 3, locationListener);
}
}
# 100은 리퀘스트 코드로 설정한것이다.
이제 onCreate함수 바깥에 onRequestPermissionsResult를 오버라이드 한 후 리퀘스트 코드가 100일때 실행되는 코드를 위에서 가져와 작성한다.
public class MainActivity extends AppCompatActivity {
LocationManager locationManager;
LocationListener locationListener;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
locationManager = (LocationManager) this.getSystemService(LOCATION_SERVICE);
locationListener = new LocationListener() {
@Override
public void onLocationChanged(@NonNull Location location) {
Log.i("MyApp", "위도 " + location.getLatitude());
Log.i("MyApp", "경도 " + location.getLongitude());
}
};
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(MainActivity.this,
new String[]{ Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION}, 100);
return;
}
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
3000, 3, locationListener);
}
//여기
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if(requestCode == 100){
if(ActivityCompat.checkSelfPermission(MainActivity.this,
Manifest.permission.ACCESS_FINE_LOCATION) !=
PackageManager.PERMISSION_GRANTED &&
ActivityCompat.checkSelfPermission(MainActivity.this,
Manifest.permission.ACCESS_FINE_LOCATION) !=
PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(MainActivity.this,
new String[]{Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION}, 100);
return;
}
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
3000, 3, locationListener);
}
}
}
에뮬레이터를 실행시키면 권한 설정하라고 나온다
위도 경도가 로그에 잘 찍히는것을 볼수있다.