【问题标题】:Getting current location from GPS从 GPS 获取当前位置
【发布时间】:2013-03-26 01:50:07
【问题描述】:

使用Criteria.ACCURACY_COARSE 我得到了位置,但它不准确。我想使用 GPS Criteria.ACCURACY_FINE,但没有调用 onLocationChanged(Location location) 方法。
我做了一些研究,但不知道为什么。
StackOverflow 上有很多类似的问题,但不幸的是我找不到能解决我的问题的问题。
以下是我的源代码:

private void locationInformationSettings(){
    Criteria criteria= new  Criteria();;
    criteria.setAccuracy(Criteria.ACCURACY_FINE); //using Criteria.ACCURACY_COARSE works
    //criteria.setPowerRequirement(Criteria.POWER_LOW);

    locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    String providername = locationManager.getBestProvider(criteria, true);

    myLocationListener = new MyLocationListener();

    locationManager.requestLocationUpdates(
            providername, //LocationManager.GPS_PROVIDER, 
            Utils.MINIMUM_TIME_BETWEEN_UPDATES, 
            Utils.MINIMUM_DISTANCE_CHANGE_FOR_UPDATES,
            myLocationListener
    );      
}

private class MyLocationListener implements LocationListener {

    public void onLocationChanged(Location location) {

        locLongitude = location.getLongitude();
        locLatitude = location.getLatitude();
        String message = String.format(
                "New Location \n Longitude: %1$s \n Latitude: %2$s",
                locLongitude, locLatitude);
        Toast.makeText(RecordActivity.this, message, Toast.LENGTH_LONG).show();
        Log.e(TAG, "Location information received:(" + locLongitude + "," + locLatitude +")");
        locationManager.removeUpdates(myLocationListener);
    }

    public void onStatusChanged(String s, int i, Bundle b) {
        Toast.makeText(RecordActivity.this, "Provider status changed",
                Toast.LENGTH_LONG).show();
    }

    public void onProviderDisabled(String s) {
        Toast.makeText(RecordActivity.this,
                "Provider disabled by the user. GPS turned off",
                Toast.LENGTH_LONG).show();
    }

    public void onProviderEnabled(String s) {
        Toast.makeText(RecordActivity.this,
                "Provider enabled by the user. GPS turned on",
                Toast.LENGTH_LONG).show();
    }

}

清单文件权限:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

为什么使用网络提供商有效而 GPS 提供商无效?
我已经在我的设备设置中检查了 GPS 服务,并在 Android 4.3 和 Android 2.3.3 上进行了测试。
提前致谢

【问题讨论】:

  • 而不是标准,为什么不直接使用 LocationManager.GPS_PROVIDER 请求位置更新,然后先看看它是否有效。
  • @HoanNguyen 正如您在评论中注意到的那样,我已经尝试过了,但它不起作用。
  • 获取 GPS 位置不是立即的。您应该会在顶部托盘上看到试图修复的 GPS 图标..
  • @denis.solonenko 感谢您的提示。会尽量耐心等待结果。
  • @LazyNinja 不要试图在建筑物内获取 GPS 定位,到外面去 :)

标签: android android-location


【解决方案1】:

给你

package com.test.locationmanager;

import android.app.Activity;
import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.location.LocationProvider;
import android.os.Bundle;
import android.widget.TextView;

public class LocationManagerStatus extends Activity {

private LocationManager locationManager;
private TextView textView;
private final LocationListener gpsLocationListener = new LocationListener() {

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
        final String tvTxt = textView.getText().toString();
        switch (status) {
        case LocationProvider.AVAILABLE:
            textView.setText(tvTxt + "GPS available again\n");
            break;
        case LocationProvider.OUT_OF_SERVICE:
            textView.setText(tvTxt + "GPS out of service\n");
            break;
        case LocationProvider.TEMPORARILY_UNAVAILABLE:
            textView.setText(tvTxt + "GPS temporarily unavailable\n");
            break;
        }
    }

    @Override
    public void onProviderEnabled(String provider) {
        textView.setText(textView.getText().toString()
                + "GPS Provider Enabled\n");
    }

    @Override
    public void onProviderDisabled(String provider) {
        textView.setText(textView.getText().toString()
                + "GPS Provider Disabled\n");
    }

    @Override
    public void onLocationChanged(Location location) {
        locationManager.removeUpdates(networkLocationListener);
        textView.setText(textView.getText().toString()
                + "New GPS location: "
                + String.format("%9.6f", location.getLatitude()) + ", "
                + String.format("%9.6f", location.getLongitude()) + "\n");
    }
};
private final LocationListener networkLocationListener = new LocationListener() {

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
        final String tvTxt = textView.getText().toString();
        switch (status) {
        case LocationProvider.AVAILABLE:
            textView.setText(tvTxt + "Network location available again\n");
            break;
        case LocationProvider.OUT_OF_SERVICE:
            textView.setText(tvTxt + "Network location out of service\n");
            break;
        case LocationProvider.TEMPORARILY_UNAVAILABLE:
            textView.setText(tvTxt
                    + "Network location temporarily unavailable\n");
            break;
        }
    }

    @Override
    public void onProviderEnabled(String provider) {
        textView.setText(textView.getText().toString()
                + "Network Provider Enabled\n");
    }

    @Override
    public void onProviderDisabled(String provider) {
        textView.setText(textView.getText().toString()
                + "Network Provider Disabled\n");
    }

    @Override
    public void onLocationChanged(Location location) {
        textView.setText(textView.getText().toString()
                + "New network location: "
                + String.format("%9.6f", location.getLatitude()) + ", "
                + String.format("%9.6f", location.getLongitude()) + "\n");
    }
};

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    textView = (TextView) findViewById(R.id.textview);
    locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
}

@Override
protected void onResume() {
    super.onResume();
    locationManager.requestLocationUpdates(
            LocationManager.NETWORK_PROVIDER, 5000, 0,
            networkLocationListener);
    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
            3000, 0, gpsLocationListener);
}

@Override
protected void onPause() {
    super.onPause();
    locationManager.removeUpdates(networkLocationListener);
    locationManager.removeUpdates(gpsLocationListener);
}
}

【讨论】:

    【解决方案2】:

    新的 Google Maps API 引入了 OnMyLocationChangeListener。
    您不需要实现 LocationListener。检查这个答案:https://stackoverflow.com/a/16240460/1769013

    【讨论】:

      【解决方案3】:

      在近 2 个月没有回应之后,我决定采用以下方法。
      希望它可以帮助其他人节省一些时间。

      public class GpsLocationService extends Service implements LocationListener{
      
          private final String TAG = getClass().getSimpleName();
      
          private LocationManager locationManager;
          private String provider;
      
          @Override
          public void onCreate() {
              super.onCreate();
              Log.i(TAG, "onCreate()");
              // Get the location manager
              locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
              // Define the criteria how to select the locatioin provider -> use
              // default
              Criteria criteria = new Criteria();
              provider = locationManager.getBestProvider(criteria, false);
              Location location = locationManager.getLastKnownLocation(provider);
      
              // Initialize the location fields
              if (location != null) {
                  Log.d(TAG, "Provider " + provider + " has been selected.");
                  onLocationChanged(location);
              } 
              else {
                  Log.d(TAG, "Location not available!");
              }
      
          }
      
          @Override
          public int onStartCommand(Intent intent, int flags, int startId) {
              Log.i(TAG, "GpsLocationService has started!");
      
      
              locationManager.requestLocationUpdates(provider, 400, 1, this);
      
              return START_STICKY;
          }
      
          @Override
          public void onDestroy() {
              Log.i(TAG, "GpsLocationService is destroyed!");
              super.onDestroy();
              locationManager.removeUpdates(this);
          }
      
          @Override
          public IBinder onBind(Intent arg0) {
              // TODO Auto-generated method stub
              return null;
          }
      
      
      
          @Override
          public void onLocationChanged(Location location) {
              double lat = location.getLatitude();
              double lng =  location.getLongitude();
              Log.i( TAG, "onLocationChanged() lat = " + lat + " long = " + lng);     
          }
      
          @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
      
          }
      
      }
      

      并且在您的清单文件中不要忘记添加以下权限:

      <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
      <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
          <uses-permission android:name="android.permission.INTERNET" /> 
      

      同时提及您的服务:

      <service android:name=".GpsLocationService"></service>
      

      【讨论】:

        猜你喜欢
        • 2011-02-11
        • 2016-07-30
        • 2016-12-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多