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

Posted

技术标签:

【中文标题】我无法使用我的代码获取当前位置【英文标题】:I can't get my current location using my code 【发布时间】:2017-06-01 07:37:30 【问题描述】:

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 类

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,我在这里做错了什么?

【问题讨论】:

你在模拟器里试试? 不,我在我的手机中试用该应用 @Gopibilla 你确定你的手机有 GPS 吗?因为并非所有手机都有它。 我使用 gps 导航到很多地方,我的手机是带有 android kitkat 的 lava iris fuel 60 您是否在 Manifest 中授予位置权限..?? 【参考方案1】:

文档中有一个很棒的示例: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);
     

【讨论】:

以上是关于我无法使用我的代码获取当前位置的主要内容,如果未能解决你的问题,请参考以下文章

Android GPS 无法获取我的位置

如何获取我的代码以提供我当前的位置?

无法在 xamarin 中使用 Plugin.Geolocator 获取位置

动画期间无法获取 CALayer 的当前位置

MapKit JS - 如何获取我的当前位置

无法在真正的 android 设备上获取当前位置