Я пытаюсь изучить SmartLocationLibrary для Android, чтобы получить местоположение, и местоположение, которое я получаю из него, всегда равно нулю, поэтому я получаю нулевые ошибки ссылки на объект, когда пытаюсь что-то с ним сделать.
Я создал класс Utility для SmartLocatonLibrary
public class LocationUtil implements OnLocationUpdatedListener, OnActivityUpdatedListener {
private final String TAG = "LocationUtil: ";
private Location location;
private DetectedActivity activity;
private LocationGooglePlayServicesProvider provider;
private Context context;
public LocationUtil(Context context) {
this.context = context;
}
/**
* If lastLocation is not null then the location is set to last location recorded by phone
*/
public void getLastLocation(){
Location lastLocation = SmartLocation.with(context).location().getLastLocation();
if(lastLocation != null){
location = lastLocation;
}
DetectedActivity detectedActivity = SmartLocation.with(context).activity().getLastActivity();
if(detectedActivity != null) activity = detectedActivity;
}
/**
* Basically this starts the location tracking
* If you want one tick of location use .oneFix() on the smartLocation builder
* If you want continous tracking just don't add the .oneFix()
*/
public void startLocation(){
provider = new LocationGooglePlayServicesProvider();
provider.setCheckLocationSettings(true);
SmartLocation smartLocation = new SmartLocation.Builder(context).logging(true).build();
smartLocation.location(provider)
.continuous()
.start(this);
smartLocation.activity()
.start(this);
}
/**
* This stops the tracking
*/
public void stopLocation(){
SmartLocation.with(context).location().stop();
Log.d(TAG, "stopLocation: Location Stopped");
SmartLocation.with(context).activity().stop();
Log.d(TAG, "stopLocation: Activity Recognition Stopped");
}
@Override
public void onActivityUpdated(DetectedActivity detectedActivity) {
this.activity = detectedActivity;
}
@Override
public void onLocationUpdated(Location location) {
this.location = location;
}
//--------SETTERS----------
public void setProvider(LocationGooglePlayServicesProvider provider) {
this.provider = provider;
}
//--------GETTERS----------
public Location getLocation() {
return location;
}
public LocationGooglePlayServicesProvider getProvider() {
return provider;
}
}
А вот и активность в Картах, которая его использует
public class MapsActivity extends FragmentActivity implements OnMapReadyCallback {
private final String TAG = "MAPY";
private int LOCATION_PERMISSION_ID = 1001;
private GoogleMap mMap;
Location location;
LocationUtil locationUtil = new LocationUtil(MapsActivity.this);
Button centerButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_maps);
// Obtain the SupportMapFragment and get notified when the map is ready to be used.
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
centerButton = findViewById(R.id.centerCameraBtn);
centerButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(location != null)
mMap.moveCamera((CameraUpdateFactory.newLatLng(new LatLng(location.getLatitude(), location.getLongitude()))));
}
});
}
@Override
protected void onStop() {
super.onStop();
locationUtil.stopLocation();
}
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
//Check for permissions if they are not granted request them
if (ContextCompat.checkSelfPermission(MapsActivity.this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(MapsActivity.this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, LOCATION_PERMISSION_ID);
return;
} else{
locationUtil.startLocation();
}
locationUtil.getLastLocation();
Log.d(TAG, "onMapsReady.lat: " + location.getLatitude() + " onMapsReady.lng: " + location.getLongitude());
location = locationUtil.getLocation();
LatLng currentLocation = new LatLng(location.getLatitude(), location.getLongitude());
mMap.addMarker(new MarkerOptions().position(currentLocation).title("My current location").snippet("This is a sinppet"));
mMap.moveCamera(CameraUpdateFactory.newLatLng(currentLocation));
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(locationUtil.getProvider() != null){
locationUtil.getProvider().onActivityResult(requestCode, resultCode, data);
}
}
}
Я сделал это так, как автор библиотеки показал здесь , но это не работает. И самое смешное, это сработало вчера. Я проверяю это на моем личном телефоне. Расположение, мобильные данные и Wi-Fi включены и работают нормально. Я получил разрешения, я добавил разрешения в манифест (как FINE, так и COARSED), и в моих зависимостях
реализация 'com.android.support:appcompat-v7:28.0.0'
реализация 'com.android.support:support-v4:28.0.0'
реализация 'com.android.support:support-media-compat:28.0.0'
реализация 'io.nlopez.smartlocation: library: 3.3.3'
реализация 'com.google.android.gms: play-services-maps: 16.0.0'
реализация "com.google.android.gms: play-services-location: 16.0.0"
testImplementation 'junit: junit: 4.12'
androidTestImplementation 'com.android.support.test: runner: 1.0.2'
androidTestImplementation 'com.android.support.test.espresso: espresso-core: 3.0.2'
реализация 'com.android.support.constraint: компоновка ограничений: 1.1.3'
Я действительно не знаю, что происходит, пожалуйста, помогите мне.