如何在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_LOCATION 和 ACCESS_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中获取移动设备的经纬度?的主要内容,如果未能解决你的问题,请参考以下文章