【问题标题】:double android.location.Location.getLatitude()' on a null object reference在空对象引用上加倍 android.location.Location.getLatitude()'
【发布时间】:2017-03-29 14:20:25
【问题描述】:

我再次问这个问题的唯一原因是因为我已经尝试了所有答案并且它对我不起作用我正在尝试获取当前用户位置但它不起作用所以这就是我一直在做的尝试这样做,顺便说一句,我已经设置了所有需要的权限,并且我不断在空对象引用错误和致命执行 main 上获得双 android location.getlatitude,请帮助我 这是我的 GPSTRACKER Java 类代码:

package com.example.nefissa.androidtest;

 import android.*;
 import android.Manifest;
 import android.app.Service;
 import android.content.Context;
 import android.content.Intent;
 import android.content.pm.PackageManager;
 import android.location.Location;
 import android.location.LocationListener;
 import android.location.LocationManager;
 import android.os.Bundle;
 import android.os.IBinder;
 import android.support.annotation.Nullable;
 import android.support.v4.content.ContextCompat;


public class GPSTracker extends Service implements LocationListener{

private final Context context;

boolean isGPSEnabled =false;
boolean isNetworkEnabled =false;
boolean canGetLocation =false;

Location location;
protected LocationManager locationManager;



  public GPSTracker(Context context){
   this.context=context;
  }

// create a GetLocation Method //

public Location getLocation(){

    try{
        locationManager=(LocationManager) context.getSystemService(LOCATION_SERVICE);
        isGPSEnabled = locationManager.isProviderEnabled(locationManager.GPS_PROVIDER);
        isNetworkEnabled=locationManager.isProviderEnabled(locationManager.NETWORK_PROVIDER);

        if(ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED
        || ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED ){


            if(isGPSEnabled){
                if(location==null){
                    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,100000,10,this);
                    if(locationManager!=null){
                          location=locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
                    }
                  }
            }
               // if location is not found from GPS then it will found from network //
            if(location==null){
                if(isNetworkEnabled){
                           locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,100000,10,this);
                        if(locationManager!=null){
                              location=locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                        }
                    }

            }
        }

    }catch(Exception e){

    }
    return location;
}




@Nullable
@Override
public IBinder onBind(Intent intent) {
    return null;
}

@Override
public void onLocationChanged(Location location) {

}

@Override
public void onStatusChanged(String provider, int status, Bundle extras) {

}

@Override
public void onProviderEnabled(String provider) {

}

@Override
public void onProviderDisabled(String provider) {

}
}

和我的主要活动代码:

package com.example.nefissa.androidtest;

 import android.location.Location;
 import android.support.v4.app.FragmentActivity;
  import android.os.Bundle;

 import com.google.android.gms.maps.CameraUpdateFactory;
 import com.google.android.gms.maps.GoogleMap;
  import com.google.android.gms.maps.OnMapReadyCallback;
   import com.google.android.gms.maps.SupportMapFragment;
   import com.google.android.gms.maps.model.LatLng;
 import com.google.android.gms.maps.model.MarkerOptions;

 public class MapsActivity extends FragmentActivity implements     OnMapReadyCallback {

private GoogleMap mMap;
private GPSTracker gpsTracker;
private Location mLocation;
double latitude;
double longitude;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_maps);

    gpsTracker= new GPSTracker(getApplicationContext());
    mLocation=gpsTracker.getLocation();
    latitude= mLocation.getLatitude();
    longitude= mLocation.getLongitude();


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


/**
 * Manipulates the map once available.
 * This callback is triggered when the map is ready to be used.
 * This is where we can add markers or lines, add listeners or move the camera. In this case,
 * we just add a marker near Sydney, Australia.
 * If Google Play services is not installed on the device, the user will be prompted to install
 * it inside the SupportMapFragment. This method will only be triggered once the user has
 * installed Google Play services and returned to the app.
 */
@Override
public void onMapReady(GoogleMap googleMap) {
    mMap = googleMap;

    // Add a marker in Sydney and move the camera
    LatLng sydney = new LatLng(latitude,longitude);
    mMap.addMarker(new MarkerOptions().position(sydney).title("you are here"));
    mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney));
  }
 }

【问题讨论】:

  • 您的问题是糟糕且有缺陷的 GPSTracker 示例代码。停止使用它并改为阅读一些官方 Android 文档或查看 StackOverflow 上的Documentation section
  • 我是 android 开发新手,我正在为学校做一个项目,我在网上找到了这个例子 .. 正如我所说的,我正在尝试获取用户当前位置,你能帮帮我吗?
  • 使用一些调试,查看控制流以及您使用服务作为服务但作为普通类
  • 主要问题是 1) 设备位置可能未知,然后getLastKnownLocation() 返回null 2) 代码请求使用requestLocationUpdates() 进行位置更新,但不在@987654327 中使用它们@。如果getLastKnownLocation() 返回null,您需要检查空位置以避免崩溃并从onLocationChanged() 获取位置。这些是主要问题,这里的许多以前的问题都涉及它们,所以我不会详细说明。

标签: android google-maps


【解决方案1】:

调用onMapReady后,最好初始化gpsTracker。

   gpsTracker= new GPSTracker(getApplicationContext());

   if(gpsTracker!=null){
       mLocation=gpsTracker.getLocation();
       latitude= mLocation.getLatitude();
       longitude= mLocation.getLongitude();
   }

而且我认为 gpsTracker.getLocation 必须更改为逻辑。 请阅读 android gps 指南。

【讨论】:

  • 还是不行,我只是想获取用户位置你觉得我应该怎么做?
【解决方案2】:

尝试使用

GPS 追踪器

public GPSTracker(Activity activity) {
    this.mActivity = activity;
    getLocation();
}

public void getLocation() {
    try {
        locationManager = (LocationManager) mActivity
                .getSystemService(LOCATION_SERVICE);

        // getting GPS status
        isGPSEnabled = locationManager
                .isProviderEnabled(LocationManager.GPS_PROVIDER);

        // getting network status
        isNetworkEnabled = locationManager
                .isProviderEnabled(LocationManager.NETWORK_PROVIDER);

        if (!isGPSEnabled || !isNetworkEnabled) {
            showSettingsAlert();
        } else {
            this.canGetLocation = true;
            if (isNetworkEnabled) {
                if (ActivityCompat.checkSelfPermission(mActivity, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(mActivity, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                    ActivityCompat.requestPermissions(mActivity, new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, 1);
                } else {
                    locationManager.requestLocationUpdates(
                            LocationManager.NETWORK_PROVIDER,
                            MIN_TIME_BW_UPDATES,
                            MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                    Log.d("Network", "Network");
                    if (locationManager != null) {
                        location = locationManager
                                .getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                        if (location != null) {
                            latitude = location.getLatitude();
                            longitude = location.getLongitude();
                        }
                    }
                }
            }
        }

    } catch (Exception e) {
        e.printStackTrace();
    }
}




/**
 * Function to get latitude
 */
public double getLatitude() {
    if (location != null) {
        latitude = location.getLatitude();
    }

    // return latitude
    return latitude;
}

/**
 * Function to get longitude
 */
public double getLongitude() {
    if (location != null) {
        longitude = location.getLongitude();
    }

    // return longitude
    return longitude;
}


/**
 * Function to ic_check GPS/wifi enabled
 *
 * @return boolean
 */
public boolean canGetLocation() {
    return this.canGetLocation;
}

同样来自 Activity 调用

onCreate

//
gps = new GPSTracker(SignUpActivity.this);
        if (gps.canGetLocation) {
            lat = String.valueOf(gps.getLatitude());
            lng = String.valueOf(gps.getLongitude());
        }

如果仍有问题,请在下方评论

【讨论】:

  • 错误是什么!!我仍在使用它,没有问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-17
相关资源
最近更新 更多