如何获得在android的移动设备的纬度和经度?
如何在Android中使用定位工具获取移动设备的当前纬度和经度?
使用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()
方法 ,它将为您提供asynchronous更新你的位置。
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
权限 。
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
您可能还想在GPS不可用时添加ACCESS_COARSE_LOCATION
权限 ,并使用getBestProvider()
方法select您的位置提供程序。
这里是LocationFinder
的类来查找GPS位置。 这个类将调用MyLocation
,这将做生意。
LocationFinder
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); } }
随着google
东西经常变化:非以前的答案为我工作。
2016年4月
基于这个谷歌培训这里是你如何使用它
融合位置提供商
这需要设置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"); } }
你可以使用这个获得当前的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(); } }
`
上面的解决scheme也是正确的,但有些时候,如果位置为null,那么它会崩溃的应用程序或不正常工作。 获得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(); } }