简体   繁体   English

SmartLocationLibrary位置始终为null

[英]SmartLocationLibrary location is always null

I'm trying to learn SmartLocationLibrary for Android to get location and the location I get from it is always null, so I get null object reference errors when I try to do something with it. 我正在尝试学习Android的SmartLocationLibrary来获取位置,并且从中获取的位置始终为null,因此在尝试对其进行操作时会出现null对象引用错误。

I made a Utility class for SmartLocatonLibrary 我为SmartLocatonLibrary创建了一个Utility类

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;
    }
}

And here is the Maps Activity that use it 这是使用它的Maps Activity

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);
        }
    }

}

I did it like the author of the library showed here but it doesn't work. 我做到了,就像这里显示的库的作者一样,但是它不起作用。 And the funny thing is it worked yesterday. 有趣的是,它昨天有效。 I'm testing it on my personal phone. 我正在我的个人电话上对其进行测试。 The location, mobile data and wifi are turned on and working fine. 位置,移动数据和wifi均已打开且工作正常。 I got the permissions, i added the permissions to the manifest(both FINE and COARSED) and in my dependencies are 我获得了权限,我将权限添加到了清单(FINE和COARSED),并且在我的依赖项中

implementation 'com.android.support:appcompat-v7:28.0.0' implementation 'com.android.support:support-v4:28.0.0' implementation 'com.android.support:support-media-compat:28.0.0' implementation 'io.nlopez.smartlocation:library:3.3.3' implementation 'com.google.android.gms:play-services-maps:16.0.0' implementation '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' implementation 'com.android.support.constraint:constraint-layout:1.1.3' 实现'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'

I really don't know whats going on, please help me. 我真的不知道发生了什么事,请帮帮我。

OK so this doesn't work because I want to log the value of the location variable that hasn't been initialised. 确定,所以这不起作用,因为我想记录尚未初始化的位置变量的值。 Debugging it with debugger shows that I'm getting the location. 使用调试器对其进行调试表明我正在获取位置。 But to be more funny since this is a project just to test the library in the main app the same Utility class won't fetch me a location even if I'm doing everything same as here... 但是更有趣的是,因为这是一个仅在主应用程序中测试库的项目,即使我所做的一切都与此处相同,相同的Utility类也不会获取我的位置...

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM