使用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上进行了测试。
提前致谢
答案 0 :(得分:2)
你去吧
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);
}
}
答案 1 :(得分:1)
新的Google Maps API引入了OnMyLocationChangeListener 您不需要实现LocationListener。请检查此答案:https://stackoverflow.com/a/16240460/1769013
答案 2 :(得分:0)
经过将近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>