【问题标题】:How to get Latitude and Longitude of the mobile device in android?如何在android中获取移动设备的经纬度?
【发布时间】:2011-01-14 16:46:37
【问题描述】:

如何使用定位工具在android中获取移动设备的当前纬度和经度?

【问题讨论】:

    标签: java android geolocation


    【解决方案1】:

    使用LocationManager

    LocationManager lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE); 
    Location location = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
    double longitude = location.getLongitude();
    double latitude = location.getLatitude();
    

    getLastKnownLocation() 的调用不会阻塞——这意味着如果当前没有可用位置,它将返回null——所以你可能想看看将LocationListener 传递给requestLocationUpdates() method,而不是,这将为您提供位置的异步更新。

    private final LocationListener locationListener = new LocationListener() {
        public void onLocationChanged(Location location) {
            longitude = location.getLongitude();
            latitude = location.getLatitude();
        }
    }
    
    lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 2000, 10, locationListener);
    

    如果您想使用 GPS,您需要将 ACCESS_FINE_LOCATION permission 提供给您的应用程序。

    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    

    您可能还想在 GPS 不可用时添加ACCESS_COARSE_LOCATION permission,并使用getBestProvider() method 选择您的位置提供商。

    【讨论】:

    • 这可以在模拟器中使用吗?此代码是否在模拟器中显示了纬度和经度??????
    • 您还应该确保删除 onPause 中的更新(或在需要的地方),以停止获取您不再需要的更新。 -> lm.removeUpdates(locationListener);
    • getLastLocation 的准确性如何?
    • 如果您已经在使用 ACCESS_FINE_LOCATION 权限,则您隐式启用了粗略位置权限:“如果您同时使用 NETWORK_PROVIDER 和 GPS_PROVIDER,那么您只需请求 ACCESS_FINE_LOCATION 权限,因为它包含以下权限两个供应商。” developer.android.com/guide/topics/location/strategies.html
    • 我使用了这段代码和nedded权限,但经度和纬度为空..这里的错误在哪里?
    【解决方案2】:

    这是LocationFinder 查找GPS 位置的课程。这个类会调用MyLocation,它会做生意。

    定位器

    public class LocationFinder extends Activity {
    
        int increment = 4;
        MyLocation myLocation = new MyLocation();
    
        // private ProgressDialog dialog;
    
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.intermediat);
            myLocation.getLocation(getApplicationContext(), locationResult);
    
            boolean r = myLocation.getLocation(getApplicationContext(),
                locationResult);
    
            startActivity(new Intent(LocationFinder.this,
            // Nearbyhotelfinder.class));
                GPSMyListView.class));
            finish();
        }
    
        public LocationResult locationResult = new LocationResult() {
    
            @Override
            public void gotLocation(Location location) {
                // TODO Auto-generated method stub
                double Longitude = location.getLongitude();
                double Latitude = location.getLatitude();
    
                Toast.makeText(getApplicationContext(), "Got Location",
                    Toast.LENGTH_LONG).show();
    
                try {
                    SharedPreferences locationpref = getApplication()
                        .getSharedPreferences("location", MODE_WORLD_READABLE);
                    SharedPreferences.Editor prefsEditor = locationpref.edit();
                    prefsEditor.putString("Longitude", Longitude + "");
                    prefsEditor.putString("Latitude", Latitude + "");
                    prefsEditor.commit();
                    System.out.println("SHARE PREFERENCE ME PUT KAR DIYA.");
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        };
    
        // handler for the background updating
    
    }
    

    我的位置

    public class MyLocation {
    
        Timer timer1;
        LocationManager lm;
        LocationResult locationResult;
        boolean gps_enabled=false;
        boolean network_enabled=false;
    
        public boolean getLocation(Context context, LocationResult result)
        {
            //I use LocationResult callback class to pass location value from MyLocation to user code.
            locationResult=result;
            if(lm==null)
                lm = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
    
            //exceptions will be thrown if provider is not permitted.
            try{gps_enabled=lm.isProviderEnabled(LocationManager.GPS_PROVIDER);}catch(Exception ex){}
            try{network_enabled=lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER);}catch(Exception ex){}
    
            //Toast.makeText(context, gps_enabled+" "+network_enabled,     Toast.LENGTH_LONG).show();
    
            //don't start listeners if no provider is enabled
            if(!gps_enabled && !network_enabled)
                return false;
    
            if(gps_enabled)
                lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListenerGps);
            if(network_enabled)
                lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListenerNetwork);
            timer1=new Timer();
    
    
            timer1.schedule(new GetLastLocation(), 10000);
        //    Toast.makeText(context, " Yaha Tak AAya", Toast.LENGTH_LONG).show();
            return true;
        }
    
        LocationListener locationListenerGps = new LocationListener() {
            public void onLocationChanged(Location location) {
                timer1.cancel();
                locationResult.gotLocation(location);
                lm.removeUpdates(this);
                lm.removeUpdates(locationListenerNetwork);
            }
            public void onProviderDisabled(String provider) {}
            public void onProviderEnabled(String provider) {}
            public void onStatusChanged(String provider, int status, Bundle extras) {}
        };
    
        LocationListener locationListenerNetwork = new LocationListener() {
            public void onLocationChanged(Location location) {
                timer1.cancel();
                locationResult.gotLocation(location);
                lm.removeUpdates(this);
                lm.removeUpdates(locationListenerGps);
            }
            public void onProviderDisabled(String provider) {}
            public void onProviderEnabled(String provider) {}
            public void onStatusChanged(String provider, int status, Bundle extras) {}
        };
    
        class GetLastLocation extends TimerTask {
            @Override
    
            public void run() {
    
                //Context context = getClass().getgetApplicationContext();
                 Location net_loc=null, gps_loc=null;
                 if(gps_enabled)
                     gps_loc=lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
                 if(network_enabled)
                     net_loc=lm.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
    
                 //if there are both values use the latest one
                 if(gps_loc!=null && net_loc!=null){
                     if(gps_loc.getTime()>net_loc.getTime())
                         locationResult.gotLocation(gps_loc);
                     else
                         locationResult.gotLocation(net_loc);
                     return;
                 }
    
                 if(gps_loc!=null){
                     locationResult.gotLocation(gps_loc);
                     return;
                 }
                 if(net_loc!=null){
                     locationResult.gotLocation(net_loc);
                     return;
                 }
                 locationResult.gotLocation(null);
            }
        }
    
        public static abstract class LocationResult{
            public abstract void gotLocation(Location location);
        }
    }
    

    【讨论】:

    • 干得好人..!!!上面的代码不工作,但你的代码工作正常,,!!奇怪为什么人们没有像你一样!.. thnks
    • @sandy 这个评论太棒了 Toast.makeText(context, "Yaha Tak AAya", Toast.LENGTH_LONG).show(); +1
    • @sandy 是的。如何从中获取纬度和经度。对不起这个愚蠢的问题
    • 终于找到了从 gotLocation 内部获取纬度和经度问题的最佳解决方案。共享偏好解决了它。谢谢!
    • @rup35h 你错过了什么! ( System.out.println("SHARE PREFERENCE ME PUT KAR DIYA."); ) +1
    【解决方案3】:

    google 情况经常发生变化:以前的答案都不适合我。

    基于this google training,这是您使用的方法

    融合的位置提供者

    这需要设置 Google Play 服务

    活动类

    public class GPSTrackerActivity extends AppCompatActivity implements
        GoogleApiClient.ConnectionCallbacks,     
     GoogleApiClient.OnConnectionFailedListener {
    
    private GoogleApiClient mGoogleApiClient;
    Location mLastLocation;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    
        if (mGoogleApiClient == null) {
            mGoogleApiClient = new GoogleApiClient.Builder(this)
                    .addConnectionCallbacks(this)
                    .addOnConnectionFailedListener(this)
                    .addApi(LocationServices.API)
                    .build();
        }
    
    }
    
    protected void onStart() {
        mGoogleApiClient.connect();
        super.onStart();
    }
    
    protected void onStop() {
        mGoogleApiClient.disconnect();
        super.onStop();
    }
    
    @Override
    public void onConnected(Bundle bundle) {
        try {
    
            mLastLocation = LocationServices.FusedLocationApi.getLastLocation(
                    mGoogleApiClient);
            if (mLastLocation != null) {
                Intent intent = new Intent();
                intent.putExtra("Longitude", mLastLocation.getLongitude());
                intent.putExtra("Latitude", mLastLocation.getLatitude());
                setResult(1,intent);
                finish();
    
            }
        } catch (SecurityException e) {
    
        }
    
    }
    
    @Override
    public void onConnectionSuspended(int i) {
    
    }
    
    @Override
    public void onConnectionFailed(ConnectionResult connectionResult) {
    
    }
    }
    

    用法

    在你的活动中

     Intent intent = new Intent(context, GPSTrackerActivity.class);
        startActivityForResult(intent,1);
    

    还有这个方法

     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(requestCode == 1){
            Bundle extras = data.getExtras();
            Double longitude = extras.getDouble("Longitude");
            Double latitude = extras.getDouble("Latitude");
        }
    }
    

    【讨论】:

    • 并在AndroidManifest xml文件中声明Activity
    • @DAVIDBALAS1 Android Studio 现在会为您完成这一步。
    【解决方案4】:

    你可以使用这个获得当前的 latlng

    `

      public class MainActivity extends ActionBarActivity {
      private LocationManager locationManager;
      private String provider;
      private MyLocationListener mylistener;
      private Criteria criteria;
    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
    @SuppressLint("NewApi")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
    
                 locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
                  // Define the criteria how to select the location provider
                  criteria = new Criteria();
                  criteria.setAccuracy(Criteria.ACCURACY_COARSE);   //default
    
                  // user defines the criteria
    
                  criteria.setCostAllowed(false); 
                  // get the best provider depending on the criteria
                  provider = locationManager.getBestProvider(criteria, false);
    
                  // the last known location of this provider
                  Location location = locationManager.getLastKnownLocation(provider);
    
                  mylistener = new MyLocationListener();
    
                  if (location != null) {
                      mylistener.onLocationChanged(location);
                  } else {
                      // leads to the settings because there is no last known location
                      Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                      startActivity(intent);
                  }
                  // location updates: at least 1 meter and 200millsecs change
                  locationManager.requestLocationUpdates(provider, 200, 1, mylistener);
                String a=""+location.getLatitude();
                Toast.makeText(getApplicationContext(), a, 222).show();
    
    }
    
    private class MyLocationListener implements LocationListener {
    
          @Override
          public void onLocationChanged(Location location) {
            // Initialize the location fields
    
    
    
              Toast.makeText(MainActivity.this,  ""+location.getLatitude()+location.getLongitude(),
                        Toast.LENGTH_SHORT).show()  
    
          }
    
          @Override
          public void onStatusChanged(String provider, int status, Bundle extras) {
              Toast.makeText(MainActivity.this, provider + "'s status changed to "+status +"!",
                        Toast.LENGTH_SHORT).show();
          }
    
          @Override
          public void onProviderEnabled(String provider) {
              Toast.makeText(MainActivity.this, "Provider " + provider + " enabled!",
                Toast.LENGTH_SHORT).show();
    
          }
    
          @Override
          public void onProviderDisabled(String provider) {
              Toast.makeText(MainActivity.this, "Provider " + provider + " disabled!",
                Toast.LENGTH_SHORT).show();
          }
      }         
    

    `

    【讨论】:

      【解决方案5】:

      上述解决方案也是正确的,但有时如果位置为空,则会导致应用程序崩溃或无法正常工作。获取android的经纬度的最佳方法是:

       Geocoder geocoder;
           String bestProvider;
           List<Address> user = null;
           double lat;
           double lng;
      
          LocationManager lm = (LocationManager) activity.getSystemService(Context.LOCATION_SERVICE);
      
           Criteria criteria = new Criteria();
           bestProvider = lm.getBestProvider(criteria, false);
           Location location = lm.getLastKnownLocation(bestProvider);
      
           if (location == null){
               Toast.makeText(activity,"Location Not found",Toast.LENGTH_LONG).show();
            }else{
              geocoder = new Geocoder(activity);
              try {
                  user = geocoder.getFromLocation(location.getLatitude(), location.getLongitude(), 1);
              lat=(double)user.get(0).getLatitude();
              lng=(double)user.get(0).getLongitude();
              System.out.println(" DDD lat: " +lat+",  longitude: "+lng);
      
              }catch (Exception e) {
                      e.printStackTrace();
              }
          }
      

      【讨论】:

      • 所有这些类都在什么命名空间中?
      【解决方案6】:

      最好的办法是

      添加权限清单文件

      <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
      <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
      

      然后您可以获得 GPS 位置,或者如果 GPS 位置不可用,则此函数返回 NETWORK 位置

          public static Location getLocationWithCheckNetworkAndGPS(Context mContext) {
          LocationManager lm = (LocationManager)
                  mContext.getSystemService(Context.LOCATION_SERVICE);
          assert lm != null;
          isGpsEnabled = lm.isProviderEnabled(LocationManager.GPS_PROVIDER);
          isNetworkLocationEnabled = lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
      
          Location networkLoacation = null, gpsLocation = null, finalLoc = null;
          if (isGpsEnabled)
              if (ActivityCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
      
                  return null;
              }gpsLocation = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
          if (isNetworkLocationEnabled)
              networkLoacation = lm.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
      
          if (gpsLocation != null && networkLoacation != null) {
      
              //smaller the number more accurate result will
              if (gpsLocation.getAccuracy() > networkLoacation.getAccuracy())
                  return finalLoc = networkLoacation;
              else
                  return finalLoc = gpsLocation;
      
          } else {
      
              if (gpsLocation != null) {
                  return finalLoc = gpsLocation;
              } else if (networkLoacation != null) {
                  return finalLoc = networkLoacation;
              }
          }
          return finalLoc;
      }
      

      【讨论】:

      • 请分享您的互联网和gps状态检查功能?
      【解决方案7】:

      您可以使用FusedLocationProvider

      要在您的项目中使用 Fused Location Provider,您必须在我们的应用级别 build.gradle 文件中添加 google play services location 依赖项

      dependencies {
         implementation fileTree(dir: 'libs', include: ['*.jar'])
         ...
         ...
         ...
         implementation 'com.google.android.gms:play-services-location:17.0.0'
      }
      

      清单中的权限

      使用位置服务的应用必须请求位置权限。 Android 提供两种位置权限:ACCESS_COARSE_LOCATIONACCESS_FINE_LOCATION

      <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
      <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
      

      您可能知道,从 Android 6.0 (Marshmallow) 开始,您必须请求权限才能在运行时进行重要访问。因为这是一个安全问题,在安装应用程序时,用户可能无法清楚地了解其设备的重要权限。

      ActivityCompat.requestPermissions(
          this,
          arrayOf(Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION),
          PERMISSION_ID
      )
      

      然后您可以使用 FusedLocationProvider 客户端在您想要的位置获取更新的位置。

          mFusedLocationClient.lastLocation.addOnCompleteListener(this) { task ->
              var location: Location? = task.result
              if (location == null) {
                  requestNewLocationData()
              } else {
                  findViewById<TextView>(R.id.latTextView).text = location.latitude.toString()
                  findViewById<TextView>(R.id.lonTextView).text = location.longitude.toString()
              }
          }
      

      您还可以检查某些配置,例如设备是否启用了位置设置。您还可以查看Detect Current Latitude & Longitude using Kotlin in Android 上的文章以了解更多功能。 如果没有缓存位置,那么它将捕获当前位置:

      private fun requestNewLocationData() {
          var mLocationRequest = LocationRequest()
          mLocationRequest.priority = LocationRequest.PRIORITY_HIGH_ACCURACY
          mLocationRequest.interval = 0
          mLocationRequest.fastestInterval = 0
          mLocationRequest.numUpdates = 1
      
          mFusedLocationClient = LocationServices.getFusedLocationProviderClient(this)
          mFusedLocationClient!!.requestLocationUpdates(
                  mLocationRequest, mLocationCallback,
                  Looper.myLooper()
          )
      }
      

      【讨论】:

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