location service의 활성화 여부를 체크해서 처리하는 코드는 다음과 같이 처리하시면 될 것 같습니다.
먼저, 아래처럼 메소드를 재활용하기 위해서 Location provider의 활성화 여부를 체크하는 유틸리티 클래스를 하나 만드세요.
public class LocationUtils {
private final LocationManager locationManager;
public LocationUtils(Context context) {
locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
}
public boolean isLocationServiceEnabled() {
return isGpsProviderEnabled() && isNetworkProviderEnabled();
}
public boolean isGpsProviderEnabled() {
return isLocationProviderEnabled(LocationManager.GPS_PROVIDER);
}
public boolean isNetworkProviderEnabled() {
return isLocationProviderEnabled(LocationManager.NETWORK_PROVIDER);
}
private boolean isLocationProviderEnabled(String provider) {
try {
return locationManager.isProviderEnabled(provider);
} catch(Exception ex) {
return false;
}
}
}
그리고 사용자를 location서비스 세팅화면으로 보낼 ActivityResultContract를 만듧니다. ActivityResultContract는 최근에 도입된 것으로 startActivityForResult를 대체하기 위해 사용되고 있습니다.
public class LocationSettingsContracts extends ActivityResultContract<Void, Void> {
@NonNull
@Override
public Intent createIntent(@NonNull Context context, Void s) {
return new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
}
@Override
public Void parseResult(int i, @Nullable Intent intent) {
// LocationUtils를 사용해서 세팅값을 체크할 것이므로 Void타입을 리턴.
return null;
}
}
액티비티에서는, 해당 기능이 활성화 되어 있지 않으면, 설정화면으로 사용자를 보냅니다.
private LocationUtils locationUtils;
private ActivityResultLauncher<Void> locationSettingsContract = registerForActivityResult(
new LocationSettingsContracts(),
unused -> handleLocationSettings()
);
private void handleLocationSettings() {
if (!locationUtils.isGpsProviderEnabled()){
Toast.makeText(this, "GPS is OFF",Toast.LENGTH_SHORT).show();
return;
}
fetchLocation();
}
@Override
protected void onCreate(Bundle savedInstanceState) {
locationUtils = new LocationUtils(this);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initViews();
}
private void initViews() {
Button actionButton = findViewById(R.id.actionButton);
actionButton.setOnClickListener(v -> {
requestLocation();
});
}
private void requestLocation() {
if (!locationUtils.isGpsProviderEnabled()){
locationSettingsContract.launch(null);
return;
}
fetchLocation();
}
private void fetchLocation() {
}
위에서 나온 흐름대로 해당 서비스가 비활성화 되어 있다면, 사용자를 설정화면으로 보내고, 설정 결과를 받아온 후에 위치를 요청하고, 서비스가 활성화 상태라면 바로 위치를 요청하면 되겠죠.
종이에 위의 흐름을 흐름도나 Pseudo code 형태로 정리해보시면 그렇게 어렵지 않게 이해하실 수 있을 겁니다.