我需要通过GPS程序获得我的当前位置。 我怎样才能做到呢?


当前回答

既然谷歌Play位置服务已经推出,我建议开发者开始使用新的融合位置提供商。你会发现它更容易使用和更准确。请观看谷歌I/O视频《超越蓝点:Android位置的新功能》,由两位创建了新的谷歌Play位置服务API的人制作。

I've been working with location APIs on a number of mobile platforms, and I think what these two guys have done is really revolutionary. It's gotten rid of a huge amount of the complexities of using the various providers. Stack Overflow is littered with questions about which provider to use, whether to use last known location, how to set other properties on the LocationManager, etc. This new API that they have built removes most of those uncertainties and makes the location services a pleasure to use.

I've written an Android app that periodically gets the location using Google Play location services and sends the location to a web server where it is stored in a database and can be viewed on Google Maps. I've written both the client software (for Android, iOS, Windows Phone and Java ME) and the server software (for ASP.NET and SQL Server or PHP and MySQL). The software is written in the native language on each platform and works properly in the background on each. Lastly, the software has the MIT License. You can find the Android client here:

https://github.com/nickfox/GpsTracker/tree/master/phoneClients/android

其他回答

你需要使用latest/最新的

GoogleApiClient Api

基本上你需要做的是:

private GoogleApiClient mGoogleApiClient;
mGoogleApiClient = new GoogleApiClient.Builder(this)
                .addApi(LocationServices.API)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .build();

然后

@Override
    public void onConnected(Bundle connectionHint) {
        mLastLocation = LocationServices.FusedLocationApi.getLastLocation(
                mGoogleApiClient);
        if (mLastLocation != null) {
            mLatitudeText.setText(String.valueOf(mLastLocation.getLatitude()));
            mLongitudeText.setText(String.valueOf(mLastLocation.getLongitude()));
        }
    }

为最准确可靠的定位。请看我的帖子:

https://stackoverflow.com/a/33599228/2644905

不要使用LocationListener,它是不准确的,有延迟响应。老实说,这更容易实现。 请阅读文档:https://developers.google.com/android/reference/com/google/android/gms/common/api/GoogleApiClient

获得位置更新需要大量的代码在Android,你需要照顾

谷歌播放服务可用性检查, 更新谷歌播放服务,如果它是旧的或不可用 对话框创建GoogleApiClient和它的回调连接,断开等。 停止并释放用于位置更新的资源 处理位置权限场景 检查“位置”服务是否开启 获取最后已知位置也不是那么容易 如果在一定时间后没有得到位置,则退回到最后一个已知位置

为了简化所有这些步骤,我创建了android - easylocation(小型android库),它将照顾所有这些东西,你可以专注于业务逻辑。

所有你需要的是扩展EasyLocationActivity和这个

requestSingleLocationFix(easyLocationRequest);

or

requestLocationUpdates(easyLocationRequest);

签出示例应用程序和步骤需要在这里https://github.com/akhgupta/Android-EasyLocation

我已经得到非常准确的位置使用FusedLocationProviderClient (谷歌播放服务要求)

权限要求

android.permission.ACCESS_FINE_LOCATION

android.permission.ACCESS_COARSE_LOCATION

依赖

“com.google.android.gms: play-services-location: 15.0.0”

芬兰湾的科特林代码

val client = FusedLocationProviderClient(this)
val location = client.lastLocation
location.addOnCompleteListener {
    // this is a lambda expression and we get an 'it' iterator to access the 'result'
    // it.result.latitude gives the latitude
    // it.result.longitude gives the longitude 
    val geocoder = Geocoder(applicationContext, Locale.getDefault())
    val address = geocoder.getFromLocation(it.result.latitude, it.result.longitude, 1)
    if (address != null && address.size > 0) {
        // Get the current city
        city = address[0].locality
    }
}
location.addOnFailureListener {
    // Some error in getting the location, let's log it
    Log.d("xtraces", it.message)
}

既然谷歌Play位置服务已经推出,我建议开发者开始使用新的融合位置提供商。你会发现它更容易使用和更准确。请观看谷歌I/O视频《超越蓝点:Android位置的新功能》,由两位创建了新的谷歌Play位置服务API的人制作。

I've been working with location APIs on a number of mobile platforms, and I think what these two guys have done is really revolutionary. It's gotten rid of a huge amount of the complexities of using the various providers. Stack Overflow is littered with questions about which provider to use, whether to use last known location, how to set other properties on the LocationManager, etc. This new API that they have built removes most of those uncertainties and makes the location services a pleasure to use.

I've written an Android app that periodically gets the location using Google Play location services and sends the location to a web server where it is stored in a database and can be viewed on Google Maps. I've written both the client software (for Android, iOS, Windows Phone and Java ME) and the server software (for ASP.NET and SQL Server or PHP and MySQL). The software is written in the native language on each platform and works properly in the background on each. Lastly, the software has the MIT License. You can find the Android client here:

https://github.com/nickfox/GpsTracker/tree/master/phoneClients/android

自2020年9月23日起,play-services-location版本17.1.0包含了FusedLocationProviderClient.getCurrentLocation()方法,这是获得当前位置的推荐和直接的方法:

返回设备上的单个当前位置固定。与返回缓存位置的getLastLocation()不同,此方法可能导致设备上的活动位置计算。如果能在合理的时间内(几十秒)确定设备位置,将返回一个新的位置,否则将返回null。

关于详细的例子,看看codingjeremy的回答和GitHub上的官方Android位置示例- Current location (Kotlin)。