GPS 跟踪器不断询问位置 (Android)

GPS Tracker keeps Asking for Location (Android)

我有一个小问题,我的 GPS 追踪器在我激活它时一直要求激活位置。我分析并重新分析了我的 class 但找不到我的错误...

有人愿意帮忙吗?

GPSTracker.java

public class GPSTracker extends Service implements LocationListener {

private final Context context;

Location location;

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

double latitude;
double longitude;

private static final long MinDistanceChangeUpdate = 10;
private static final long MinTimeUpdate = 1000 * 60 * 1;

protected LocationManager locationManager;

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

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

        if(!isNetworkEnabled && !isGPSEnabled){

        }else{
            this.canGetLocation = true;

            if(isNetworkEnabled){
                locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, MinTimeUpdate, MinDistanceChangeUpdate, this);

                if(locationManager != null){
                    location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);

                    if(location != null){
                        latitude = location.getLatitude();
                        longitude = location.getLongitude();
                    }
                }
            }


            if(isGPSEnabled){
                if(location == null){
                    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, MinTimeUpdate, MinDistanceChangeUpdate, this);

                    if(locationManager != null){
                        location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);

                        if(location != null){
                            latitude = location.getLatitude();
                            longitude = location.getLongitude();
                        }
                    }
                }

            }
        }

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

    return location;
}

public void stopUsingGPS(){
    if(locationManager != null){
        locationManager.removeUpdates(GPSTracker.this);
    }
}

public double getLatitude(){
    if(location != null){
        latitude = location.getLatitude();
    }
    return latitude;
}

public double getLongitude (){
    if(location != null){
        longitude = location.getLongitude();
    }
    return  longitude;
}

public boolean canGetLocation(){
    return this.canGetLocation;
}

public void showSettingsAlert(){
    final AlertDialog.Builder alertDialog = new AlertDialog.Builder(context);
    alertDialog.setTitle("GPS is Settings! ");
    alertDialog.setMessage("GPS is not enable, Wanna enable?");

    alertDialog.setPositiveButton("Ok", new DialogInterface.OnClickListener(){

        @Override
        public void onClick(DialogInterface dialog, int which) {
            Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
            context.startActivity(intent);
        }
    });

    alertDialog.setNegativeButton("No", new DialogInterface.OnClickListener(){

        @Override
        public void onClick(DialogInterface dialog, int which) {
            dialog.cancel();
        }
    });

    alertDialog.show();
}


@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) {

}

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

MainActivity.java

public class MainActivity extends Activity {

Button btnshowLocation;

GPSTracker gps;

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

    btnshowLocation = (Button)findViewById(R.id.showLocation);
    btnshowLocation.setOnClickListener(new View.OnClickListener(){

        @Override
        public void onClick(View v) {
            gps = new GPSTracker(MainActivity.this);

            if(gps.canGetLocation()){
                double latitude = gps.getLatitude();
                double longitude = gps.getLongitude();

                Toast.makeText(getApplicationContext(), "Latitude = " + latitude + "  Longitude = " + longitude, Toast.LENGTH_LONG).show();
            } else {
                gps.showSettingsAlert();
            }

        }
    });
  }



}

跟踪

java.lang.NullPointerException: Attempt to invoke virtual method      'java.lang.Object android.content.Context.getSystemService(java.lang.String)' on   a null object reference
04-26 23:55:51.943  21374-21374/com.example.dell.exampleapplication  W/System.err﹕ at  android.content.ContextWrapper.getSystemService(ContextWrapper.java:582)
 04-26 23:55:51.943  21374-21374/com.example.dell.exampleapplication W/System.err﹕ at com.example.dell.exampleapplication.GPSTracker.getLocation(GPSTracker.java:44)
04-26 23:55:51.943  21374-21374/com.example.dell.exampleapplication W/System.err﹕ at com.example.dell.exampleapplication.GPSTracker.<init>(GPSTracker.java:39)
04-26 23:55:51.943  21374-21374/com.example.dell.exampleapplication W/System.err﹕ at com.example.dell.exampleapplication.MainActivity.onClick(MainActivity.java:28)

编辑:添加了 Stracktrace 提前致谢,

看到我很久以前在 SO 答案中发布的一些代码片段很有趣 :-D Location servise GPS Force closed

从那以后发生了很多事情,这些天我的建议是使用 https://github.com/mcharmas/Android-ReactiveLocation

主要是因为:

  1. 它使用 Fused 位置(更省电 + 更准确)
  2. 更少样板代码
  3. RxJava 的额外功能(不需要深入了解 RxJava 的详细信息以获得简单的使用,但它有一些很棒的功能)
  4. 我在图书馆添加了Activity认可(所以我想宣传我认为它有多棒)

要获取最近的位置,您唯一需要编写的代码是:

ReactiveLocationProvider locationProvider = new ReactiveLocationProvider(context);
locationProvider.getLastKnownLocation()
    .subscribe(new Action1<Location>() {
        @Override
        public void call(Location location) {
            doSthImportantWithObtainedLocation(location);
        }
    });

为了含糊地回答你的问题,我怀疑你可能打开了 GPS 但没有打开 WiFi 位置(虽然只是猜测)。

如果您确定使用您发布的代码,那么我建议添加各种日志输出来调试情况。类似于:

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

        if(!isNetworkEnabled && !isGPSEnabled){
             Log.e("GPSTracker", "!isNetworkEnabled && !isGPSEnabled");
             Log.e("GPSTracker", "is network location enabled: " + isNetworkEnabled );
             Log.e("GPSTracker", "is GPS location enabled: " + isGPSEnabled);
        }else{
            this.canGetLocation = true;

            if(isNetworkEnabled){
                locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, MinTimeUpdate, MinDistanceChangeUpdate, this);

                if(locationManager != null){
                    location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);

                    if(location != null){
                        latitude = location.getLatitude();
                        longitude = location.getLongitude();
                    }
                }
            }


            if(isGPSEnabled){
                if(location == null){
                    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, MinTimeUpdate, MinDistanceChangeUpdate, this);

                    if(locationManager != null){
                        location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);

                        if(location != null){
                            latitude = location.getLatitude();
                            longitude = location.getLongitude();
                        }
                    }
                }

            }
        }

    }catch(Exception e){
        Log.e("GPSTracker", "error getting location", e);
        e.printStackTrace();
    }

    return location;
}

否则对 canGetLocation 布尔值施加较少的限制(因为它确实是导致问题的变量)

变化中:

    isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
    isNetworkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);

    if(!isNetworkEnabled && !isGPSEnabled){

    }else{
        this.canGetLocation = true;
        ...

    isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
    isNetworkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);

    this.canGetLocation = isNetworkEnabled || isGPSEnabled;

    if(!isNetworkEnabled && !isGPSEnabled){

    }else{
        ...