全部。我正在编写一个关于 GPS 位置的 Android 应用程序。
我在模拟器上试了一下,手动输入经纬度,没问题。 但是,我的问题是:在真实设备上,在 Debug模式下,只有在更改位置时才能通过 Intent 进入下一个类。如果我直接启动应用程序,我可以看到闪烁的 GPS 图标,但应用程序只会停留在这里,不会启动下一个 Activity 。 onLocationChanged() 中的变量似乎永远不会改变。
我听说要立即获取位置是使用 getLastKnownLocation() 方法。但是我没有找到应该使用它的地方。
这是我如何使用 LocationManager 获取位置的类。
有解决办法吗?我很困惑。非常感谢!!
public class mainMenu extends Activity{
private LocationManager locationManager = null;
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button button1 = (Button)findViewById(R.id.button1);
button1.setOnClickListener(new OnClickListener(){
public void onClick(View v){
Intent i3 = new Intent();
i3.setClass(mainMenu.this, police.class);
i3.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
mainMenu.this.startActivityForResult(i3,0);
}
});
Button button2 = (Button)findViewById(R.id.button2);
button2.setOnClickListener(new OnClickListener(){
public void onClick(View v){
Intent i3 = new Intent();
i3.setClass(mainMenu.this, ambulance.class);
i3.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
mainMenu.this.startActivityForResult(i3,0);
}
});
Button button3 = (Button)findViewById(R.id.button3);
button3.setOnClickListener(new OnClickListener(){
public void onClick(View v){
Intent i3 = new Intent();
i3.setClass(mainMenu.this, fire_station.class);
i3.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
mainMenu.this.startActivityForResult(i3,0);
}
});
locationManager = (LocationManager)mainMenu.this.getSystemService(Context.LOCATION_SERVICE);
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 120000 , 0, new MyLocationUpdater());
String provider = LocationManager.GPS_PROVIDER;
Location location = locationManager.getLastKnownLocation(provider);
}
public class MyLocationUpdater implements LocationListener{ //change location interface
@Override
public void onLocationChanged(Location location) {
// TODO Auto-generated method stub
// store the location data
// get the best record
Double lat = location.getLatitude();
Double lon = location.getLongitude();
System.out.println("The latitude is " + lat + "and "
+ "the longitude is "+ lon);
Double lat11 = lat - 1/69.0;
Double lat12 = lat + 1/69.0;
Double lon11 = lon - 1/42.0;
Double lon12 = lon + 1/42.0;
StaticVariables.latS1 = lat11.toString();
StaticVariables.latN1 = lat12.toString();
StaticVariables.lonW1 = lon11.toString();
StaticVariables.lonE1 = lon12.toString();
Double lat111 = lat - 2/69.0;
Double lat121 = lat + 2/69.0;
Double lon111 = lon - 2/42.0;
Double lon121 = lon + 2/42.0;
StaticVariables.latS11 = lat111.toString();
StaticVariables.latN11 = lat121.toString();
StaticVariables.lonW11 = lon111.toString();
StaticVariables.lonE11 = lon121.toString();
// ==================================================
// ambulances
Double lat21 = lat - 3/69.0;
Double lat22 = lat + 3/69.0;
Double lon21 = lon - 3/42.0;
Double lon22 = lon + 3/42.0;
StaticVariables.latS2 = lat21.toString();
StaticVariables.latN2 = lat22.toString();
StaticVariables.lonW2 = lon21.toString();
StaticVariables.lonE2 = lon22.toString();
Double lat211 = lat - 5.5/69.0;
Double lat221 = lat + 5.5/69.0;
Double lon211 = lon - 5.5/42.0;
Double lon221 = lon + 5.5/42.0;
StaticVariables.latS21 = lat211.toString();
StaticVariables.latN21 = lat221.toString();
StaticVariables.lonW21 = lon211.toString();
StaticVariables.lonE21 = lon221.toString();
// ===================================================
// fire stations
Double lat31 = lat - 2/69.0;
Double lat32 = lat + 2/69.0;
Double lon31 = lon - 2/42.0;
Double lon32 = lon + 2/42.0;
StaticVariables.latS3 = lat31.toString();
StaticVariables.latN3 = lat32.toString();
StaticVariables.lonW3 = lon31.toString();
StaticVariables.lonE3 = lon32.toString();
Double lat311 = lat - 2/69.0;
Double lat321 = lat + 2/69.0;
Double lon311 = lon - 2/42.0;
Double lon321 = lon + 2/42.0;
StaticVariables.latS31 = lat311.toString();
StaticVariables.latN31 = lat321.toString();
StaticVariables.lonW31 = lon311.toString();
StaticVariables.lonE31 = lon321.toString();
Intent intent = new Intent();
intent.setClass(mainMenu.this, getPhoneNumber.class);
mainMenu.this.startActivity(intent);
}
@Override
public void onProviderDisabled(String arg0) {
// TODO Auto-generated method stub
}
@Override
public void onProviderEnabled(String arg0) {
// TODO Auto-generated method stub
}
@Override
public void onStatusChanged(String arg0, int arg1, Bundle arg2) {
// TODO Auto-generated method stub
}
}
}
最佳答案
getLastKnownLocation
方法不会触发 onLocationChanged
事件。重构代码的一种方法是将作用于 Location
的逻辑移动到一个单独的方法,然后在调用 getLastKnownLocation
之后调用该方法,并从 onLocationChanged
方法。
请记住,不能保证 getLastKnownLocation
会提供有意义的 Location
,因为您的设备可能在上次位置更新后已经移动。
示例代码:
public void onCreate(Bundle savedInstanceState){
....
String provider = LocationManager.GPS_PROVIDER;
Location location = locationManager.getLastKnownLocation(provider);
updateLocation(location);
}
public class MyLocationUpdater implements LocationListener{ //change location interface
@Override
public void onLocationChanged(Location location) {
updateLocation(location);
}
...
}
void updateLocation(Location location) {
Double lat = location.getLatitude();
Double lon = location.getLongitude();
// the rest of the code from onLocationChanged
}
关于android - 通过 Android 应用程序即时获取 GPS 位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6068614/