1

Google マップ API とその使用法などについていくつか質問があります。これまでに行ったことの簡単な背景として、OnMyLocationChangeListener と LocationListener を実装しながら FragmentActivity を拡張するマップを示しました。次に、LocationManager を設定し、そこから自分の位置を取得しました。マップは正常に動作します。私の位置も地図上に青いマーカーで表示され、すべてが設定されているように見えます...

  1. 問題は、GPRS/EDGE を使用してアプリを実行すると、自分の位置が更新されないことです。つまり、更新されますが、非常に長い時間 (2 または 3 分) が経過した後でも、マーカーが数百メートルずれており、正確な位置が表示されません。なぜこの問題が発生するのですか? GPRS/EDGE に問題がありますか? 3G で「高速に動作」/「正しい位置を表示」しますか?

  2. 2 つ目の問題は、OnLocationChanged(Location location) 関数が呼び出されないことです。onMyLocationChange(Location location) は毎回呼び出されます。これは正しい動作ですか?または、OnLocationChanged(場所の場所) 関数を onMyLocationChange(場所の場所) 関数と同じくらい頻繁に呼び出す必要がありますか?

  3. 対処すべき 3 つ目の最も重要な問題は、マップ上にいくつかのマーカーを配置したため、自分の位置から各マーカーまでの距離を計算する必要があることです。移動すると、私とすべてのマーカーの間の距離が変化します。距離を計算し、それらを onMyLocationChange(Location location) 関数の配列に保存するためのループを実装しましたが、何度も何度も呼び出されるため、ループはまったく実行されません。5秒後にこれらの関数を簡単に呼び出すことができる代替手段はありますか?そのため、5秒以内にforループが適切かつ完全に実行され、距離配列が入力されます.

        FragmentManager myFragmentManager = getSupportFragmentManager();
    SupportMapFragment mySupportMapFragment 
    = (SupportMapFragment)myFragmentManager.findFragmentById(R.id.map);
    myMap = mySupportMapFragment.getMap();
    
    locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
    
    if(locationManager != null){
        locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 
                0, 0, this);
        Location location = locationManager.
                getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
    
        myPosition = new LatLng(location.getLatitude(), location.getLongitude());
    } 
    else {
        Toast toast = Toast.makeText(this, "Location manager is null", Toast.LENGTH_LONG);
        toast.show();
    }
    
    myMap.setMyLocationEnabled(true);
    myMap.setOnMyLocationChangeListener(this);
    myMap.animateCamera(CameraUpdateFactory.newLatLngZoom(myPosition, 16));
    
     public void onMyLocationChange(Location location) {
    
    myPosition = new LatLng(location.getLatitude(), location.getLongitude());
    
    Toast toast = Toast.makeText(this, "This one is always called", Toast.LENGTH_LONG);
    toast.show();
       }
    
        @Override
     public void onLocationChanged(Location location) {
    
    myPosition = new LatLng(location.getLatitude(), location.getLongitude());
    
    Toast toast = Toast.makeText(this, "This one never gets called", Toast.LENGTH_LONG);
    toast.show();
      }
    
4

1 に答える 1

0

コード行を投稿していないため、正確な画像を取得することは困難ですが、質問はありません。3.:

場所の変更時に通知を受け取る頻度を設定できます。確かに同様のコード行があり、メソッド呼び出しの 2 番目と 3 番目のパラメーターを 0 以外に設定します。これにより、必要な計算を実行する時間が得られます。 .

locationManager.requestLocationUpdates(locationProvider, minInterval, minDistance, locationListener);

Android デベロッパー サイトには、位置認識アプリを開発する際に読む価値のある記事があります。

于 2013-11-15T08:54:46.500 に答える