Расположение SmartLocationLibrary всегда нулевое - PullRequest
0 голосов
/ 17 ноября 2018

Я пытаюсь изучить 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'

Я действительно не знаю, что происходит, пожалуйста, помогите мне.

1 Ответ

0 голосов
/ 17 ноября 2018

ОК, так что это не работает, потому что я хочу записать значение переменной местоположения, которая не была инициализирована. Отладка с помощью отладчика показывает, что я получаю местоположение. Но, чтобы быть более забавным, так как это проект, предназначенный только для проверки библиотеки в основном приложении, тот же класс Utility не выберет мне местоположение, даже если я делаю все то же самое, что и здесь ...

...