Android - 只获取一次位置
Posted
技术标签:
【中文标题】Android - 只获取一次位置【英文标题】:Android - Get Location Only One Time 【发布时间】:2011-06-11 18:41:52 【问题描述】:我需要在 android 应用程序上获取当前用户位置,因此我在网上阅读了一些教程和示例,但我看到在所有示例中,位置都是从“onLocationChange”中检索到的,这意味着每次位置改变时,都会执行“onLocationChange”中的代码。
我只需要在应用启动时获取用户位置。
感谢您的帮助!
【问题讨论】:
【参考方案1】:您可以使用下面的代码获取最后知道的位置。它获取位置提供程序并向后循环数组。即从 GPS 开始,如果没有 GPS,则获取网络位置。您可以在需要获取位置时调用此方法。
private double[] getGPS()
LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
List<String> providers = lm.getProviders(true);
/* Loop over the array backwards, and if you get an accurate location, then break out the loop*/
Location l = null;
for (int i=providers.size()-1; i>=0; i--)
l = lm.getLastKnownLocation(providers.get(i));
if (l != null) break;
double[] gps = new double[2];
if (l != null)
gps[0] = l.getLatitude();
gps[1] = l.getLongitude();
return gps;
【讨论】:
我的 lat 和 long 都是 0.0,有什么想法吗? 你是在模拟器还是真机上测试? @Maurice,你得到 0.0 因为 Java 自动将零设置为变量。当 l==null 时,你会得到 gps = new double[2];其中所有元素都为零:) 如何在 mainactivity 上调用它?【参考方案2】:您可以使用 LocationManager.getLastKnownLocation
【讨论】:
感谢您的回答,从您的链接看来,我总是需要设置提供者...是吗?我必须获得更好的提供者并将其设置在 getLastKnownLocation 中吗? 是的,这就是你需要做的。【参考方案3】:使用 LocationManager.requestSingleUpdate()
看:http://developer.android.com/reference/android/location/LocationManager.html#requestSingleUpdate%28java.lang.String,%20android.location.LocationListener,%20android.os.Looper%29
【讨论】:
【参考方案4】:把这个放在主要活动中:
boolean bFirst = true;
function void onCreate(blabla)
if(bFirst)
//Do your stuff to get the location
bFirst = false;
把同样的放在onResume();
【讨论】:
这使得代码只执行一次,但是条件测试是不断探测的 一个无用的答案 @CaioComC 而不是仅仅投反对票(一个非常老的问题),您能否解释一下为什么它是一个无用的答案,以及可以改进的地方?【参考方案5】:对于 Phobos 建议正常工作的 getGPS()
方法,您必须在 AndroidManifest.xml 中允许访问
这将消除您收到 0.0 的错误
添加这些行:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.LOCATION_HARDWARE" />
【讨论】:
【参考方案6】:您可以使用此方法从所有提供商处获得最佳位置。 首先创建一个名为 FetchLocation
的类public class FetchLocation implements LocationListener
private OnLocationFetchListner onLocationFetchListner;
private LocationManager locationManager;
public void setOnLocationFetchListner(OnLocationFetchListner fetchListner, Context context)
this.onLocationFetchListner = fetchListner;
locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
if (ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED)
onLocationFetchListner.OnFailed("PERMISSION DENIED");
return;
Criteria criteria = new Criteria();
String provider = locationManager.getBestProvider(criteria, false);
Log.d("TAG", "BestProvider: " + provider);
if (provider != null)
locationManager.requestLocationUpdates(provider, 60 * 1000, 100, this, Looper.getMainLooper());
else
onLocationFetchListner.OnFailed("NO PROVIDERS");
@Override
public void onLocationChanged(@NonNull Location location)
if (location != null)
onLocationFetchListner.OnComplete(location);
locationManager.removeUpdates(this);
locationManager = null;
@Override
public void onStatusChanged(String provider, int status, Bundle extras)
@Override
public void onProviderEnabled(@NonNull String provider)
@Override
public void onProviderDisabled(@NonNull String provider)
然后你创建一个OnLocationFetchListner接口!
public interface OnLocationFetchListner
void OnComplete(Location location);
void OnFailed(String e);
那么你就可以在代码的任何地方调用这个方法了!
FetchLocation fetchLocation = new FetchLocation();
fetchLocation.setOnLocationFetchListner(new OnLocationFetchListner()
@Override
public void OnComplete(Location location)
//do your work here
@Override
public void OnFailed(String e)
Log.d("TAG", "OnFailed: "+e);
, context);
你必须在 AndroidManifest.xml
中添加这个<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
【讨论】:
以上是关于Android - 只获取一次位置的主要内容,如果未能解决你的问题,请参考以下文章
在 Android 8+ 中无法获取 HIGH_ACCURACY 背景位置