2011-12-15 5 views
5

Я пытался создать приложение для Android, связанное с картой, но я понял, что onLocationChanged моего приложения не было вызвано, поэтому карта всегда остается в области по умолчанию (US).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): [email protected] DRAWING : sg.edu.tp/sg.edu.tp.SIP_TestMapActivity 

I/ViewRoot(5357): [email protected] is completed : sg.edu.tp/sg.edu.tp.SIP_TestMapActivity 

I/ViewRoot(5357): [email protected] DRAWING : Toast 

I/ViewRoot(5357): [email protected] 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> 
+0

как вы изменили местоположение ?? – freshDroid

+0

er ... я действительно не понимаю, что вы имеете в виду. но, поскольку я не в состоянии, когда я запускаю приложение, он не должен отображать карту состояний. – Jovi

+0

r u запускать его на эмуляторе – freshDroid

ответ

1

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

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

От API Документов.

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

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

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); 

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

+0

да, я тестирую его с помощью USB, подключенного к моему компьютеру. ничего не происходит, когда я изменился с 5 на 0.Я тестировал приложение с журналом, вставленным в метод onLocationChanged, и когда я запускаю приложение, журнал не появляется. поэтому я предполагаю, что он даже не вводит этот метод. – Jovi

+0

привет, ничего не происходит. Я обновил код и мой LogCat выше. пожалуйста помоги. thanks =) – Jovi

+0

попробуйте сделать некоторые записи в конце onResume и посмотреть, что содержит локатор, чтобы убедиться, что вы получаете что-то от поставщика местоположения. – mmeyer

0

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

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

Как для Вашего оригинального вопроса - requersting обновление местоположения исто только менеджеру Рекомендации для местоположения, чтобы отправить вам эти обновления после что-то изменения. Он не обязан делать так. Ваша система 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

+0

привет, не могли бы вы дать мне знать, как и где я должен положить код? Thks – Jovi

Смежные вопросы