4

ここに投稿する前に、GPS の問題について調査を試みました。コードをテストすると、同じ出力が何度も繰り返されます。メソッドgpsStart()はタイマーで呼び出されます。マニフェストに細かい場所のアクセス許可と粗い場所のアクセス許可が追加されました。このメソッドappendLog()は、出力をファイルに保存します。

public void gpsStart() {
        // Acquire a reference to the system Location Manager
        LocationManager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
        // Define a listener that responds to location updates
        LocationListener locationListener = new LocationListener() {
            public void onLocationChanged(Location location) {
                // Toast.makeText(getApplicationContext(), "location changed",
                // Toast.LENGTH_SHORT).show();
                // Called when a new location is found by the network location
                // provider.
                appendLog("Lat: " + location.getLatitude() + "\nLng: "
                        + location.getLongitude()+"\n");
                text3.setText("Lat: " + location.getLatitude() + "\nLng: "
                        + location.getLongitude());
            }

        public void onStatusChanged(String provider, int status,
                Bundle extras) {
        }

        public void onProviderEnabled(String provider) {
        }

        public void onProviderDisabled(String provider) {
        }
    };

    // Register the listener with the Location Manager to receive location
    // updates
    locationManager.requestLocationUpdates(
            LocationManager.GPS_PROVIDER, 0, 0, locationListener);
    locationManager.requestLocationUpdates(
            LocationManager.NETWORK_PROVIDER, 0, 0, locationListener);
}
4

3 に答える 3

3

gpsStart()タイマーでメソッドを呼び出してはなりません。Location Listener の仕組みについて説明します

ロケーションリスナーとは?

Location Listener は、現在地が変更されたときに通知するクラスです。位置の更新を受信するには、LocationManager クラスを使用して LocationListener クラスを登録する必要があります。

Location Listener を登録するタイミング

アプリケーションの要件によって異なります。たとえば、マップ上の現在の位置を表示するロケーション リスナーが必要な場合は、ロケーション リスナーをアクティビティのonCreate()またはメソッドに登録し、またはメソッドonResume()でレシーバーを登録解除する必要があります。アプリケーションが実行されていなくても位置情報を受け取りたい場合は、サービスを使用して位置情報を受け取ることができます。onPause()onStop()

ロケーションリスナーを登録/登録解除する方法は?

LocationListener を登録するには、最初に次のようなコンテキストを使用して取得できる LocationManager クラスのインスタンスが必要です。

LocationManager locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);

その後、ロケーションプロバイダーを設定する必要があります。よく使用されるプロバイダには 2 種類あります。

  1. GPS プロバイダー
  2. ネットワーク プロバイダー

ここで、ロケーション レシーバーをこのロケーション プロバイダーに登録するためにrequestLocationUpdates、LocationManager のメソッドがあります。このメソッドの最初の引数はプロバイダー名で、2 番目の引数はリクエストの場所の更新にかかる最小時間です。3 番目の引数は、場所の変更を要求する最小距離です。最後の引数は、locationListener 用です。メソッドの使い方はこちら

locationManager.requestLocationUpdates(
                LocationManager.GPS_PROVIDER, minTime, minDistance, locationListener);
locationManager.requestLocationUpdates(
                LocationManager.NETWORK_PROVIDER, minTime, minDistance, locationListener);

位置情報の更新を登録解除するには、以下の方法を使用できます

locationManager.removeUpdates(locationListener)

注:質問で述べたように、タイマーでメソッドを呼び出しているgpsStartため、このメソッドが呼び出されるたびにロケーションリスナーが追加されます。したがって、すべてのリスナーが新しいロケーションをトリガーしているため、おそらく同じロケーションを複数回取得しています。代わりに、アクティビティの開始時にこのメソッドを 1 回呼び出し、アクティビティの終了時にこの locationListener の登録を解除する必要があります。

あなたが得ていることを願っています。:D

楽しみ!!!

于 2012-08-30T04:51:33.910 に答える
1

2 つのリスナーを作成することをお勧めします。1 つは Gps 用、もう 1 つはネットワーク用です。

以下はコードサンプルです

public class MyLocationListener extends LocationListener  
{
            public void onLocationChanged(Location location) 
           {
                // Toast.makeText(getApplicationContext(), "location changed",
                // Toast.LENGTH_SHORT).show();
                // Called when a new location is found by the network location
                // provider.
                appendLog("Lat: " + location.getLatitude() + "\nLng: "
                        + location.getLongitude()+"\n");
                text3.setText("Lat: " + location.getLatitude() + "\nLng: "
                        + location.getLongitude());
            }

        public void onStatusChanged(String provider, int status,
                Bundle extras) {
        }

        public void onProviderEnabled(String provider) {
        }

        public void onProviderDisabled(String provider) {
        }
    }

MyLocationListener gpsListener=new MyLocationListener();
MyLocationListener networkListener=new MyLocationListener();

locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, gpslocationListener);    locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, networklocationListener);
于 2012-08-30T03:47:11.413 に答える
0

ご回答ありがとうございます。ダーメンドラあなたは正しいです、私はLocationListenersを閉じる必要がありました、しかし私の質問への答えははるかに簡単でした。最小時間(リスナーが回答を得るのを待つ時間)をゼロより大きい値に変更する必要がありました。変更する必要のある値は、下に太字で示されています(MINTIME)。

locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, MINTIME, 0, gpslocationListener);        locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, MINTIME, 0, networklocationListener);
于 2012-11-18T20:36:50.273 に答える