使用 GPS 获取当前位置
Posted
技术标签:
【中文标题】使用 GPS 获取当前位置【英文标题】:get current Location with GPS 【发布时间】:2016-12-01 08:30:13 【问题描述】:我想每 30 秒获取一次当前的纬度和经度,但我可以在每 30 秒内获取相同的坐标,它不会改变我使用 Gps 服务类,它位于下面。当我移动到设备时如何更改位置。
public class GPSService extends Service implements LocationListener
// saving the context for later use
private final Context mContext;
// if GPS is enabled
boolean isGPSEnabled = false;
// if Network is enabled
boolean isNetworkEnabled = false;
// if Location co-ordinates are available using GPS or Network
public boolean isLocationAvailable = false;
// Location and co-ordinates coordinates
Location mLocation;
double mLatitude;
double mLongitude;
// Minimum time fluctuation for next update (in milliseconds)
private static final long TIME = 30000;
// Minimum distance fluctuation for next update (in meters)
private static final long DISTANCE = 20;
// Declaring a Location Manager
protected LocationManager mLocationManager;
public GPSService(Context context)
this.mContext = context;
mLocationManager = (LocationManager) mContext
.getSystemService(LOCATION_SERVICE);
/**
* Returs the Location
*
* @return Location or null if no location is found
*/
public Location getLocation()
try
// Getting GPS status
isGPSEnabled = mLocationManager
.isProviderEnabled(LocationManager.GPS_PROVIDER);
// If GPS enabled, get latitude/longitude using GPS Services
if (isGPSEnabled)
mLocationManager.requestLocationUpdates(
LocationManager.GPS_PROVIDER, TIME, DISTANCE, this);
if (mLocationManager != null)
mLocation = mLocationManager
.getLastKnownLocation(LocationManager.GPS_PROVIDER);
if (mLocation != null)
mLatitude = mLocation.getLatitude();
mLongitude = mLocation.getLongitude();
isLocationAvailable = true; // setting a flag that
// location is available
return mLocation;
// If we are reaching this part, it means GPS was not able to fetch
// any location
// Getting network status
isNetworkEnabled = mLocationManager
.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
if (isNetworkEnabled)
mLocationManager.requestLocationUpdates(
LocationManager.NETWORK_PROVIDER, TIME, DISTANCE, this);
if (mLocationManager != null)
mLocation = mLocationManager
.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
if (mLocation != null)
mLatitude = mLocation.getLatitude();
mLongitude = mLocation.getLongitude();
isLocationAvailable = true; // setting a flag that
// location is available
return mLocation;
// If reaching here means, we were not able to get location neither
// from GPS not Network,
if (!isGPSEnabled)
// so asking user to open GPS
askUserToOpenGPS();
catch (Exception e)
e.printStackTrace();
// if reaching here means, location was not available, so setting the
// flag as false
isLocationAvailable = false;
return null;
/**
* Gives you complete address of the location
*
* @return complete address in String
*/
public String getLocationAddress()
if (isLocationAvailable)
Geocoder geocoder = new Geocoder(mContext, Locale.getDefault());
// Get the current location from the input parameter list
// Create a list to contain the result address
List<Address> addresses = null;
try
/*
* Return 1 address.
*/
addresses = geocoder.getFromLocation(mLatitude, mLongitude, 1);
catch (IOException e1)
e1.printStackTrace();
return ("IO Exception trying to get address:" + e1);
catch (IllegalArgumentException e2)
// Error message to post in the log
String errorString = "Illegal arguments "
+ Double.toString(mLatitude) + " , "
+ Double.toString(mLongitude)
+ " passed to address service";
e2.printStackTrace();
return errorString;
// If the reverse geocode returned an address
if (addresses != null && addresses.size() > 0)
// Get the first address
Address address = addresses.get(0);
/*
* Format the first line of address (if available), city, and
* country name.
*/
String addressText = String.format(
"%s, %s, %s",
// If there's a street address, add it
address.getMaxAddressLineIndex() > 0 ? address
.getAddressLine(0) : "",
// Locality is usually a city
address.getLocality(),
// The country of the address
address.getCountryName());
// Return the text
return addressText;
else
return "No address found by the service: Note to the developers, If no address is found by google itself, there is nothing you can do about it.";
else
return "Location Not available";
/**
* get latitude
*
* @return latitude in double
*/
public double getLatitude()
if (mLocation != null)
mLatitude = mLocation.getLatitude();
return mLatitude;
/**
* get longitude
*
* @return longitude in double
*/
public double getLongitude()
if (mLocation != null)
mLongitude = mLocation.getLongitude();
return mLongitude;
/**
* close GPS to save battery
*/
public void closeGPS()
if (mLocationManager != null)
mLocationManager.removeUpdates(GPSService.this);
/**
* show settings to open GPS
*/
public void askUserToOpenGPS()
AlertDialog.Builder mAlertDialog = new AlertDialog.Builder(mContext);
// Setting Dialog Title
mAlertDialog.setTitle("Location not available, Open GPS?")
.setMessage("Activate GPS to use use location services?")
.setPositiveButton("Open Settings", new DialogInterface.OnClickListener()
public void onClick(DialogInterface dialog, int which)
Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
mContext.startActivity(intent);
)
.setNegativeButton("Cancel",new DialogInterface.OnClickListener()
public void onClick(DialogInterface dialog, int which)
dialog.cancel();
).show();
/**
* Updating the location when location changes
*/
@Override
public void onLocationChanged(Location location)
mLatitude = location.getLatitude();
mLongitude = location.getLongitude();
@Override
public void onProviderDisabled(String provider)
@Override
public void onProviderEnabled(String provider)
@Override
public void onStatusChanged(String provider, int status, Bundle extras)
@Override
public IBinder onBind(Intent arg0)
return null;
我为 Myclass 调用 getLocation 方法
double latitudem2, longitudem2;
String cnvrt_latitude2,cnvrt_longitude2;
if (mGPSService2.isLocationAvailable == false)
cnvrt_latitude2 = "0";
cnvrt_longitude2 = "0";
// Or you can continue without getting the location, remove the return; above and uncomment the line given below
// address = "Location not available";
else
mGPSService2.getLocation();
// Getting current location co-ordinates
latitudem2 = mGPSService2.getLatitude();
longitudem2 = mGPSService2.getLongitude();
//Toast.makeText(getApplicationContext(), "Latitude:" + latitudem + " | Longitude: " + longitudem, Toast.LENGTH_LONG).show();
cnvrt_latitude2 = String.valueOf(latitudem2);
cnvrt_longitude2 = String.valueOf(longitudem2);
【问题讨论】:
【参考方案1】:我使用了不同的方法。我认为你应该使用 Google play。
dependencies
..
compile 'com.google.android.gms:play-services:8.4.0'
..
在你的活动中:
private void initGoogleClient()
googleClient = new GoogleApiClient.Builder(this)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(LocationServices.API)
.build();
然后注册您的应用:
LocationRequest req = new LocationRequest();
req.setInterval(60 * 60 * 1000);
req.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
LocationServices.FusedLocationApi.requestLocationUpdates(googleClient, req, this);
您可以根据自己的要求更改优先级。 不要忘记在你的 Activity 中实现监听器
public class MainActivity extends AppCompatActivity
implements GoogleApiClient.OnConnectionFailedListener,
GoogleApiClient.ConnectionCallbacks,
LocationListener
...
我做了类似的东西来根据当前位置知道紫外线指数。你可以看看我的post。
【讨论】:
当我运行我的方法时,它可以工作,当我在我的手机上移动到 android 5.0 的手机纬度和经度时,但是当我尝试使用我的平板电脑时,它的 android 4.2 位置没有改变。你知道这个问题吗? 听起来有点奇怪..您可以尝试使用我的代码并检查它是否有效。对我来说效果很好。以上是关于使用 GPS 获取当前位置的主要内容,如果未能解决你的问题,请参考以下文章