[英]Android - Get Location Only One Time
我需要在 android 应用程序上获取当前用户位置,所以我在网上阅读了一些教程和示例,但我看到在所有示例中,位置是从“onLocationChange”中检索的,这意味着每次位置改变,执行“onLocationChange”中的代码。
我只需要在应用程序启动时获取用户位置。
谢谢你的帮助!
您可以使用下面的代码获取最后知道的位置。 它获取位置提供者并向后遍历数组。 即以 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;
}
使用 LocationManager.requestSingleUpdate()
看看: http : //developer.android.com/reference/android/location/LocationManager.html#requestSingleUpdate%28java.lang.String,%20android.location.LocationListener,%20android.os.Looper%29
您可以使用 LocationManager 执行此操作。 获取上次已知位置
对于 Phobos 建议正常工作的getGPS()
方法,您必须允许在您的 AndroidManifest.xml 中访问
这将消除您收到 0.0 的错误
添加这些行:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.LOCATION_HARDWARE" />
把它放在主要活动中:
boolean bFirst = true;
function void onCreate(blabla) {
if(bFirst) {
//Do your stuff to get the location
bFirst = false;
}
}
将相同的内容放在 onResume() 中;
您可以使用此方法从所有提供商处获取最佳位置。 首先创建一个名为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" />
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.