当前位置: 首页 > 知识库问答 >
问题:

SmartLocationLibrary位置始终为空

麻书
2023-03-14

我试图学习Android的SmartLocationLibrary获取位置,而我从它获取的位置总是空的,所以当我尝试用它做一些事情时,我会得到空对象引用错误。

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

}

实现“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“:库:3.3.3”实现“com.google.android.gms:play-services-maps”:16.0.0“实现”com.google.android.gms:play-services-location“:16.0.0”testimentation“junit:junit:4.12”androidtestimentation

我真的不知道怎么回事,请帮帮我。

共有1个答案

蓝苗宣
2023-03-14

好的,这不起作用,因为我想记录尚未初始化的location变量的值。用debugger对其进行调试显示我正在获取位置。但更有趣的是,因为这是一个项目,只是测试库在主应用程序,相同的实用程序类不会为我获取一个位置,即使我做的一切都和这里一样...

 类似资料:
  • 下面是片段。请注意,我已经恢复到以前的提交,因此丢失了最近的修改,但请查看我编写的代码,然后才注意到始终等于0() 以下是当检测到活动后按: 以下是NoteActivity接收结果调用的方式。 null 我在我的项目上浪费了很多重要的时间,只是想知道是什么使resultCode和requestCode的值丢失了我发送的值。 任何帮助和指导都将不胜感激。非常感谢!

  • 这: 变为 我希望它是 正确的格式模式是什么?

  • 我一直在尝试获取我当前的位置更新,并按照Google的建议使用了融合位置提供商,但我无法获得任何更新。我在网上彻底搜索了,但找不到任何解决方案。融合提供商返回的位置甚至不接近我所在的位置,它显示了其他一些国家。有人能在这里帮我吗?

  • 我有两个不同的活动,在第一个活动中,我在一些EditText中输入一些信息,然后进入第二个活动,但当我返回时,第一个活动中EditText上的文本消失了。 以下是第一个活动的OnCreate() 我正在使用onSaveInstanceState方法保存信息 在进行调试时,我可以看到确实在onSaveInstanceState方法中填充了savedInstanceState捆绑包,但在OnCreat

  • 我将Spring Boot版本='1.4.0.rc1'与Spring Boot Stormpath 1.0.2一起使用。 我试图使用多部分文件上传,但MultipartFile在控制器中总是为空。 这是控制器,在下面的代码中,总是成功,总是失败: 我的集成测试使用改型: 我使用自动配置,所以我唯一的自定义配置类配置StormPath: 更新:这是传出请求。我不确定如何在多部分解析器本身中启用日志记

  • 问题内容: 我正在编写一个C#ASP.Net MVC应用程序,供客户端将文件发布到其他服务器。我正在使用通用处理程序来处理从客户端到服务器的发布文件。但是在我的处理程序中,System.Web.HttpContext.Current.Request.Files始终为空(0个计数)。 表格代码: 处理程序: 请帮我。谢谢。 问题答案: 最后,我发现了问题。 由于某些原因,控制器中的代码永远无法正常工