我无法使用我的代码获取当前位置

时间:2017-01-17 09:46:33

标签: android location android-location

GPSTracker课程

  public class GPSTracker extends Service implements LocationListener {
    private final Context mContext;
    // flag for GPS status
    boolean isGPSEnabled = false;
    // flag for network status
    boolean isNetworkEnabled = false;
    // flag for GPS status
    boolean canGetLocation = false;
    Location location; // location
    double latitude; // latitude
    double longitude; // longitude
    // The minimum distance to change Updates in meters
    private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10; // 10 meters
    // The minimum time between updates in milliseconds
    private static final long MIN_TIME_BW_UPDATES = 1000 * 60 * 1; // 1 minute
    // Declaring a Location Manager
    protected LocationManager locationManager;
    public GPSTracker(Context context) {
    this.mContext = context;
    getLocation();
    }
    public Location getLocation() {
    try {
    locationManager = (LocationManager) mContext.getSystemService(LOCATION_SERVICE);
    // getting GPS status
    isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
    // getting network status
    isNetworkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
    if (!isGPSEnabled && !isNetworkEnabled) {
    // no network provider is enabled
    } else {
    this.canGetLocation = true;
    // First get location from Network Provider
    if (isNetworkEnabled) {
    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();
    }
    }
    }
    // if GPS Enabled get lat/long using GPS Services
    if (isGPSEnabled) {
    if (location == null) {
    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,MIN_TIME_BW_UPDATES,MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
    Log.d("GPS Enabled", "GPS Enabled");
    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;
        }

        /**
         * Stop using GPS listener
         * Calling this function will stop using GPS in your app
         * */

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

        /**
         * 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 check GPS/wifi enabled
         * @return boolean
         * */

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

        /**
         * Function to show settings alert dialog
         * On pressing Settings button will lauch Settings Options
         * */

        public void showSettingsAlert(){
            AlertDialog.Builder alertDialog = new AlertDialog.Builder(mContext);

            // Setting Dialog Title
            alertDialog.setTitle("GPS is settings");

            // Setting Dialog Message
            alertDialog.setMessage("GPS is not enabled. Do you want to go to settings menu?");

            // On pressing Settings button
            alertDialog.setPositiveButton("Settings", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog,int which) {
                    Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                    mContext.startActivity(intent);
                }
            });

            // on pressing cancel button
            alertDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    dialog.cancel();
                }
            });

            // Showing Alert Message
            alertDialog.show();
        }

        @Override
        public void onLocationChanged(Location location) {
        }

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

        }

        @Override
        public void onProviderDisabled(String provider) {
        }

        @Override
        public void onProviderEnabled(String provider) {
        }

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

MainActivity Class

public class MainActivity extends AppCompatActivity {
Button btnShowLocation;
    private static final int REQUEST_CODE_PERMISSION = 2;
    String mPermission = Manifest.permission.ACCESS_FINE_LOCATION;

    // GPSTracker class
    GPSTracker gps;

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

        try {
            if (ActivityCompat.checkSelfPermission(this, mPermission)
                    != MockPackageManager.PERMISSION_GRANTED) {

                ActivityCompat.requestPermissions(this, new String[]{mPermission},
                        REQUEST_CODE_PERMISSION);

                // If any permission above not allowed by user, this condition will
                //execute every time, else your else part will work
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        btnShowLocation = (Button) findViewById(R.id.button);

        // show location button click event
        btnShowLocation.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View arg0) {
                // create class object
                gps = new GPSTracker(MainActivity.this);

                // check if GPS enabled
                if(gps.canGetLocation()){

                    double latitude = gps.getLatitude();
                    double longitude = gps.getLongitude();

                    // \n is for new line
                    Toast.makeText(getApplicationContext(), "Your Location is - \nLat: "
                            + latitude + "\nLong: " + longitude, Toast.LENGTH_LONG).show();
                }else{
                    // can't get location
                    // GPS or Network is not enabled
                    // Ask user to enable GPS/network in settings
                    gps.showSettingsAlert();
                }

            }
        });
    }
}

我无法正确获取我的位置它总是将GPS位置返回为0和0,我在这里做错了什么?

1 个答案:

答案 0 :(得分:0)

文档中提供了很好的示例:https://developer.android.com/reference/android/location/LocationManager.html。还有一个新版本 - FusedLocationsApi。我最近使用Locationmanager进行GPS工作,希望它会有所帮助:

/**  * This is an implementation of reader, which track use movement by GPS using old  * LocationManager (there is another version for FusedLocationAPIs.  * This class doesn't check if GPS is enabled - it is assumed to be enabled by default and  * should be checked by code, using this class first. It is so, because both  * LocationManager and version using FusedLocationApi prompt to enable GPS in the same manner.  */ public class LocationManagerReader extends SensorReader implements LocationListener {
    // update location at least every second
    private static final long MINIMAL_UPDATE_TIME = 1000;
    // or at east when user move to 10 meters.
    private static final long MINIMAL_UPDATE_DISTANCE = 10;

    private LocationManager locationManager;


    public LocationManagerReader(Context context) {
        super(context);
        locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);

    }

    /**
     * Register this reader as LocationManager to listen for GPS updates with defined
     * minimal update time and accuracy.
     */
    @Override
    protected void startPollingHardwareSensor() {
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
                MINIMAL_UPDATE_TIME, MINIMAL_UPDATE_DISTANCE, this);
    }

    /**
     * Unsubscribe from location updates.
     */
    @Override
    protected void stopPollingHardwareSensor() {
        locationManager.removeUpdates(this);
    }

    /**
     * Inherited from LocationListener
     */

    /**
     * Process new location in a background
     * @param location
     */
    @Override
    public void onLocationChanged(Location location) {
        Observable.defer(() -> Observable.just(location))
                .subscribeOn(Schedulers.computation())
                .subscribe(loc -> processLocationUpdate(loc));
    }

    /**
     * We're not interested in monitoring changes in gps state, need location updates only
     * @param provider
     * @param status
     * @param extras
     */
    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {

    }


    /**
     * We need a high accuracy, that is why use single GPS provider, network is not used -
     * don't track changes in provider state
     *
     * @param provider
     */
    @Override
    public void onProviderEnabled(String provider) {
    }

    @Override
    public void onProviderDisabled(String provider) {
    }

    /**
     * get current time in nanoseconds and save latitude and longitude as values of reading.
     *  When we have reading, give it to base class for further processing
     * @param location
     */
    private void processLocationUpdate(Location location)  {
        long timeStamp = System.nanoTime();
        double lat = location.getLatitude();
        double lon = location.getLongitude();
        Reading reading = new Reading();
        reading.timestamp = timeStamp;
        reading.values[0] = lat;
        reading.values[1] = lon;
        getReadingPipe().onNext(reading);
    } }