在Android中获取用户定位位置的最有效方法是什么?
通过高效,我的意思是快速而不是过于侵扰权限(也是在Android 6.0上最近的权限更改之后)。
问题的第二部分是获取Google地图api以外的用户位置的其他方式吗?
答案 0 :(得分:0)
使用LocationManager。
LocationManager lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
Location location = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
double longitude = location.getLongitude();
double latitude = location.getLatitude();
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" />
希望它有所帮助。
答案 1 :(得分:0)
更快,使用Google Api,而不是Android Api:
首先,让您的类扩展GoogleApiClient.ConnectionCallbacks和LocationListener接口,并声明一个GoogleApiClient变量。
private GoogleApiClient gApiClient;
其次,从onCreate或类似的方法调用此方法:
protected synchronized void buildGoogleApiClient() {
gApiClient = new GoogleApiClient.Builder(getActivity())
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(new GoogleApiClient.OnConnectionFailedListener() {
@Override
public void onConnectionFailed(ConnectionResult connectionResult) {
}
})
.addApi(LocationServices.API)
.build();
gApiClient.connect();
createLocationRequest();
}
protected void createLocationRequest() {
mLocationRequest = new LocationRequest();
mLocationRequest.setInterval(10000);
mLocationRequest.setFastestInterval(5000);
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
}
最后覆盖此方法:
@Override
public void onLocationChanged(Location location) {
tempLatitude=location.getLatitude();
tempLongitude=location.getLongitude();
}
--- --- EDIT
我刚刚意识到我错过了一个方法,这个方法在连接fApiClient后自动调用:
@Override
public void onConnected(Bundle bundle) {
Location lkn= LocationServices.FusedLocationApi.getLastLocation(
gApiClient);
if(lkn!=null){
tempLatitud=lkn.getLatitude();
tempLongitud=lkn.getLongitude();
}
LocationServices.FusedLocationApi.requestLocationUpdates(
gApiClient, mLocationRequest, this);
}
而且,如果您正在使用地图,则需要扩展另外两个接口:OnMapReadyCallback和GoogleMap.OnMapClickListener,以防万一您需要对用户点击地图做出反应。第一个只需要实现onMapReady方法(GoogleMap map)。在该方法中,你可以做到
this.map=map;
(this.map指的是您在班级中声明的GoogleMap变量。)
之后,您的地图就可以使用了。
您将使用onLocationChanged方法更新设备的位置,以便您使用它们。
回答你的第二个问题,你可以通过细胞塔的三角测量来获得你的经纬度。看here