Android 我一直在安卓系统中得到一个不准确的位置
我的应用程序通过点击按钮记录gps位置;然而,当我这么做的时候,它说我大约在三个街区之外,这是非常不准确的。你能看看我的代码,看看我能如何改进它吗?谢谢Android 我一直在安卓系统中得到一个不准确的位置,android,gps,Android,Gps,我的应用程序通过点击按钮记录gps位置;然而,当我这么做的时候,它说我大约在三个街区之外,这是非常不准确的。你能看看我的代码,看看我能如何改进它吗?谢谢 @Override protected Void doInBackground(Void... arg0) { SharedPreferences prefs = getSharedPreferences("Settings", 0); final String id = pref
@Override
protected Void doInBackground(Void... arg0) {
SharedPreferences prefs = getSharedPreferences("Settings", 0);
final String id = prefs.getString("ID", "");
DefaultHttpClient httpclient = new DefaultHttpClient();
HttpPost httpost = new HttpPost(
"http://iphone-radar.com/gps/gps_locations");
JSONObject holder = new JSONObject();
try {
holder.put("id", id);
LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
Criteria criteria = new Criteria();
String bestProvider = locationManager.getBestProvider(criteria,
false);
LocationListener loc_listener=new LocationListener() {
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
// TODO Auto-generated method stub
}
@Override
public void onProviderEnabled(String provider) {
// TODO Auto-generated method stub
}
@Override
public void onProviderDisabled(String provider) {
// TODO Auto-generated method stub
}
@Override
public void onLocationChanged(Location location) {
// TODO Auto-generated method stub
}
};
try{
Looper.prepare();
locationManager.requestLocationUpdates(bestProvider, 0, 0, loc_listener);
}catch(Exception e){
e.printStackTrace();
}
Location location=locationManager.
getLastKnownLocation(bestProvider);
Calendar c = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("hh:mmaa dd'/'MM'/'yyyy");
holder.put("time", sdf.format(c.getTime()));
holder.put("time_since_epoch", System.currentTimeMillis());
try {
holder.put("lat", location.getLatitude());
holder.put("lon", location.getLongitude());
} catch (NullPointerException e) {
try {
holder.put("lat", -1.0);
holder.put("lon", -1.0);
} catch (JSONException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
StringEntity se = new StringEntity(holder.toString());
httpost.setEntity(se);
httpost.setHeader("Accept", "application/json");
httpost.setHeader("Content-type", "application/json");
ResponseHandler responseHandler = new BasicResponseHandler();
String response = httpclient.execute(httpost, responseHandler);
org.json.JSONObject obj;
obj = new org.json.JSONObject(response);
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
一个愚蠢的问题。您的GPS启用了吗?当您在同一位置时,您的设备是否在其他应用程序(如谷歌地图)中提供更好的精度 如果是,请使用精度更高的 标准.设定精度(标准.精度\u精细) 或使用 locationManager.getProvider(locationManager.GPS\U提供程序) 相反,强制设备使用GPS,从而获得米的精度。尝试以下操作:
criteria.setAccuracy(Criteria.ACCURACY_FINE);
是的,绝对有,试着给你的
标准的默认构造函数
状态(强调)
构造一个新的Criteria对象。新对象对精确度、功率或响应时间没有要求;不需要高度、速度或方位;不允许货币成本
这里有许多事情需要注意。首先,GPS可能由于许多原因而不准确。一个可能是恶劣的天气条件,另一个是足够数量的GPS卫星的能见度。手机本身的GPS接收器可能很差。最后,您的手机可能没有连接到足够的卫星以获得准确的定位
特别是在代码中,您使用的
getLastKnownLocation()
带有未指定的条件,如果我没有记错的话,它将使用任何提供程序。很可能使用的是网络提供商,而不是您的GPS提供商。与GPS信号建立高质量的连接可能需要相当长的时间,因此getLastKnownLocation只有在GPS实际运行的情况下静止一段时间才能工作(请在通知栏中查找卫星接收器图标)。你应该实施一个特定的GPS标准,然后实施onLocationChanged
,一旦确定了位置,你就可以做一些事情。这就成功了,我现在在街上,而不是在家里,但目前这是相当准确的。
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE);