Kakao Map API 를 이용하던 중 현재 위치를 받아오는 작업을 하며 해당 오류가 생겼습니다.
Manifest 파일 내에
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOACTION"/>
이 코드를 작성했는데도 오류가 생기곤합니다.
Manifest에 권한을 명시해주었어도 따로 Runtime Permission 요청을 직접 해야합니다.
저는 다음
https://webnautes.tistory.com/1319
https://youngest-programming.tistory.com/163
두개의 티스토리 글을 참고해 요청을 해주었습니다.
밑 코드는 mapview에서 현재 위치를 받아오는 내용입니다.
맵뷰에 관한 리스너 내용은 생략하겠습니다.
MapVIew mMapView = new MapView(this);
private static final int GPS_ENABLE_REQUEST_CODE = 2001;
private static final int PERMISSIONS_REQUEST_CODE = 100;
String[] REQUIRED_PERMISSIONS = {Manifest.permission.ACCESS_FINE_LOCATION};
mMapView.setCurrentLocationEventListener(this);
if (!checkLocationServiceStatus()){
showDialogForLocationServiceSetting();}
else{
checkRunTimePermission();
}
//setCurrentLocationTrackingMode (지도랑 현재위치 좌표 찍어주고 따라다닌다.)
mMapView.setCurrentLocationTrackingMode(MapView.CurrentLocationTrackingMode.TrackingModeOnWithoutHeading);
// 현재 위치 업데이트 setCurrentLocationEventListener
@Override
public void onCurrentLocationUpdate(MapView mapView, MapPoint mapPoint, float accuracyInMeters) {
MapPoint.GeoCoordinate mapPointGeo = mapPoint.getMapPointGeoCoord();
Log.i(TAG, String.format("MapView onCurrentLocationUpdate (%f,%f) accuracy (%f)", mapPointGeo.latitude, mapPointGeo.longitude, accuracyInMeters));
currentMapPoint = MapPoint.mapPointWithGeoCoord(mapPointGeo.latitude, mapPointGeo.longitude);
//이 좌표로 지도 중심 이동
mMapView.setMapCenterPoint(currentMapPoint, true);
//전역변수로 현재 좌표 저장
mCurrentLat = mapPointGeo.latitude;
mCurrentLng = mapPointGeo.longitude;
Log.d(TAG, "현재위치 => " + mCurrentLat + " " + mCurrentLng);
mLoaderLayout.setVisibility(View.GONE);
//트래킹 모드가 아닌 단순 현재위치 업데이트일 경우, 한번만 위치 업데이트하고 트래킹을 중단시키기 위한 로직
if (!isTrackingMode) {
mMapView.setCurrentLocationTrackingMode(MapView.CurrentLocationTrackingMode.TrackingModeOff);
}
}
@Override
public void onCurrentLocationDeviceHeadingUpdate(MapView mapView, float v) {
}
@Override
public void onCurrentLocationUpdateFailed(MapView mapView) {
Log.i(TAG, "onCurrentLocationUpdateFailed");
mMapView.setCurrentLocationTrackingMode(MapView.CurrentLocationTrackingMode.TrackingModeOnWithoutHeading);
}
@Override
public void onCurrentLocationUpdateCancelled(MapView mapView) {
Log.i(TAG, "onCurrentLocationUpdateCancelled");
mMapView.setCurrentLocationTrackingMode(MapView.CurrentLocationTrackingMode.TrackingModeOnWithoutHeading);
}
void checkRunTimePermission() {
int hasFineLocationPermission = ContextCompat.checkSelfPermission(MainActivity.this,Manifest.permission.ACCESS_FINE_LOCATION);
if (hasFineLocationPermission == PackageManager.PERMISSION_GRANTED){
mMapView.setCurrentLocationTrackingMode(MapView.CurrentLocationTrackingMode.TrackingModeOnWithHeading);
}else{
if(ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this,REQUIRED_PERMISSIONS[0])){
Toast.makeText(MainActivity.this,"이 앱을 실행하려면 위치 접근 권한이 필요합니다.",Toast.LENGTH_LONG).show();
ActivityCompat.requestPermissions(MainActivity.this,REQUIRED_PERMISSIONS,PERMISSIONS_REQUEST_CODE);
}else{
ActivityCompat.requestPermissions(MainActivity.this,REQUIRED_PERMISSIONS,PERMISSIONS_REQUEST_CODE);
}
}
}
private void showDialogForLocationServiceSetting(){
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setTitle("위치 서비스 비활성화");
builder.setMessage("앱을 사용하기 위해 위치 서비스가 필요합니다.");
builder.setCancelable(true);
builder.setPositiveButton("설정",new DialogInterface.OnClickListener(){
@Override
public void onClick(DialogInterface dialog, int which) {
Intent callGPSSettingIntent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
startActivityForResult(callGPSSettingIntent,GPS_ENABLE_REQUEST_CODE);
}
});
builder.create().show();
}