在Android中查找用户的当前位置
Posted
技术标签:
【中文标题】在Android中查找用户的当前位置【英文标题】:Finding current location of the user in Android 【发布时间】:2016-11-18 04:50:46 【问题描述】:我是 android 新手,我正在尝试开发一个显示用户当前位置的 Android 应用程序。我正在使用 Genymotion。现在我正在使用
mLocation=LocationServices.FusedLocationApi.getLastLocation(mGoogleClient);
获取设备的最后位置。问题是我想获得当前位置,但有了这个我得到mlocation
不为空,这很好。但在地图中,它始终显示设备的最后位置,而不是当前位置。
代码 sn-p
@Override
public void onConnected(Bundle bundle)
Log.i(TAG, "inside onconnected Location services connected");
Location mLocation=null;
mLocationRequest= new LocationRequest();
mLocationRequest.setInterval(10 * 1000) ;
mLocationRequest.setFastestInterval(1 * 1000);mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) !=
PackageManager.PERMISSION_GRANTED &&
ActivityCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_COARSE_LOCATION) !=
PackageManager.PERMISSION_GRANTED)
mLocation=LocationServices.FusedLocationApi.getLastLocation(mGoogleClient);
if(mLocation==null)
Log.d("***Inside mlocation***", "***mlocation is null here");
if (mLocation != null)
onLocationChanged(mLocation);
LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleClient, mLocationRequest, this);
@Override
public void onLocationChanged(Location location)
double currentLatitude = location.getLatitude();
double currentLongitude = location.getLongitude();
LatLng latLng = new LatLng(currentLatitude,currentLongitude);
MarkerOptions options = new MarkerOptions()
.position(latLng)
.title("Im here!");
mMap.addMarker(options);
mMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));
在onstart()
中,我调用了googleapi.connect()
,并适当地使用了setUpMapIfNeeded()
。
请告诉我这段代码有什么问题。我正在尝试这个 3 天。
【问题讨论】:
在您的代码中没有提及 gps 开/关。你应该在应用程序前台打开gps。 嗨,杰伊,我的模拟器中的 gps 已打开,但我从你的陈述中了解到,我需要检查 gps 的可用性,对吗??但我认为它也没有任何区别。 检查我的答案@Navi 【参考方案1】:用代码发布简单的解决方案。
在 AndroidManifest.xml 文件中添加权限
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
如果您的应用与棉花糖兼容,请检查运行时权限。
在 gradle 文件中添加依赖:
compile 'com.google.android.gms:play-services:9.2.0'
在你的活动中实现这两个接口
GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener
和
在 oncreate 中像这样创建 googleapiclient 对象:
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(LocationServices.API)
.build();
并在开始活动时进行此操作
mGoogleApiClient.connect();
我们在此覆盖方法上继续位置的结果回调。
public void onConnected(@Nullable Bundle bundle)
Location mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
if (mLastLocation != null)
Log.e(TAG, "onConnected: " + String.valueOf(mLastLocation.getLatitude()) + ":" + String.valueOf(mLastLocation.getLongitude()));
else
Toast.makeText(getApplicationContext(), "Your Location Not Found", Toast.LENGTH_LONG).show();
完整的活动代码是这样的:
public class LocationActivity extends AppCompatActivity implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener
private static final String TAG = LocationActivity.class.getSimpleName();
private GoogleApiClient mGoogleApiClient;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_location);
// Create an instance of GoogleAPIClient.
if (mGoogleApiClient == null)
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(LocationServices.API)
.build();
@Override
protected void onStart()
// connect googleapiclient
mGoogleApiClient.connect();
super.onStart();
@Override
protected void onStop()
// disconnect googleapiclient
mGoogleApiClient.disconnect();
super.onStop();
@Override
public void onConnected(@Nullable Bundle bundle)
Location mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
if (mLastLocation != null)
// here we go you can see current lat long.
Log.e(TAG, "onConnected: " + String.valueOf(mLastLocation.getLatitude()) + ":" + String.valueOf(mLastLocation.getLongitude()));
@Override
public void onConnectionSuspended(int i)
@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult)
p.s. googleapiclient 无法在没有播放服务的模拟器中运行,因此您必须在真实设备上进行测试。 请确保在该设备上启用了 gps。
如果您想使用传统方法获取位置,请尝试本教程。 http://www.androidhive.info/2012/07/android-gps-location-manager-tutorial/
------更新 6 月 15 日---------
最新的api 检查安卓谷歌帖子: https://android-developers.googleblog.com/2017/06/reduce-friction-with-new-location-apis.html
【讨论】:
我写了和上面一样的代码。完全一样,加上一些标记就是这样..但没有得到什么问题。 你的意思是说即使在模拟器中安装了google play服务之后,这段代码也不起作用..?因为我的精灵动作已经安装了所有东西..现在我必须做什么..我需要在我的安卓手机上测试它吗..? 杰伊你知道吗..我得到了像纬度经度这样的一切,使用地理编码器我什至还能得到地址..但这是错误的,因为我得到的是模拟器以前位置的纬度和经度,而不是我的当前位置。我尝试了所有方法都没有解决问题.. 杰伊我不能在***中分享你的apk文件..那个功能不在那里..那我怎么给你..?? @Navi 让群聊chat.***.com/rooms/117677/abcdxyz【参考方案2】:对于地图服务,它需要 Google Play 服务。如果没有,请确保您的 Genymotion 已安装 PlayService 从Here 获得帮助以在 Genymotion 中安装 Google Play 服务。 快乐编码..!!!
【讨论】:
hi raj,google play 服务安装正确。 Google Map Api With Android Official Documentation Here->developers.google.com/maps/documentation/android-api【参考方案3】: LocationListener locationListener;
LocationManager locationManager;
double latitude;
double longitude;
locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
locationListener = new LocationListener()
@Override
public void onLocationChanged(Location location)
longitude = location.getLongitude();
latitude = location.getLatitude();
@Override
public void onStatusChanged(String provider, int status, Bundle extras)
@Override
public void onProviderEnabled(String provider)
@Override
public void onProviderDisabled(String provider)
;
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED)
// TODO: Consider calling
// ActivityCompat#requestPermissions
// here to request the missing permissions, and then overriding
// public void onRequestPermissionsResult(int requestCode, String[] permissions,
// int[] grantResults)
// to handle the case where the user grants the permission. See the documentation
// for ActivityCompat#requestPermissions for more details.
;
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,1000, 0, locationListener);
Log.e("location", longitude + " " + latitude);
【讨论】:
嗨,Nandish,我添加了相同的代码并进行了相应的更改,但我仍然得到了相同的旧位置。在上面的代码中,我有一个疑问,当调用 onLocationChanged() 时,位置对象为空,对吧..??因为我们没有向它传递任何价值.. 请建议我..以上是关于在Android中查找用户的当前位置的主要内容,如果未能解决你的问题,请参考以下文章