package com.example.locationfine;
import android.Manifest;
import android.content.pm.PackageManager;
import android.location.Address;
import android.location.Geocoder;
import android.location.Location;
import android.os.Bundle;
import android.os.Looper;
import android.util.Log;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import com.google.android.gms.location.*;
import java.io.IOException;
import java.util.List;
import java.util.Locale;
public class MainActivity extends AppCompatActivity {
private FusedLocationProviderClient fusedLocationClient;
private static final int REQ_FINE = 1001;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
fusedLocationClient = LocationServices.getFusedLocationProviderClient(this);
getPreciseLocation();
}
private void getPreciseLocation() {
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, REQ_FINE);
return;
}
LocationRequest request = LocationRequest.create()
.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
.setInterval(5000)
.setFastestInterval(2000)
.setNumUpdates(1);
fusedLocationClient.requestLocationUpdates(request, new LocationCallback() {
@Override
public void onLocationResult(@NonNull LocationResult result) {
Location location = result.getLastLocation();
if (location != null) {
getAddress(location.getLatitude(), location.getLongitude());
}
}
}, Looper.getMainLooper());
}
private void getAddress(double lat, double lng) {
Geocoder geocoder = new Geocoder(this, Locale.KOREA);
try {
List<Address> results = geocoder.getFromLocation(lat, lng, 1);
if (!results.isEmpty()) {
Address addr = results.get(0);
String province = addr.getAdminArea(); // 광역 시/도 (예: 경기도, 서울특별시)
String city = addr.getLocality(); // 시/군 (예: 김포시, 성남시)
String district = addr.getSubLocality(); // 구 (예: 분당구, 강남구). 구가 없으면 null 또는 시 이름과 동일할 수 있음.
Log.d("FINE_LOCATION", "주소: " + province + " " + city + " " + district);
Log.d("FINE_LOCATION", "위도: " + lat + ", 경도:" + lng);
// TODO Region, Gcoder(lt, lng)정보를 여기서 넘긴다.
}
} catch (IOException e) {
Log.e("FINE_LOCATION", "Geocoder 실패", e);
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQ_FINE && grantResults.length > 0 &&
grantResults[0] == PackageManager.PERMISSION_GRANTED) {
getPreciseLocation();
} else {
Log.e("FINE_LOCATION", "권한 거부됨");
}
}
}