4

gps プロバイダーを使用してデバイスの現在の位置を取得したいのですが、これは実際には gps の位置が変更されるのを待ちます。

そのため、場所の変更をリッスンする簡単なアプリケーションがあります。これはNETWORK_PROVIDERすぐに機能しますが、GPS_PROVIDER15 分間待っても何も起こりませんでした。

APIレベル8を使用しています。

public class MainActivity extends Activity {
    TextView tv;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv = (TextView) this.findViewById(R.id.textView1);
        LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        LocationListener ll = new mylocationlistener();

        //lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, ll); // this works fine
        lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, ll);
    }

    private class mylocationlistener implements LocationListener {
        public void onLocationChanged(Location location) {
            Date today = new Date();
            Timestamp currentTimeStamp = new Timestamp(today.getTime());
            if (location != null) {
                Log.d("LOCATION CHANGED", location.getLatitude() + "");
                Log.d("LOCATION CHANGED", location.getLongitude() + "");
                String str = "\n CurrentLocation: " + "\n Latitude: "
                        + location.getLatitude() + "\n Longitude: "
                        + location.getLongitude() + "\n Accuracy: "
                        + location.getAccuracy() + "\n CurrentTimeStamp "
                        + currentTimeStamp + "\n Altitude: "
                        + location.getAltitude() + "\n Bearing"
                        + location.getBearing() + "\n Speed"
                        + location.getSpeed() + "\n ";
                Toast.makeText(MainActivity.this, str, Toast.LENGTH_LONG)
                        .show();
                tv.append(str);
            }
        }

        public void onProviderDisabled(String provider) {
            Toast.makeText(MainActivity.this, "Error onProviderDisabled",
                    Toast.LENGTH_LONG).show();
        }

        public void onProviderEnabled(String provider) {
            Toast.makeText(MainActivity.this, "onProviderEnabled",
                    Toast.LENGTH_LONG).show();
        }

        public void onStatusChanged(String provider, int status, Bundle extras) {
            Toast.makeText(MainActivity.this, "onStatusChanged",
                    Toast.LENGTH_LONG).show();
        }
    }
}

マニフェストに許可を入れたので、これは問題ではありません。

4

2 に答える 2

2

内部でテストしていますか?あなたが外にいない限り、GPS ロックをまったく取得できない可能性があります。これは、電話ができるだけ頻繁にロックを取得しようとすることを意味します (requestLocationUpdates 呼び出しで最小時間と距離に 0 と 0 を指定したため)。 )。

残念ながら、デバイスが GPS ロックを取得するのを待つ必要があります。信号がないためにロックされない場合は、そのまま待ち続けることになります。これを軽減するために最初にできることは、GPS プロバイダーの最新の既知の場所を取得することです。デバイスが最近 GPS ロックを取得し、場所を保存した場合、これは場所を返します。

Location lastLocation = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);

それ以外の場合は、ネットワーク プロバイダーから場所を取得するようにしてください。これは、既に観察したように、GPS よりもはるかに迅速に場所を返す可能性が高いためです。これは、ワイヤレス信号がある限り、屋内を含むあらゆる場所で利用できるロケーション データのソース (セル タワーと WIFI) が豊富にあるためです。

于 2012-12-10T16:29:17.613 に答える