繁体   English   中英

Android - 仅获取一次位置

[英]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 执行此操作。 获取上次已知位置

对于 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM