【问题标题】:android -LocationManager return 0.0 for latitude and longitudeandroid -LocationManager 为纬度和经度返回 0.0
【发布时间】:2016-09-15 20:15:46
【问题描述】:

当用户单击按钮时,我想获取当前的纬度和经度。为此,我编写了以下代码:

LocationManager mlocManager=null;
                        LocationListener mlocListener;
                        mlocManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
                        mlocListener = new MyLocationListener();
                        mlocManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, mlocListener);
                        if (mlocManager.isProviderEnabled(LocationManager.GPS_PROVIDER)){
                            Log.v("this",MyLocationListener.latitude+ " lat");
                            if(MyLocationListener.latitude>0){
                                in = new Intent(DrawerActivity.this, Barbers.class);
                                in.putExtra("w", "nearest");
                                in.putExtra("latitude",Double.toString(MyLocationListener.latitude));
                                in.putExtra("longitude",Double.toString(MyLocationListener.longitude));
                                startActivity(in);
                            }else{
                                MyToast.makeText(DrawerActivity.this, Z_Farsi.Convert(getString(R.string.gpsfinding)));
                            }
                        } else {
                            MyToast.makeText(DrawerActivity.this, Z_Farsi.Convert(getString(R.string.gpsoffline)));
                        }

gps 已开启,当前位置完美显示在谷歌地图上。

有什么问题?为什么它返回 0.0 ?

如何解决这个问题?

【问题讨论】:

  • 你是否试用真机和模拟器
  • MyLocationListener 的代码在哪里?
  • 你必须调用lastKnownLocation()方法。

标签: android google-maps android-gps


【解决方案1】:

getLastKnownLocation 丢失。你应该有这样的东西:

Location location = null;
if (mlocManager!= null) {
                    location = mlocManager
                         .getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                    if (location != null) {
                        latitude = location.getLatitude();
                        longitude = location.getLongitude();
                    }

【讨论】:

    【解决方案2】:

    此文件将为您完成工作。它将从网络运营商或 GPS 获取数据。

    GPSTracker.java

    public class GpsTracker extends Service implements LocationListener {
    
        private final Context mContext;
    
        boolean isGPSEnabled = false;
        boolean isNetworkEnabled = false;
        boolean canGetLocation = false;
    
        Location location;
        double latitude;
        double longitude;
    
        private final long MIN_DISTANCE = 10;
        private final long MIN_TIME = 30;
        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 enabled
                } else {
    
                    this.canGetLocation = true;
    
                    // first get location from network provider
                    if (isNetworkEnabled) {
                        if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                            // TODO: Consider calling
                            //    ActivityCompat#requestPermissions
                            // here to request the missing permissions, and then overriding
                            //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
                            //                                          int[] grantResults)
                            // to handle the case where the user grants the permission. See the documentation
                            // for ActivityCompat#requestPermissions for more details.
                            return null;
                        }
                        locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, MIN_TIME, MIN_DISTANCE, 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 provider
    
                    if (isGPSEnabled) {
                        if (location == null) {
                            locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, MIN_TIME, MIN_DISTANCE, this);
                            Log.d("GPS provider", "GPS provider");
    
                            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) {
                if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                    // TODO: Consider calling
                    //    ActivityCompat#requestPermissions
                    // here to request the missing permissions, and then overriding
                    //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
                    //                                          int[] grantResults)
                    // to handle the case where the user grants the permission. See the documentation
                    // for ActivityCompat#requestPermissions for more details.
                    return;
                }
                locationManager.removeUpdates(GpsTracker.this);
            }
        }
    
    
        // functions to get latitude and longitude
    
        public double getLatitude()
        {
            if(location != null){
                latitude = location.getLatitude();
            }
            return latitude;
        }
    
    
        public double getLongitude()
        {
            if(location != null){
                longitude = location.getLongitude();
            }
            return longitude;
        }
    
    
        // function to check whether GPS/WiFi is enabled
    
        public boolean canGetLocation()
        {
    
            return this.canGetLocation;
        }
    
    
        /* Function to show alert dialog
         * on pressing settings button will launch settings options   */
    
        public void showAlertDialog()
        {
            AlertDialog.Builder alertDialog = new AlertDialog.Builder(mContext);
    
            alertDialog.setTitle("GPS Settings").setMessage("GPS not Enabled. /n Want to enable it ? ").setCancelable(false);
    
            alertDialog.setPositiveButton("Settings", new OnClickListener() {
    
                @Override
                public void onClick(DialogInterface arg0, int arg1) {
    
    
                    // Implicit intent
                    Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                    mContext.startActivity(intent);
    
                }
            });
    
            alertDialog.setNegativeButton("No", new OnClickListener() {
    
                @Override
                public void onClick(DialogInterface dialog, int arg1) {
    
                    dialog.cancel();
    
                }
            });
    
            alertDialog.show();
        }
    
    
    
    
    
    
    
        @Override
        public IBinder onBind(Intent arg0) {
            // TODO Auto-generated method stub
            return null;
        }
    
        @Override
        public void onLocationChanged(Location arg0) {
            // TODO Auto-generated method stub
    
        }
    
        @Override
        public void onProviderDisabled(String arg0) {
            // TODO Auto-generated method stub
    
        }
    
        @Override
        public void onProviderEnabled(String arg0) {
            // TODO Auto-generated method stub
    
        }
    
        @Override
        public void onStatusChanged(String arg0, int arg1, Bundle arg2) {
            // TODO Auto-generated method stub
    
        }
    
    }
    

    【讨论】:

      【解决方案3】:

      这样试试

      manager.requestLocationUpdates("gps", 10, 10, new LocationListener() {
      @Override
      public void onLocationChanged(Location location) {
      
       double lat=location.getLatitude();
       double lon=location.getLognitude()
      
      }
      
      @Override
      public void onStatusChanged(String provider, int status, Bundle extras) {
      
      }
      
      @Override
      public void onProviderEnabled(String provider) {
      
      }
      
      @Override
      public void onProviderDisabled(String provider) {
      
      }
      });
      

      【讨论】:

        【解决方案4】:

        我注意到位置功能无法立即获取用户位置。您必须等待设备为您提供位置。

        通常,我会将我的代码放在我的 Application 类中,然后例如当用户单击按钮时,您会调用应用程序类中的方法并让用户知道(通过进度对话框??)他们应该等待要获取的经纬度。

        接下来是使用事件通知活动或片段位置可用性,然后在获得数据后关闭进度对话框。

        要知道,您无法立即轻松获得当前位置。有时,在室内时,它甚至无法按预期工作。

        祝你好运!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多