需要Android活动等到GPS位置获得

时间:2013-07-25 16:36:27

标签: android android-activity gps wait android-location

抱歉我的英文。 我正试图从GPS获取一个位置以放置全局变量纬度,经度。 GPS打开,但在从GPS检索数据之前,活动仍在继续。

我需要换句话说...方法getCurrentLocation()只有在找到位置并填充经度和纬度变量时才能完成,所以我可以在其他方法中使用它们。 我知道......用户必须等待......我将在屏幕上显示一些内容。 我该怎么办? 谢谢

我想我正在某个地方跳过停止听GPS。哪里更好?

代码如下:

//Method to retrieve coordinates
public void getCurrentLocation() {
    //Use GPS if possible
    if(manager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
        //assign Listener to GPS
        manager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, listener);
        Toast.makeText(this, LocationManager.GPS_PROVIDER, Toast.LENGTH_SHORT).show();
    }
    else if(manager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)){//toherwise, use NETWORK
        //assign Listener to NETWORK
        manager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, listener);
        Toast.makeText(this, LocationManager.NETWORK_PROVIDER, Toast.LENGTH_SHORT).show();
    }
}

//Class to store the location recived in two variables
final class MyLocationListener implements LocationListener {

    @Override
    public void onLocationChanged(Location location) {
        //coordinates storing
        latitude = String.valueOf(location.getLatitude());
        longitude = String.valueOf(location.getLongitude());
        Toast.makeText(getApplicationContext(), latitude + longitude, Toast.LENGTH_LONG).show();
    }

    @Override
    public void onProviderDisabled(String provider) {
        // TODO Auto-generated method stub
    }

    @Override
    public void onProviderEnabled(String provider) {
        // TODO Auto-generated method stub
    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
        // TODO Auto-generated method stub
    }
}

4 个答案:

答案 0 :(得分:2)

使用LocusService第三方库! Goto LocusService

通过调用简单的功能,您可以轻松获得当前的GPS或网络位置....

要解决您的问题,请使用此代码!

library(stringr)
params <- "var1 /* first, variable */, var2, var3 /* third, variable */"
# Split by , which are not enclosed in your /*...*/ 
params_split <- str_split(params, ",(?=[^(/[*])]*(/[*]))")[[1]]
# Extract matches of /*...*/, only taking the contents
params_def <- str_match(params_split, "/[*] *(.*?) *[*]/")[,2]
params_def[is.na(params_def)] <- ""
# Remove traces of /*...*/
params_clean <- trimws(gsub("/[*] *(.*?) *[*]/", "", params_split))

答案 1 :(得分:1)

如果您希望Android活动等到获得GPS位置,您可以尝试使用AsyncTask。有关答案,请参阅Android find GPS location once, show loading dialog。基本上在onPreExecute中你可以开始对话(它在doInBackground被调用之前开始)。这意味着您要等到可以定位并显示对话框的时间。然后在doInBackground中,您可以获得该位置。完成后onPostExecute被调用。您可以从onPostExecute内停止。您可以检查位置是否为空,然后如果需要,还可以从onPostExecute内部调用其他功能。

这可能是一种方式。您可以从AsyncTask Android example学习一个基本示例。您也可以先阅读文档here

其他一些类似的有用问题:

Wait for current location - GPS - Android Dev

getting location instantly in android

希望这有帮助。

答案 2 :(得分:1)

最好使用getLastKnownLocation()方法。 这是代码示例:

将纬度和经度设为全局变量

double longitude;
double latitude;
protected void onCreate(Bundle savedBundle) {
       super.onCreate(savedBundle);
       setContentView(R.layout.activity_receipt_result);
       Objects.requireNonNull(getSupportActionBar()).setElevation(0);

       locationManager = (LocationManager) this.getSystemService(LOCATION_SERVICE);

       if (checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        // TODO: Consider calling
        //    Activity#requestPermissions
        // here to request the missing permissions, and then overriding
        //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
        //                                          int[] grantResults)
        // to handle the case where the user grants the permission. See the documentation
        // for Activity#requestPermissions for more details.
        ActivityCompat.requestPermissions(this,new String[] {Manifest.permission.ACCESS_FINE_LOCATION},1);
    }else{
        Location location = locationManager.getLastKnownLocation(locationManager.GPS_PROVIDER);
        latitude = location.getLatitude();
        longitude = location.getLongitude();
        Log.d("Location: ", "long-lat" + longitude + "-"+ latitude);
    }
}

在其余代码中可以使用经度和纬度变量之后。

答案 3 :(得分:0)

我遇到同样的问题,

通过使用Activity生命周期方法解决它。

1)onCreate(Bundle b)方法

中的GPS捕获功能

2)需要GPS定位的意图或功能,onStart()方法。

所以活动从onCreate(bundle)方法开始,将捕获GPS位置。这里 GPS海拔高度,纬度,经度值将分配给全局变量。

之后将执行onStart()方法,其中将调用GPS位置全局变量以执行必要的操作。

希望这有助于你