Я пытаюсь получить локализацию устройства с приложением android. У меня проблема с ним, иногда он возвращает ноль, даже если включена локализация / Wi-Fi / 4G.
Я проводил некоторые исследования. У нас есть:
- провайдер локализации, который использует спутники для обеспечения локализации
- провайдер сети, который использует Wifi / сотовую вышку для обеспечения локализации
==> провайдер локализованного соединения использует лучший способ между ними.
Но проблема в том, что я никогда не смогу получить локализацию, если я включу только "локализацию". Я должен активировать Wi-Fi или 4G + локализация и даже иногда это не работает.
Вот мой код (я использую "//" в коде, чтобы объяснить, где у меня проблемы):
public class HelperClass
{
private static final String FINE_LOCATION = Manifest.permission.ACCESS_FINE_LOCATION;
private static final String COURSE_LOCATION = Manifest.permission.ACCESS_COARSE_LOCATION;
private static final int LOCATION_PERMISSION_REQUEST_CODE = 1234;
public void GetLocations(Context context, Activity activity)
{
Boolean mLocationPermissionsGranted = false;
Log.d(TAG, "getLocationPermission: getting location permissions");
String[] permissions = {Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION};
if(ContextCompat.checkSelfPermission(context.getApplicationContext(),
FINE_LOCATION) == PackageManager.PERMISSION_GRANTED){
if(ContextCompat.checkSelfPermission(context.getApplicationContext(),
COURSE_LOCATION) == PackageManager.PERMISSION_GRANTED){
mLocationPermissionsGranted = true;
}else{
ActivityCompat.requestPermissions(activity,
permissions,
LOCATION_PERMISSION_REQUEST_CODE);
}
}else{
ActivityCompat.requestPermissions(activity,
permissions,
LOCATION_PERMISSION_REQUEST_CODE);
}
if (mLocationPermissionsGranted) // && isLocationEnabled(context) ((1)CHECK below)
{
getDeviceLocation(context, mLocationPermissionsGranted);
if (ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION)
!= PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(context,
Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
}
}
}
private void getDeviceLocation(final Context context, Boolean mLocationPermissionsGranted)
{
Log.d(TAG, "getDeviceLocation: getting the devices current location");
FusedLocationProviderClient mFusedLocationProviderClient;
mFusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(context);
try{
if(mLocationPermissionsGranted){
final Task location = mFusedLocationProviderClient.getLastLocation();
location.addOnCompleteListener(new OnCompleteListener() {
@Override
public void onComplete(@NonNull Task task) {
if(task.isSuccessful()){
Log.d(TAG, "onComplete: found location!");
Location currentLocation = (Location) task.getResult(); //PROBLEM HERE !!!
//currentLocation is null sometimes even if wifi + localisation is enabled !
if (currentLocation != null) {
double Latit = currentLocation.getLatitude();
double Longit = currentLocation.getLongitude();
LatLng latLong = new LatLng(Latit, Longit);
//TODO Do something with LatLng
}
else //if currentLocation is null, try to get last location
{
Log.i("CheckLocation", "null");
LocationManager lm =
(LocationManager)context.getSystemService(Context.LOCATION_SERVICE);
Location location = null;
if (lm != null)
{
Log.i("CheckLocation", "Not null");
location = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
//PROBLEM if currentLocation is null, this is also null so it doesn't help ...
double longitude = location.getLongitude();
Log.i("CheckLocation", "Long" + longitude);
double latitude = location.getLatitude();
Log.i("CheckLocation", "Lat" + latitude);
}
else
{
Log.i("CheckLocation", "Last location return null");
}
}
}else{
Log.d(TAG, "onComplete: current location is null");
Toast.makeText(context, "unable to get current location", Toast.LENGTH_SHORT).show();
}
}
});
}
}catch (SecurityException e){
Log.e(TAG, "getDeviceLocation: SecurityException: " + e.getMessage() );
}
}
}
// (1) Я пытался добавить эту функцию, чтобы проверить ЕСЛИ МЕСТОПОЛОЖЕНИЕ ВКЛЮЧЕНО
// Похоже, что когда currentLocation возвращает ноль, network_enabled возвращает false // gps_enabled обычно возвращает true
public boolean isLocationEnabled(Context context)
{
LocationManager lm = (LocationManager)context.getSystemService(Context.LOCATION_SERVICE);
boolean gps_enabled = false;
boolean network_enabled = false;
try {
gps_enabled = lm.isProviderEnabled(LocationManager.GPS_PROVIDER);
} catch(Exception ex) {}
if (gps_enabled)
{
Log.i("CheckNewtork", "Gps true" );
}
else
{
Log.i("CheckNewtork", "Gps false" );
}
try {
network_enabled = lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
} catch(Exception ex) {}
if (network_enabled)
{
Log.i("CheckNewtork", "Network true" );
}
else
{
Log.i("CheckNewtork", "Network false" );
}
return (gps_enabled);
}
Вот как я вызываю функции из действия:
helperClass.GetLocations(this, MainActivity.this);
У кого-нибудь есть идеи как это исправить? Моему приложению нужна локализация, и я не могу полагаться на то, что «иногда это работает, иногда нет». Спасибо за вашу помощь