Android - 获取位置的最简单方法[重复]
Posted
技术标签:
【中文标题】Android - 获取位置的最简单方法[重复]【英文标题】:Android - Easiest way to get location [duplicate] 【发布时间】:2018-05-06 15:20:36 【问题描述】:Ciao!我有一个需要当前位置的 Activity,以便用户可以看到哪些对象靠近他。
好吧,我要为 GoogleApiClient、FusedLocation、回调等而疯狂,我得到的唯一结果是 getLastLocation
返回 null
。
我的 Activity 实现了 GoogleApiClient.ConnectionCallbacks
和 GoogleApiClient.OnConnectionFailedListener
。
在OnCreate
中我调用getLocation()
是这样的:
private void getLocation()
locationRequest = LocationRequest.create();
locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
locationRequest.setInterval(60*1000);
locationRequest.setFastestInterval(10*1000);
mFusedLocationApi = LocationServices.FusedLocationApi;
gApiClient = new GoogleApiClient.Builder(this)
.addApi(LocationServices.API)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.build();
if (gApiClient != null)
gApiClient.connect();
我也有这个:
@Override
protected void onStart()
super.onStart();
if (gApiClient != null)
gApiClient.connect();
@Override
protected void onStop()
gApiClient.disconnect();
super.onStop();
@Override
public void onConnectionFailed(ConnectionResult connectionResult)
Log.w("ADVSEARCH","Error on connection failed");
@Override
public void onConnectionSuspended(int i)
Log.w("ADVSEARCH","Error on connection suspended");
@Override
public void onConnected(Bundle bundle)
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED)
//lastlocation = LocationServices.FusedLocationApi.getLastLocation(gApiClient);
mFusedLocationApi.requestLocationUpdates(gApiClient, locationRequest, new com.google.android.gms.location.LocationListener()
@Override
public void onLocationChanged(Location location)
lastlocation = location;
);
lastlocation = LocationServices.FusedLocationApi.getLastLocation(gApiClient);
是的,在OnCreate
我检查权限。最低 API 16,目标 API 25。
每次我第一次打开应用程序时它都会崩溃,因为我在空对象上使用了distanceTo
。我错过了什么?我搜索的越多,我就越困惑。
【问题讨论】:
“每次我第一次打开应用程序时它都会崩溃,因为我在一个空对象上使用了distanceTo
”——您没有在问题的代码清单中使用distanceTo()
。跨度>
@CommonsWare 它只是clickListener
中的distanceTo()
,没有其他相关行。我只写关于位置的代码,我知道lastLocation
是空的,因为我在distanceTo()
之前记录它。
好吧,getLastLocation()
可以返回null
。在getLastLocation()
或onLocationChanged()
设置之前,您无需尝试使用lastlocation
。例如,您可以禁用该按钮,直到获得非null
位置。
【参考方案1】:
我认为这可能是不同的事情,例如您没有在 Manifest 文件中设置所有内容,或者您在运行时没有权限(您需要在应用程序首次启动时允许这样做,或者在应用程序设置中手动设置)。试试这个...
build.gradle
implementation 'com.google.android.gms:play-services-location:11.6.0'
在您的 Activity.java
中private static final int PERMISSION_REQUEST_FINE_LOCATION = 1;
private void getLocationRequest()
FusedLocationProviderClient client = LocationServices.getFusedLocationProviderClient(this);
if (!checkPermission())
getLocationPermissions();
return;
client.getLastLocation()
.addOnSuccessListener(this, new OnSuccessListener<Location>()
@Override
public void onSuccess(Location location)
// Got last known location. In some rare situations this can be null.
if (location != null)
// Logic to handle location object
Log.e("TAG", "location = " + location);
else
Log.e("TAG", "not successful");
);
private boolean checkPermission()
return isGranted(ActivityCompat.checkSelfPermission(this, ACCESS_FINE_LOCATION)) &&
isGranted(ActivityCompat.checkSelfPermission(this, ACCESS_COARSE_LOCATION));
@TargetApi(Build.VERSION_CODES.M)
private void getLocationPermissions()
requestPermissions(new String[] Manifest.permission.ACCESS_FINE_LOCATION,
PERMISSION_REQUEST_FINE_LOCATION);
@Override
public void onRequestPermissionsResult(int code, @Nullable String permissions[], @Nullable int[] results)
switch (code)
case PERMISSION_REQUEST_FINE_LOCATION:
if (isPermissionGranted(results))
getLocationRequest();
private boolean isPermissionGranted(int[] results)
return results != null && results.length > 0 && isGranted(results[0]);
private boolean isGranted(int permission)
return permission == PackageManager.PERMISSION_GRANTED;
这会询问您是否尚未设置权限,并在得到肯定的对话结果后再次调用getLocationRequest
。
并检查您的 AndroidManifest.xml
中是否有此内容<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-feature android:name="android.hardware.location.gps" />
<uses-feature android:name="android.hardware.location.network" />
当然,您必须适应您的需求(精细或粗糙的位置等)。
希望这能让你走上正轨;)
【讨论】:
或者你可以使用这个非常痛苦的库github.com/mrmans0n/smart-location-lib。 我删除了所有内容,现在,使用您的代码,它看起来可以正常工作。谢谢! @tuzzo 如果有帮助,请随时接受我的回答;)以上是关于Android - 获取位置的最简单方法[重复]的主要内容,如果未能解决你的问题,请参考以下文章
在 Android 上获取用户当前位置的最简单、最可靠的方法是啥?