Вы не инициализировали свой экземпляр менеджера местоположений.Измените конструктор адаптеров, как показано ниже:
public RecieverAdapter(RecieveBlood recieveBlood, List<BloodData> data) {
this.context = recieveBlood;
inflater = LayoutInflater.from( context );
this.data = data;
this.RAdapter = this;
searchData = new ArrayList<>( data );
//Initialize Location manager
locationManager = (LocationManager) getContext().getSystemService(Context.LOCATION_SERVICE);
}
И учтите, что использование getLastKnownLocation()
может вернуть старое и устаревшее местоположение, как описано в документации для Android:
ВозвращаетМестоположение, указывающее данные из последнего известного исправления местоположения, полученного от данного поставщика.
Это может быть сделано без запуска поставщика.Обратите внимание, что это местоположение может быть устаревшим, например, если устройство было выключено и перемещено в другое местоположение.
Если поставщик в настоящее время отключен, возвращается значение null.
Существуют отличные объяснения нескольких способов получения местоположения по ссылке ниже: https://developer.android.com/guide/topics/location/strategies
ОБНОВЛЕНИЕ
Я добавил логику locationListener ниже,но лучше всего размещать код извлечения местоположения в вашей активности или фрагменте, помните, что locationListener должен быть удален, когда активность или фрагмент закрыты.используйте locationManager.removeUpdates(locationListener)
для удаления locationListener.
void getLocation() {
if (ContextCompat.checkSelfPermission(context, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(context, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions( (Activity) context, new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION, android.Manifest.permission.ACCESS_COARSE_LOCATION}, 101);
}else{
Location location = locationManager.getLastKnownLocation( LocationManager.NETWORK_PROVIDER );
if(location != null){
double lati = location.getLatitude();
double longi = location.getLongitude();
Log.e(TAG,"Location :" +lati+ " ,"+longi );
} else {
boolean isNetworkAvailable = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
if(isNetworkAvailable) fetchCurrentLocation()
else //Redirect user to device settings in order to turn on location service
}
}
}
Вы должны реализовать locationListener, как показано ниже:
fetchCurrentLocation() {
try {
LocationListener locationListener = new LocationListener() {
@Override
public void onLocationChanged(final Location location) {
if (location != null) {
locationManager.removeUpdates(this);
double lati = location.getLatitude();
double longi = location.getLongitude();
Log.e(TAG,"Location :" +lati+ " ,"+longi );
}
}
@Override
public void onProviderDisabled(String s) {
locationManager.removeUpdates(this);
}
@Override
public void onStatusChanged(String s, int i, Bundle bundle) {
}
@Override
public void onProviderEnabled(String s) {
}
};
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 500L,30f, locationListener);
} catch (SecurityException e) {
e.printStackTrace();
}
}