OnLocationChanged не был вызван

Я пытаюсь создать приложение для Android, связанное с картой, но я понял, что onLocationChanged моего приложения не было вызвано, поэтому карта всегда остается в области по умолчанию (США).

Мой код:

public class MapMainActivity extends MapActivity implements OnClickListener, LocationListener { MapView mapView; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.map_main); //reference mapView = (MapView)findViewById(R.id.map_view); mapView.setBuiltInZoomControls(true); this.findViewById(R.id.btn_satellite).setOnClickListener(this); this.findViewById(R.id.btn_street).setOnClickListener(this); }//onCreate @Override protected void onResume() { super.onResume(); Toast.makeText(this, "GPS tracking started", Toast.LENGTH_SHORT).show(); // Start location updates; 5s/5m LocationManager locManager = (LocationManager)getSystemService( Context.LOCATION_SERVICE); locManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5000, 0, this); Criteria crit = new Criteria(); crit.setAccuracy(Criteria.ACCURACY_FINE); String provider = locManager.getBestProvider(crit, true); Location loc = locManager.getLastKnownLocation(provider); }//onResume @Override protected void onPause() { super.onPause(); Toast.makeText(this, "GPS tracking stopped", Toast.LENGTH_SHORT).show(); LocationManager locManager = (LocationManager)getSystemService( Context.LOCATION_SERVICE); locManager.removeUpdates(this); }//onPause @Override public void onClick(View v) { // TODO Auto-generated method stub if(v == findViewById(R.id.btn_street)) { mapView.setSatellite(false); }//street view else if (v == findViewById(R.id.btn_satellite)) { mapView.setSatellite(true); } }//onClick @Override protected boolean isRouteDisplayed() { // TODO Auto-generated method stub return false; }//isRouteDisplayed @Override public void onLocationChanged(Location location) { // TODO Auto-generated method stub double lat = location.getLatitude(); double lon = location.getLongitude(); TextView txtLat = (TextView)findViewById(R.id.txt_lat); txtLat.setText(String.format("%.6f", lat)); TextView txtLon = (TextView)findViewById(R.id.txt_lon); txtLon.setText(String.format("%.6f", lon)); MapView map = (MapView)findViewById(R.id.map_view); map.getController().animateTo(new GeoPoint((int)(lat*1E6),//1000000), (int)(lon*1E6))); }//onLocationChanged @Override public void onProviderDisabled(String provider) { // TODO Auto-generated method stub Toast.makeText(this, "GPS disabled", Toast.LENGTH_SHORT).show(); }//onProviderDisabled @Override public void onProviderEnabled(String provider) { // TODO Auto-generated method stub Toast.makeText(this, "GPS enabled", Toast.LENGTH_SHORT).show(); }//onProviderEnabled @Override public void onStatusChanged(String provider, int status, Bundle extras) { // TODO Auto-generated method stub }//onStatusChanged }//class 

Весь мой журнал, когда я запускаю приложение через мое устройство (16/12/2011)

 D/InputTransport(5357): Input channel constructed: name='40baf680 Toast (client)', ashmemFd=54, receivePipeFd=57, sendPipeFd=58 I/MapActivity(5357): Handling network change notification:CONNECTED E/MapActivity(5357): Couldn't get connection factory client I/ViewRoot(5357): !@FINISH DRAWING : sg.edu.tp/sg.edu.tp.SIP_TestMapActivity I/ViewRoot(5357): !@finishDrawing is completed : sg.edu.tp/sg.edu.tp.SIP_TestMapActivity I/ViewRoot(5357): !@FINISH DRAWING : Toast I/ViewRoot(5357): !@finishDrawing is completed : Toast D/InputTransport(5357): Input channel destroyed: name='40baf680 Toast (client)', ashmemFd=54, receivePipeFd=57, sendPipeFd=58 

Манифест:

 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="sg.edu.tp" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="10" /> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" > <activity android:label="@string/app_name" android:name=".SIP_MLT_TestActivity" > <intent-filter > <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <uses-library android:name="com.google.android.maps" /> <activity android:name=".SIP_TestMapActivity"></activity> <activity android:name=".SIP_TestDraw1Activity"></activity> <activity android:name=".SIP_TestDraw2Activity"></activity> </application> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> </manifest> 

Испытываете ли вы это, двигаясь или сидите, привязавшись к вашей машине с USB и наблюдая за логарифмом?

Если вы сидите в dev машине, я подозреваю, что вы не можете переместить 5 метров, необходимых для запуска события изменения местоположения, как вы просили в своем обращении к запросуLocationUpdates

Из документов API :.

Если minDistance больше 0, местоположение будет передаваться только в том случае, если устройство перемещается с помощью счетчиков minDistance.

Попробуйте уменьшить параметр min distance в этом вызове до нуля и посмотреть, что произойдет.

 locManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,5000, 0, this); 

Вы, вероятно, не хотите оставлять это на ноль для чего-либо другого, кроме тестирования.

Если это не поможет вам попытаться понять, что ваш GPS работает вообще, делая что-то подобное в вашем onResume, после того, как вы попросите locationUpdates:

 Criteria crit = new Criteria(); crit.setAccuracy(Criteria.ACCURACY_FINE); String provider = lm.getBestProvider(crit, true); Location loc = lm.getLastKnownLocation(provider); 

И посмотрите, получаете ли вы хорошую информацию о местоположении.

Расположение stuiff сложно. С одной стороны, вам нужно последнее место быстро, с лучшей точностью на другой стороне, которую вы не любите быстро разряжать аккумулятор. Существуют также различия между уровнями API. Подробное описание см. В этом руководстве:

http://android-developers.blogspot.com/2011/06/deep-dive-into-location.html

Что касается вашего первоначального вопроса – запросы на обновление местоположения – это просто рекомендация менеджеру местоположений, чтобы отправить вам эти обновления после каких-либо изменений. Это не обязательно. Ваша система GPS может быть недостаточно хорошей (и, конечно же, нет), чтобы обнаруживать изменения местоположения снула, когда они привязаны к USB-кабелю. В целях тестирования вы можете создать макет поставщика и управлять им с помощью приложения outher.

http://developer.android.com/reference/android/location/LocationManager.html#addTestProvider%28java.lang.String,%20boolean,%20boolean,%20boolean,%20boolean,%20boolean,%20boolean,%20boolean,% 20int,% 20int% 29