Хассан,
Рассматривали ли вы использование Служб Google при поиске своего местоположения.Я предпочитаю использовать это.Ниже приведен пример, однако вам потребуется
Настройка ключа API Google на консоли API Google: https://console.developers.google.com/?pli=1
Выберите Maps SDK для Android и включите его, затем сгенерируйте в нем ключ API.
Скопируйте и вставьте ключ API в файл strings.xml в вашем проекте
Добавьте следующую зависимость в ваш файл app.gradle
implementation 'com.google.android.gms:play-services-maps:16.1.0'
Добавьте следующее в свой AndroidManifest.xml послетег приложения
<meta-data
android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />
<meta-data
android:name="com.google.android.geo.API_KEY"
android:value="@string/google_maps_key" />
<meta-data
android:name="com.google.android.maps.v2.API_KEY"
android:value="@string/google_maps_key" />
Реализация следующих классов
public class MainActivity extends AppCompatActivity
implements OnMapReadyCallback,
GoogleApiClient.ConnectionCallbacks,
GoogleApiClient.OnConnectionFailedListener, LocationListener {
/*Declare the following Variables */
private final static int PLAY_SERVICES_RESOLUTION_REQUEST = 1000;
private boolean mRequestingLocationUpdates = false;
private static int UPDATE_INTERVAL = 10000; // 10 sec
private static int FATEST_INTERVAL = 5000; // 5 sec
private static int DISPLACEMENT = 10; // 10 meters
public GoogleApiClient mGoogleApiClient;
LocationRequest mLocationRequest;
Location mLastLocation;
public static double lat = 0, lng = 0;
LocationManager locationManager;
Location location = null;
Создайте следующие функции вне функции OnCreate
protected synchronized void buildGoogleApiClient() {
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(LocationServices.API)
.build();
mGoogleApiClient.connect();
createLocationRequest();
}
protected void createLocationRequest() {
mLocationRequest = new LocationRequest();
mLocationRequest.setInterval(UPDATE_INTERVAL);
mLocationRequest.setFastestInterval(FATEST_INTERVAL);
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
mLocationRequest.setSmallestDisplacement(DISPLACEMENT);
}
@SuppressLint("MissingPermission")
protected void startLocationUpdates() {
try {
LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, (LocationListener) this);
} catch (Exception e) {
Log.d("LOCATION_MSG", e.getMessage());
}
}
protected void stopLocationUpdates() {
LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, (LocationListener) this);
}
Вызовите buildGoogleApiClient () в вашем onCreate
Переопределите методы
@Override
public void onConnected(@Nullable Bundle bundle) {
mLocationRequest = new LocationRequest();
mLocationRequest.setInterval(UPDATE_INTERVAL);
mLocationRequest.setFastestInterval(FATEST_INTERVAL);
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
mLocationRequest.setSmallestDisplacement(DISPLACEMENT);
}
@Override
public void onConnectionSuspended(int i) {
mGoogleApiClient.connect();
}
@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
}
@SuppressLint("MissingPermission")
@Override
public void onLocationChanged(Location location) {
mLastLocation = location;
mLastLocation = LocationServices.FusedLocationApi
.getLastLocation(mGoogleApiClient);
}
@Override
public void onMapReady(GoogleMap googleMap) {
}
В вашем прослушивателе OnClick:
fab.setOnClickListener
Добавьте это
mLastLocation = LocationServices.FusedLocationApi
.getLastLocation(mGoogleApiClient);
startLocationUpdates();
if (mLastLocation != null)
{
try {
lat = mLastLocation.getLatitude();
lng = mLastLocation.getLongitude();
} catch (Exception e) {
lat = 0;
lng = 0;
}
/* Check your log cat for the following */
Log.d("LOC_Latitude" , Double.toString(lat));
Log.d("LOC_Longitude" , Double.toString(lng));
}else{
//Something is a miss, maybe the location service on your phone is not on, it could even be the internet connection.
}
Замечания. Убедитесь, что у вас есть все необходимые разрешения для манифеста, для некоторых устройств требуются разрешения, запрашиваемые во время выполнения.Вы можете использовать следующее для этого
/ * Объявите этот метод вне нашей функции onCreate * /
public static boolean hasPermissions(Context context, String... permissions) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && context != null && permissions != null) {
for (String permission : permissions) {
if (ActivityCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED) {
return false;
}
}
}
return true;
}
/*Add this in your onCreate Function */
String[] PERMISSIONS = {Manifest.permission.INTERNET, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION};
if (!hasPermissions(this, PERMISSIONS)) {
ActivityCompat.requestPermissions(this, PERMISSIONS, 1);
}
Также убедитесь, что у вас есть следующие разрешения на вашемAndroidManifest.xml
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
Попробуйте и восстановите в любом случае, если вы все еще застряли.