如何在android中获取移动设备的经纬度?

Posted

技术标签:

【中文标题】如何在android中获取移动设备的经纬度?【英文标题】:How to get Latitude and Longitude of the mobile device in android? 【发布时间】:2010-02-09 06:48:15 【问题描述】:

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

【问题讨论】:

【参考方案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.
        trygps_enabled=lm.isProviderEnabled(LocationManager.GPS_PROVIDER);catch(Exception ex)
        trynetwork_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()
    )

【讨论】:

以上是关于如何在android中获取移动设备的经纬度?的主要内容,如果未能解决你的问题,请参考以下文章

如何在swift ios中从移动网络获取纬度和经度[关闭]

如何使用java在android移动设备中获取位图uri

地理编码器在 Android 移动设备上的实施范围有多广?

Unity中获取移动设备GPS信息

即使设备没有移动,位置也会不断变化

移动开发平台 mPaaS-kylin 定位