Hello,
Today we are going to take an example of fetch current location using android app.
github link: https://github.com/ravi-nimavat128/getcurrentlocation
gradle file :-
compile 'com.google.android.gms:play-services-location:11.0.2'
implementation 'com.karumi:dexter:4.2.0'
AndroidMainfest.xml
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<service
android:name=".GeocodeAddressIntentService"
android:exported="false"/>
Constants.java
public class Constants {
public static final int SUCCESS_RESULT = 0;
public static final int FAILURE_RESULT = 1;
public static final int USE_ADDRESS_NAME = 1;
public static final int USE_ADDRESS_LOCATION = 2;
public static final String PACKAGE_NAME = "com.example.sys3.getcurrentlocation";
public static final String RECEIVER = PACKAGE_NAME + ".RECEIVER";
public static final String RESULT_DATA_KEY = PACKAGE_NAME + ".RESULT_DATA_KEY";
public static final String RESULT_ADDRESS = PACKAGE_NAME + ".RESULT_ADDRESS";
public static final String LOCATION_LATITUDE_DATA_EXTRA = PACKAGE_NAME + ".LOCATION_LATITUDE_DATA_EXTRA";
public static final String LOCATION_LONGITUDE_DATA_EXTRA = PACKAGE_NAME + ".LOCATION_LONGITUDE_DATA_EXTRA";
public static final String LOCATION_NAME_DATA_EXTRA = PACKAGE_NAME + ".LOCATION_NAME_DATA_EXTRA";
public static final String FETCH_TYPE_EXTRA = PACKAGE_NAME + ".FETCH_TYPE_EXTRA";
}
GeocodeAddressIntentService.java
public class GeocodeAddressIntentService extends IntentService {
protected ResultReceiver resultReceiver;
private static final String TAG = "GEO_ADDY_SERVICE";
public GeocodeAddressIntentService() {
super("GeocodeAddressIntentService");
}
@Override
protected void onHandleIntent(Intent intent) {
Log.e(TAG, "onHandleIntent");
Geocoder geocoder = new Geocoder(this, Locale.getDefault());
String errorMessage = "";
List<Address> addresses = null;
int fetchType = intent.getIntExtra(Constants.FETCH_TYPE_EXTRA, 0);
Log.e(TAG, "fetchType == " + fetchType);
if(fetchType == Constants.USE_ADDRESS_NAME) {
String name = intent.getStringExtra(Constants.LOCATION_NAME_DATA_EXTRA);
try {
addresses = geocoder.getFromLocationName(name, 1);
} catch (IOException e) {
errorMessage = "Service not available";
Log.e(TAG, errorMessage, e);
}
}
else if(fetchType == Constants.USE_ADDRESS_LOCATION) {
double latitude = intent.getDoubleExtra(Constants.LOCATION_LATITUDE_DATA_EXTRA, 0);
double longitude = intent.getDoubleExtra(Constants.LOCATION_LONGITUDE_DATA_EXTRA, 0);
try {
addresses = geocoder.getFromLocation(latitude, longitude, 1);
} catch (IOException ioException) {
errorMessage = "Service Not Available";
Log.e(TAG, errorMessage, ioException);
} catch (IllegalArgumentException illegalArgumentException) {
errorMessage = "Invalid Latitude or Longitude Used";
Log.e(TAG, errorMessage + ". " +
"Latitude = " + latitude + ", Longitude = " +
longitude, illegalArgumentException);
}
}
else {
errorMessage = "Unknown Type";
Log.e(TAG, errorMessage);
}
resultReceiver = intent.getParcelableExtra(Constants.RECEIVER);
if (addresses == null || addresses.size() == 0) {
if (errorMessage.isEmpty()) {
errorMessage = "Not Found";
Log.e(TAG, errorMessage);
}
deliverResultToReceiver(Constants.FAILURE_RESULT, errorMessage, null);
} else {
for(Address address : addresses) {
String outputAddress = "";
for(int i = 0; i < address.getMaxAddressLineIndex(); i++) {
outputAddress += " --- " + address.getAddressLine(i);
}
Log.e(TAG, outputAddress);
}
Address address = addresses.get(0);
ArrayList<String> addressFragments = new ArrayList<>();
for(int i = 0; i < address.getMaxAddressLineIndex(); i++) {
addressFragments.add(address.getAddressLine(i));
}
Log.i(TAG, "Address Found");
deliverResultToReceiver(Constants.SUCCESS_RESULT,
TextUtils.join(System.getProperty("line.separator"),
addressFragments), address);
}
}
private void deliverResultToReceiver(int resultCode, String message, Address address) {
Bundle bundle = new Bundle();
bundle.putParcelable(Constants.RESULT_ADDRESS, address);
bundle.putString(Constants.RESULT_DATA_KEY, message);
resultReceiver.send(resultCode, bundle);
}
}
MainActivity.java
public class MainActivity extends AppCompatActivity {
AddressResultReceiverClass mResultReceiver;
EditText latitudeEdit, longitudeEdit;
ProgressBar progressBar;
TextView infoText;
CheckBox checkBox;
Button location, FetchButton;
private static final String TAG = "MAIN_ACTIVITY";
private FusedLocationProviderClient mFusedLocationClient;
private SettingsClient mSettingsClient;
private LocationRequest mLocationRequest;
private LocationSettingsRequest mLocationSettingsRequest;
private LocationCallback mLocationCallback;
private Location mCurrentLocation;
private Boolean mRequestingLocationUpdates;
private static final long UPDATE_INTERVAL_IN_MILLISECONDS = 10000;
private static final long FASTEST_UPDATE_INTERVAL_IN_MILLISECONDS = 5000;
private static final int REQUEST_CHECK_SETTINGS = 100;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
longitudeEdit = (EditText) findViewById(R.id.longitudeEdit);
latitudeEdit = (EditText) findViewById(R.id.latitudeEdit);
progressBar = (ProgressBar) findViewById(R.id.progressBar);
infoText = (TextView) findViewById(R.id.infoText);
checkBox = (CheckBox) findViewById(R.id.checkbox);
FetchButton = (Button) findViewById(R.id.FetchButton);
mResultReceiver = new AddressResultReceiverClass(null);
location = (Button) findViewById(R.id.location);
location.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startLocationButtonClick();
}
});
init();
FetchButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!latitudeEdit.getText().toString().isEmpty() && !longitudeEdit.getText().toString().isEmpty())
{
Geocoder geocoder;
List<Address> addresses;
geocoder = new Geocoder(MainActivity.this, Locale.getDefault());
double latitude = Double.parseDouble(latitudeEdit.getText().toString());
double longitude = Double.parseDouble(longitudeEdit.getText().toString());
try {
addresses = geocoder.getFromLocation(latitude, longitude, 1); // Here 1 represent max location result to returned, by documents it recommended 1 to 5
String address = addresses.get(0).getAddressLine(0); // If any additional address line present than only, check with max available address lines by getMaxAddressLineIndex()
String city = addresses.get(0).getLocality();
String state = addresses.get(0).getAdminArea();
String country = addresses.get(0).getCountryName();
String postalCode = addresses.get(0).getPostalCode();
String knownName = addresses.get(0).getFeatureName();
Log.w("address", address);
Log.w("city", city);
Log.w("state", state);
Log.w("country", country);
Log.w("postcode", postalCode);
Log.w("address", address);
infoText.setText("address : " + address + "");
} catch (IOException e) {
e.printStackTrace();
}
}else {
Toast.makeText(getApplicationContext(),"Please fetch location first",Toast.LENGTH_SHORT).show();
}
}
});
restoreValuesFromBundle(savedInstanceState);
}
class AddressResultReceiverClass extends ResultReceiver {
public AddressResultReceiverClass(Handler handler) {
super(handler);
}
@Override
protected void onReceiveResult(int resultCode, final Bundle resultData) {
if (resultCode == Constants.SUCCESS_RESULT) {
final Address address = resultData.getParcelable(Constants.RESULT_ADDRESS);
runOnUiThread(new Runnable() {
@Override
public void run() {
progressBar.setVisibility(View.GONE);
infoText.setVisibility(View.VISIBLE);
infoText.setText("Latitude " + address.getLatitude() + "\n " +
"Longtude " + address.getLongitude() + "\n " +
"Address: " + resultData.getString(Constants.RESULT_DATA_KEY));
}
});
} else {
runOnUiThread(new Runnable() {
@Override
public void run() {
progressBar.setVisibility(View.GONE);
infoText.setVisibility(View.VISIBLE);
infoText.setText(resultData.getString(Constants.RESULT_DATA_KEY));
}
});
}
}
}
private void init() {
mFusedLocationClient = LocationServices.getFusedLocationProviderClient(this);
mSettingsClient = LocationServices.getSettingsClient(this);
mLocationCallback = new LocationCallback() {
@Override
public void onLocationResult(LocationResult locationResult) {
super.onLocationResult(locationResult);
mCurrentLocation = locationResult.getLastLocation();
updateLocationUI();
}
};
mRequestingLocationUpdates = false;
mLocationRequest = new LocationRequest();
mLocationRequest.setInterval(UPDATE_INTERVAL_IN_MILLISECONDS);
mLocationRequest.setFastestInterval(FASTEST_UPDATE_INTERVAL_IN_MILLISECONDS);
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder();
builder.addLocationRequest(mLocationRequest);
mLocationSettingsRequest = builder.build();
}
private void restoreValuesFromBundle(Bundle savedInstanceState) {
if (savedInstanceState != null) {
if (savedInstanceState.containsKey("is_requesting_updates")) {
mRequestingLocationUpdates = savedInstanceState.getBoolean("is_requesting_updates");
}
if (savedInstanceState.containsKey("last_known_location")) {
mCurrentLocation = savedInstanceState.getParcelable("last_known_location");
}
if (savedInstanceState.containsKey("last_updated_on")) {
}
}
updateLocationUI();
}
private void updateLocationUI() {
if (mCurrentLocation != null) {
String lo = String.valueOf(mCurrentLocation.getLongitude());
String ia = String.valueOf(mCurrentLocation.getLatitude());
longitudeEdit.setText(lo);
latitudeEdit.setText(ia);
infoText.setAlpha(0);
infoText.animate().alpha(1).setDuration(300);
}
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putBoolean("is_requesting_updates", mRequestingLocationUpdates);
outState.putParcelable("last_known_location", mCurrentLocation);
// outState.putString("last_updated_on", mLastUpdateTime);
}
private void startLocationUpdates() {
mSettingsClient
.checkLocationSettings(mLocationSettingsRequest)
.addOnSuccessListener(this, new OnSuccessListener<LocationSettingsResponse>() {
@SuppressLint("MissingPermission")
@Override
public void onSuccess(LocationSettingsResponse locationSettingsResponse) {
Log.i(TAG, "All location settings are satisfied.");
Toast.makeText(getApplicationContext(), "Started location updates!", Toast.LENGTH_SHORT).show();
//noinspection MissingPermission
mFusedLocationClient.requestLocationUpdates(mLocationRequest,
mLocationCallback, Looper.myLooper());
updateLocationUI();
}
})
.addOnFailureListener(this, new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
int statusCode = ((ApiException) e).getStatusCode();
switch (statusCode) {
case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
Log.i(TAG, "Location settings are not satisfied. Attempting to upgrade " +
"location settings ");
try {
// Show the dialog by calling startResolutionForResult(), and check the
// result in onActivityResult().
ResolvableApiException rae = (ResolvableApiException) e;
rae.startResolutionForResult(MainActivity.this, REQUEST_CHECK_SETTINGS);
} catch (IntentSender.SendIntentException sie) {
Log.i(TAG, "PendingIntent unable to execute request.");
}
break;
case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
String errorMessage = "Location settings are inadequate, and cannot be " +
"fixed here. Fix in Settings.";
Log.e(TAG, errorMessage);
Toast.makeText(MainActivity.this, errorMessage, Toast.LENGTH_LONG).show();
}
updateLocationUI();
}
});
}
public void startLocationButtonClick() {
// Requesting ACCESS_FINE_LOCATION using Dexter library
Dexter.withActivity(MainActivity.this)
.withPermission(Manifest.permission.ACCESS_FINE_LOCATION)
.withListener(new PermissionListener() {
@Override
public void onPermissionGranted(PermissionGrantedResponse response) {
mRequestingLocationUpdates = true;
startLocationUpdates();
}
@Override
public void onPermissionDenied(PermissionDeniedResponse response) {
if (response.isPermanentlyDenied()) {
// open device settings when the permission is
// denied permanently
openSettings();
}
}
@Override
public void onPermissionRationaleShouldBeShown(PermissionRequest permission, PermissionToken token) {
token.continuePermissionRequest();
}
}).check();
}
private void openSettings() {
Intent intent = new Intent();
intent.setAction(
Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package",
BuildConfig.APPLICATION_ID, null);
intent.setData(uri);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
@Override
public void onResume() {
super.onResume();
if (mRequestingLocationUpdates && checkPermissions()) {
startLocationUpdates();
}
updateLocationUI();
}
private boolean checkPermissions() {
int permissionState = ActivityCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_FINE_LOCATION);
return permissionState == PackageManager.PERMISSION_GRANTED;
}
@Override
protected void onPause() {
super.onPause();
if (mRequestingLocationUpdates) {
stopLocationUpdates();
}
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<EditText
android:id="@+id/latitudeEdit"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Latitude"
android:inputType="numberDecimal|numberSigned" />
<EditText
android:id="@+id/longitudeEdit"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/latitudeEdit"
android:hint="Longitude"
android:inputType="numberDecimal|numberSigned" />
<Button
android:id="@+id/FetchButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/longitudeEdit"
android:layout_centerHorizontal="true"
android:text="Fetch Address" />
<TextView
android:id="@+id/infoText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/FetchButton" />
<ProgressBar
android:id="@+id/progressBar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/FetchButton"
android:layout_centerHorizontal="true"
android:visibility="invisible" />
<Button
android:id="@+id/location"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:text="Fetch Location" />
</RelativeLayout>
Output
Today we are going to take an example of fetch current location using android app.
github link: https://github.com/ravi-nimavat128/getcurrentlocation
gradle file :-
compile 'com.google.android.gms:play-services-location:11.0.2'
implementation 'com.karumi:dexter:4.2.0'
AndroidMainfest.xml
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<service
android:name=".GeocodeAddressIntentService"
android:exported="false"/>
Constants.java
public class Constants {
public static final int SUCCESS_RESULT = 0;
public static final int FAILURE_RESULT = 1;
public static final int USE_ADDRESS_NAME = 1;
public static final int USE_ADDRESS_LOCATION = 2;
public static final String PACKAGE_NAME = "com.example.sys3.getcurrentlocation";
public static final String RECEIVER = PACKAGE_NAME + ".RECEIVER";
public static final String RESULT_DATA_KEY = PACKAGE_NAME + ".RESULT_DATA_KEY";
public static final String RESULT_ADDRESS = PACKAGE_NAME + ".RESULT_ADDRESS";
public static final String LOCATION_LATITUDE_DATA_EXTRA = PACKAGE_NAME + ".LOCATION_LATITUDE_DATA_EXTRA";
public static final String LOCATION_LONGITUDE_DATA_EXTRA = PACKAGE_NAME + ".LOCATION_LONGITUDE_DATA_EXTRA";
public static final String LOCATION_NAME_DATA_EXTRA = PACKAGE_NAME + ".LOCATION_NAME_DATA_EXTRA";
public static final String FETCH_TYPE_EXTRA = PACKAGE_NAME + ".FETCH_TYPE_EXTRA";
}
GeocodeAddressIntentService.java
public class GeocodeAddressIntentService extends IntentService {
protected ResultReceiver resultReceiver;
private static final String TAG = "GEO_ADDY_SERVICE";
public GeocodeAddressIntentService() {
super("GeocodeAddressIntentService");
}
@Override
protected void onHandleIntent(Intent intent) {
Log.e(TAG, "onHandleIntent");
Geocoder geocoder = new Geocoder(this, Locale.getDefault());
String errorMessage = "";
List<Address> addresses = null;
int fetchType = intent.getIntExtra(Constants.FETCH_TYPE_EXTRA, 0);
Log.e(TAG, "fetchType == " + fetchType);
if(fetchType == Constants.USE_ADDRESS_NAME) {
String name = intent.getStringExtra(Constants.LOCATION_NAME_DATA_EXTRA);
try {
addresses = geocoder.getFromLocationName(name, 1);
} catch (IOException e) {
errorMessage = "Service not available";
Log.e(TAG, errorMessage, e);
}
}
else if(fetchType == Constants.USE_ADDRESS_LOCATION) {
double latitude = intent.getDoubleExtra(Constants.LOCATION_LATITUDE_DATA_EXTRA, 0);
double longitude = intent.getDoubleExtra(Constants.LOCATION_LONGITUDE_DATA_EXTRA, 0);
try {
addresses = geocoder.getFromLocation(latitude, longitude, 1);
} catch (IOException ioException) {
errorMessage = "Service Not Available";
Log.e(TAG, errorMessage, ioException);
} catch (IllegalArgumentException illegalArgumentException) {
errorMessage = "Invalid Latitude or Longitude Used";
Log.e(TAG, errorMessage + ". " +
"Latitude = " + latitude + ", Longitude = " +
longitude, illegalArgumentException);
}
}
else {
errorMessage = "Unknown Type";
Log.e(TAG, errorMessage);
}
resultReceiver = intent.getParcelableExtra(Constants.RECEIVER);
if (addresses == null || addresses.size() == 0) {
if (errorMessage.isEmpty()) {
errorMessage = "Not Found";
Log.e(TAG, errorMessage);
}
deliverResultToReceiver(Constants.FAILURE_RESULT, errorMessage, null);
} else {
for(Address address : addresses) {
String outputAddress = "";
for(int i = 0; i < address.getMaxAddressLineIndex(); i++) {
outputAddress += " --- " + address.getAddressLine(i);
}
Log.e(TAG, outputAddress);
}
Address address = addresses.get(0);
ArrayList<String> addressFragments = new ArrayList<>();
for(int i = 0; i < address.getMaxAddressLineIndex(); i++) {
addressFragments.add(address.getAddressLine(i));
}
Log.i(TAG, "Address Found");
deliverResultToReceiver(Constants.SUCCESS_RESULT,
TextUtils.join(System.getProperty("line.separator"),
addressFragments), address);
}
}
private void deliverResultToReceiver(int resultCode, String message, Address address) {
Bundle bundle = new Bundle();
bundle.putParcelable(Constants.RESULT_ADDRESS, address);
bundle.putString(Constants.RESULT_DATA_KEY, message);
resultReceiver.send(resultCode, bundle);
}
}
MainActivity.java
public class MainActivity extends AppCompatActivity {
AddressResultReceiverClass mResultReceiver;
EditText latitudeEdit, longitudeEdit;
ProgressBar progressBar;
TextView infoText;
CheckBox checkBox;
Button location, FetchButton;
private static final String TAG = "MAIN_ACTIVITY";
private FusedLocationProviderClient mFusedLocationClient;
private SettingsClient mSettingsClient;
private LocationRequest mLocationRequest;
private LocationSettingsRequest mLocationSettingsRequest;
private LocationCallback mLocationCallback;
private Location mCurrentLocation;
private Boolean mRequestingLocationUpdates;
private static final long UPDATE_INTERVAL_IN_MILLISECONDS = 10000;
private static final long FASTEST_UPDATE_INTERVAL_IN_MILLISECONDS = 5000;
private static final int REQUEST_CHECK_SETTINGS = 100;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
longitudeEdit = (EditText) findViewById(R.id.longitudeEdit);
latitudeEdit = (EditText) findViewById(R.id.latitudeEdit);
progressBar = (ProgressBar) findViewById(R.id.progressBar);
infoText = (TextView) findViewById(R.id.infoText);
checkBox = (CheckBox) findViewById(R.id.checkbox);
FetchButton = (Button) findViewById(R.id.FetchButton);
mResultReceiver = new AddressResultReceiverClass(null);
location = (Button) findViewById(R.id.location);
location.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startLocationButtonClick();
}
});
init();
FetchButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!latitudeEdit.getText().toString().isEmpty() && !longitudeEdit.getText().toString().isEmpty())
{
Geocoder geocoder;
List<Address> addresses;
geocoder = new Geocoder(MainActivity.this, Locale.getDefault());
double latitude = Double.parseDouble(latitudeEdit.getText().toString());
double longitude = Double.parseDouble(longitudeEdit.getText().toString());
try {
addresses = geocoder.getFromLocation(latitude, longitude, 1); // Here 1 represent max location result to returned, by documents it recommended 1 to 5
String address = addresses.get(0).getAddressLine(0); // If any additional address line present than only, check with max available address lines by getMaxAddressLineIndex()
String city = addresses.get(0).getLocality();
String state = addresses.get(0).getAdminArea();
String country = addresses.get(0).getCountryName();
String postalCode = addresses.get(0).getPostalCode();
String knownName = addresses.get(0).getFeatureName();
Log.w("address", address);
Log.w("city", city);
Log.w("state", state);
Log.w("country", country);
Log.w("postcode", postalCode);
Log.w("address", address);
infoText.setText("address : " + address + "");
} catch (IOException e) {
e.printStackTrace();
}
}else {
Toast.makeText(getApplicationContext(),"Please fetch location first",Toast.LENGTH_SHORT).show();
}
}
});
restoreValuesFromBundle(savedInstanceState);
}
class AddressResultReceiverClass extends ResultReceiver {
public AddressResultReceiverClass(Handler handler) {
super(handler);
}
@Override
protected void onReceiveResult(int resultCode, final Bundle resultData) {
if (resultCode == Constants.SUCCESS_RESULT) {
final Address address = resultData.getParcelable(Constants.RESULT_ADDRESS);
runOnUiThread(new Runnable() {
@Override
public void run() {
progressBar.setVisibility(View.GONE);
infoText.setVisibility(View.VISIBLE);
infoText.setText("Latitude " + address.getLatitude() + "\n " +
"Longtude " + address.getLongitude() + "\n " +
"Address: " + resultData.getString(Constants.RESULT_DATA_KEY));
}
});
} else {
runOnUiThread(new Runnable() {
@Override
public void run() {
progressBar.setVisibility(View.GONE);
infoText.setVisibility(View.VISIBLE);
infoText.setText(resultData.getString(Constants.RESULT_DATA_KEY));
}
});
}
}
}
private void init() {
mFusedLocationClient = LocationServices.getFusedLocationProviderClient(this);
mSettingsClient = LocationServices.getSettingsClient(this);
mLocationCallback = new LocationCallback() {
@Override
public void onLocationResult(LocationResult locationResult) {
super.onLocationResult(locationResult);
mCurrentLocation = locationResult.getLastLocation();
updateLocationUI();
}
};
mRequestingLocationUpdates = false;
mLocationRequest = new LocationRequest();
mLocationRequest.setInterval(UPDATE_INTERVAL_IN_MILLISECONDS);
mLocationRequest.setFastestInterval(FASTEST_UPDATE_INTERVAL_IN_MILLISECONDS);
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder();
builder.addLocationRequest(mLocationRequest);
mLocationSettingsRequest = builder.build();
}
private void restoreValuesFromBundle(Bundle savedInstanceState) {
if (savedInstanceState != null) {
if (savedInstanceState.containsKey("is_requesting_updates")) {
mRequestingLocationUpdates = savedInstanceState.getBoolean("is_requesting_updates");
}
if (savedInstanceState.containsKey("last_known_location")) {
mCurrentLocation = savedInstanceState.getParcelable("last_known_location");
}
if (savedInstanceState.containsKey("last_updated_on")) {
}
}
updateLocationUI();
}
private void updateLocationUI() {
if (mCurrentLocation != null) {
String lo = String.valueOf(mCurrentLocation.getLongitude());
String ia = String.valueOf(mCurrentLocation.getLatitude());
longitudeEdit.setText(lo);
latitudeEdit.setText(ia);
infoText.setAlpha(0);
infoText.animate().alpha(1).setDuration(300);
}
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putBoolean("is_requesting_updates", mRequestingLocationUpdates);
outState.putParcelable("last_known_location", mCurrentLocation);
// outState.putString("last_updated_on", mLastUpdateTime);
}
private void startLocationUpdates() {
mSettingsClient
.checkLocationSettings(mLocationSettingsRequest)
.addOnSuccessListener(this, new OnSuccessListener<LocationSettingsResponse>() {
@SuppressLint("MissingPermission")
@Override
public void onSuccess(LocationSettingsResponse locationSettingsResponse) {
Log.i(TAG, "All location settings are satisfied.");
Toast.makeText(getApplicationContext(), "Started location updates!", Toast.LENGTH_SHORT).show();
//noinspection MissingPermission
mFusedLocationClient.requestLocationUpdates(mLocationRequest,
mLocationCallback, Looper.myLooper());
updateLocationUI();
}
})
.addOnFailureListener(this, new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
int statusCode = ((ApiException) e).getStatusCode();
switch (statusCode) {
case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
Log.i(TAG, "Location settings are not satisfied. Attempting to upgrade " +
"location settings ");
try {
// Show the dialog by calling startResolutionForResult(), and check the
// result in onActivityResult().
ResolvableApiException rae = (ResolvableApiException) e;
rae.startResolutionForResult(MainActivity.this, REQUEST_CHECK_SETTINGS);
} catch (IntentSender.SendIntentException sie) {
Log.i(TAG, "PendingIntent unable to execute request.");
}
break;
case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
String errorMessage = "Location settings are inadequate, and cannot be " +
"fixed here. Fix in Settings.";
Log.e(TAG, errorMessage);
Toast.makeText(MainActivity.this, errorMessage, Toast.LENGTH_LONG).show();
}
updateLocationUI();
}
});
}
public void startLocationButtonClick() {
// Requesting ACCESS_FINE_LOCATION using Dexter library
Dexter.withActivity(MainActivity.this)
.withPermission(Manifest.permission.ACCESS_FINE_LOCATION)
.withListener(new PermissionListener() {
@Override
public void onPermissionGranted(PermissionGrantedResponse response) {
mRequestingLocationUpdates = true;
startLocationUpdates();
}
@Override
public void onPermissionDenied(PermissionDeniedResponse response) {
if (response.isPermanentlyDenied()) {
// open device settings when the permission is
// denied permanently
openSettings();
}
}
@Override
public void onPermissionRationaleShouldBeShown(PermissionRequest permission, PermissionToken token) {
token.continuePermissionRequest();
}
}).check();
}
private void openSettings() {
Intent intent = new Intent();
intent.setAction(
Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package",
BuildConfig.APPLICATION_ID, null);
intent.setData(uri);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
@Override
public void onResume() {
super.onResume();
if (mRequestingLocationUpdates && checkPermissions()) {
startLocationUpdates();
}
updateLocationUI();
}
private boolean checkPermissions() {
int permissionState = ActivityCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_FINE_LOCATION);
return permissionState == PackageManager.PERMISSION_GRANTED;
}
@Override
protected void onPause() {
super.onPause();
if (mRequestingLocationUpdates) {
stopLocationUpdates();
}
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<EditText
android:id="@+id/latitudeEdit"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Latitude"
android:inputType="numberDecimal|numberSigned" />
<EditText
android:id="@+id/longitudeEdit"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/latitudeEdit"
android:hint="Longitude"
android:inputType="numberDecimal|numberSigned" />
<Button
android:id="@+id/FetchButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/longitudeEdit"
android:layout_centerHorizontal="true"
android:text="Fetch Address" />
<TextView
android:id="@+id/infoText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/FetchButton" />
<ProgressBar
android:id="@+id/progressBar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/FetchButton"
android:layout_centerHorizontal="true"
android:visibility="invisible" />
<Button
android:id="@+id/location"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:text="Fetch Location" />
</RelativeLayout>
Output
Comments
Post a Comment