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 中不断更新,而不是一次

Android:从 sd 卡上的特定位置获取缩略图

在 Android 8+ 中无法获取 HIGH_ACCURACY 背景位置

Android一次获取用户位置

Android:FusedLocationProvider,每隔几秒获取一次位置

如何在不跟踪的情况下只获取一次用户位置?