マップ アクティビティが呼び出されると、onCreate で addUserMapPoint を呼び出します。この関数には、myOverlay.getMyLocation を使用して位置情報を取得しようとする 2 つのインスタンスが含まれています。このアクティビティの最初のロードで、最初の試行の結果は null GeoPoint を返し、メイン UI スレッドが完了すると、myOverlay.runOnFirstFix(new Runnable()… のリスナー スレッドにある 2 番目の試行が 1 秒後に呼び出され、含まれています緯度と経度を含むジオポイント. このリスナー関数内の呼び出しは、マップにドットを配置するように見え、行 mapController.animateTo(gp) はマップを自分の場所に移動します. 私のアプリには更新ボタンがあります.クリックすると、このアクティビティが再び開始されます。別のサービスから位置データを取得するには、緯度と経度が必要です。更新後、
myOverlay.getMyLocation へのこの最初の呼び出しで GeoPoint を取得できない場合、myOverlay.runOnFirstFix(new Runnable()… スレッドで見つかった 2 番目の呼び出しから緯度と経度の値を渡すにはどうすればよいでしょうか。ヘルパー Bean クラスである MyApp に lat と lon を追加しようとしましたが、このクラスの lat と lon は、更新後でも null です。最初のアクティビティで addUserMapPoint 関数で lat と lon を手動で設定すると、これらの値は保持されます.これは、メイン UI スレッドで設定されているためだと思います.
public class MapActivity extends com.google.android.maps.MapActivity {
private MapView mapView = null;
private MapController mapController = null;
private MyLocationOverlay myOverlay = null;
public static MyApp app;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_map);
app = (MyApp) getApplicationContext();
mapView = (MapView) findViewById(R.id.mapview);
mapView.setBuiltInZoomControls(true);
mapController = mapView.getController();
List<Overlay> mapOverlays = mapView.getOverlays();
mapOverlays.clear();
addUserMapPoint(mapView);
if (!app.isLocServOff()) {
//map other points – service call to get items from our service near lat and lon
addOtherMapPoints(mapOverlays);
} else {
Toast.makeText(app.getApplicationContext(),"Current location could not be found.",Toast.LENGTH_LONG).show();
}
}
private void addUserMapPoint(MapView mapView){
myOverlay = new MyLocationOverlay(app.getApplicationContext(), mapView);
myOverlay.disableCompass();
myOverlay.enableMyLocation();
if(app.getMyLat()==null||app.getMyLon()==null){
GeoPoint gp = myOverlay.getMyLocation();
if(gp!=null){
app.setMyLat(Helper.latLon1E6Calc(gp.getLatitudeE6()));
app.setMyLon(Helper.latLon1E6Calc(gp.getLongitudeE6()));
app.setLocServOff(false);
}else{
app.setLocServOff(true);
}
}
myOverlay.runOnFirstFix(new Runnable() {
public void run() {
GeoPoint gp = myOverlay.getMyLocation();
if(gp!=null){
app.setMyLat(Helper.latLon1E6Calc(gp.getLatitudeE6()));
app.setMyLon(Helper.latLon1E6Calc(gp.getLongitudeE6()));
app.setLocServOff(false);
mapController.animateTo(gp);
}else{
app.setLocServOff(true);
}
}
});
mapView.getOverlays().add(myOverlay);
}
}
次の質問について、あなたの助けが求められています。メイン UI スレッドで緯度と経度を含む GeoPoint を取得するにはどうすればよいですか、または myOverlay.runOnFirstFix(new Runnable()… スレッドから取得できる GeoPoint からこれらの値を渡すにはどうすればよいですか?
Handler または runOnUiThread の使用を提案する場合は、緯度と経度をメイン UI スレッド/マップ ビューで使用できるものに戻すコード例を提供してください。次のコードのような、望ましい結果が得られないことを試しました。トースト メッセージを表示することはできましたが、使用できる方法で渡された緯度と経度を取得できませんでした。
final Handler handler = new Handler();
myOverlay.runOnFirstFix(new Runnable() {
@Override public void run() {
handler.post(new Runnable() {
@Override public void run() {
GeoPoint gp = myOverlay.getMyLocation();
if(gp!=null){
app.setMyLat(Helper.latLon1E6Calc(gp.getLatitudeE6()));
app.setMyLon(Helper.latLon1E6Calc(gp.getLongitudeE6()));
app.setLocServOff(false);
mapController.animateTo(gp);
}else{
app.setLocServOff(true);
}
//Toast.makeText(getApplicationContext(),"wowoowowowoowoowowow",Toast.LENGTH_LONG).show();
}
});
}
});
また、次のようなコードを使用して緯度と経度を取得しましたが、機能しますが、現在の場所は、返されたものとは異なる緯度と経度になることがあるため、たとえば gps 信号を取得できませんでしたが、古い値が返されました。緯度/経度データが 2 分より古いかどうかを確認するチェックを追加しましたが、最新の緯度と経度を myOverlay.getMyLocation によって返されたものと一致させることができませんでした。
LocationManager locMgr = (LocationManager)appcontext.getSystemService(Context.LOCATION_SERVICE);
MyLocationListener locLstnr = new MyLocationListener();
//fetch current location for current location
locMgr.requestSingleUpdate(LocationManager.GPS_PROVIDER, locLstnr, appcontext.getMainLooper());