Здесь я получаю пин-код пользователя после преобразования широты и долготы местоположения пользователя в гео-местоположение с помощью класса Geocoder. Я хочу получить доступ к пин-коду, который был сгенерирован в onLocationResult () для последующего использования в функции doInBackground (). Что я уже пробовал? 1. освобождает глобальную переменную в классе locationGet, затем присваивает ей значение в onLocationResult. 2. освобождает переменную в функции doInBackground (), но android studio предлагает преобразовать ее из строки в окончательный массив строк, но, опять же, я не получаю значение .
public class locationGet extends AsyncTask<Void, Void , Void> {
//background worker
String geoLocation;
ProgressDialog progressDialog;
AlertDialog alertDialog;
Context context;
@RequiresApi(api = Build.VERSION_CODES.KITKAT)
public locationGet(Context ctx) {
context = ctx;
}
@Override
protected void onPreExecute() {
Log.d("test1", "onPreExecute");
alertDialog = new AlertDialog.Builder(context).create();
alertDialog.setTitle("Error");
progressDialog = new ProgressDialog(context);
progressDialog.setCancelable(false);
progressDialog.setMessage("Processing");
showDialog();
}
private void showDialog() {
Log.d("test1", "Progress bar is started");
if (!progressDialog.isShowing()) {
progressDialog.show();
}
}
private void hideDialog() {
Log.d("test1", "progress bar is stopped");
if (progressDialog.isShowing())
progressDialog.dismiss();
}
@Override
protected Void doInBackground(Void... voids) {
Log.d("test1", "doInBackground");
LocationRequest locationRequest = new LocationRequest();
locationRequest.setInterval(10000);
locationRequest.setFastestInterval(3000);
locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
LocationServices.getFusedLocationProviderClient(context)
.requestLocationUpdates(locationRequest, new LocationCallback() {
@Override
public void onLocationResult(LocationResult locationResult) {
super.onLocationResult(locationResult);
LocationServices.getFusedLocationProviderClient(context)
.removeLocationUpdates(this);
if (locationResult != null && locationResult.getLocations().size() > 0) {
int latestLocationIndex = locationResult.getLocations().size() - 1;
double latitude =
locationResult.getLocations().get(latestLocationIndex).getLatitude();
double longitude =
locationResult.getLocations().get(latestLocationIndex).getLongitude();
Location location = new Location("providerNA");
location.setLatitude(latitude);
location.setLongitude(longitude);
//till here we got latitude and longitude
//converting longitude and latitude into address
String errorMessage = "";
Geocoder geocoder = new Geocoder(context, Locale.getDefault());
List<Address> addresses = null;
try {
addresses = geocoder.getFromLocation(location.getLatitude(), location.getLongitude(), 1);
} catch (Exception exception) {
errorMessage = exception.getMessage();
}
if (addresses == null || addresses.isEmpty()) {
Log.d("test1", errorMessage);
} else {
//we got the address
Address address = addresses.get(0);
String geoaddress=address.getAddressLine(0);
//finding pin code substring in address geoAddress String
int h = geoaddress.lastIndexOf(',');
String pincode=geoaddress.substring(h-5,h);
geoLocation = pincode;
}
hideDialog();
} else {
hideDialog();}
}
}, Looper.getMainLooper());
Log.d("test1","User's Pin Code = "+geoLocation); //but geoLocation is null though it has been initilised onLocationResult()
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
Log.d("test1","onPostExecute");
}
}