14

アプリでGPS時間を表示する方法を探しています。これを行う最も簡単な方法は何ですか?

(gps時間と内部システム時間のわずかな時間差のため、GPS時間である必要があります)

ありがとう

4

3 に答える 3

29

GPS時間を取得することはかなり混乱する可能性があります!受け入れられた回答で議論を拡張するために、onLocationChanged()コールバックのgetTime()は、場所(必ずしもGPSである必要はありません)情報の取得方法に応じて異なる回答を提供します(Nexus 5テストに基づく)。

(a)Google FusedLocationProviderApi (Google Location Services API)を使用している場合、getProvider()は「fused」を返し、getTime()はデバイスの時刻を返します(System.currentTimeMillis())

(b)Android LocationManager (Android Location API)を使用している場合、電話の「場所」設定とrequestLocationUpdates設定(LocationManager.NETWORK_PROVIDERおよび/またはLocationManager.GPS_PROVIDER)に応じて、getProvider()は次を返します。

  • 'network'のいずれか。この場合、getTime()はデバイスの時刻(System.currentTimeMillis())を返します。
  • または、「gps」。この場合、getTimeはGPS(衛星)時刻を返します。

基本的に:「融合」はGPSとWi-Fi /ネットワークを使用し、「ネットワーク」はWi-Fi /ネットワークを使用し、「gps」はGPSを使用します。

したがって、GPS時刻を取得するには、requestLocationUpdatesをLocationManager.GPS_PROVIDERに設定してAndroidLocationManagerを使用します。(この場合、getTime()ミリ秒の部分は常に000であることに注意してください)

Android LocationManager(Android Location API)を使用した例を次に示します。

public void InitialiseLocationListener(android.content.Context context) {

    android.location.LocationManager locationManager = (android.location.LocationManager)
            context.getSystemService(android.content.Context.LOCATION_SERVICE);

    android.location.LocationListener locationListener = new android.location.LocationListener() {

        public void onLocationChanged(android.location.Location location) {

            String time = new java.text.SimpleDateFormat("dd/MM/yyyy HH:mm:ss.SSS").format(location.getTime());

            if( location.getProvider().equals(android.location.LocationManager.GPS_PROVIDER))
                android.util.Log.d("Location", "Time GPS: " + time); // This is what we want!
            else
                android.util.Log.d("Location", "Time Device (" + location.getProvider() + "): " + time);
        }

        public void onStatusChanged(String provider, int status, android.os.Bundle extras) {
        }
        public void onProviderEnabled(String provider) {
        }
        public void onProviderDisabled(String provider) {
        }
    };

    if (android.support.v4.content.ContextCompat.checkSelfPermission(context,
            android.Manifest.permission.ACCESS_FINE_LOCATION) != android.content.pm.PackageManager.PERMISSION_GRANTED) {
        android.util.Log.d("Location", "Incorrect 'uses-permission', requires 'ACCESS_FINE_LOCATION'");
        return;
    }

    locationManager.requestLocationUpdates(android.location.LocationManager.NETWORK_PROVIDER, 1000, 0, locationListener);
    locationManager.requestLocationUpdates(android.location.LocationManager.GPS_PROVIDER, 1000, 0, locationListener);
    // Note: To Stop listening use: locationManager.removeUpdates(locationListener)
}
于 2016-04-07T07:58:42.373 に答える
11

GPSから修正を受信するたびに、メソッドonLocationChangedが呼び出されます。このメソッドのパラメーターは、のインスタンスですLocation。このパラメータのメソッドの1つは、getTime探しているものを提供することです。それは私があなたが探しているものを正しく理解した場合です。詳細はこちら

于 2011-08-10T20:13:15.967 に答える
1

私はこれを言うgetTime関数の説明に出くわしました:

public long getTime()1970年1月1日からのミリ秒単位でこの修正のUTC時刻を返します。デバイスのUTC時刻は単調ではないことに注意してください。予期せず、前後にジャンプする可能性があります。

うわぁ!本当?実際にミリ秒値を含む時間オブジェクトを返したとしても、「予期せず前方または後方にジャンプする可能性がある」場合、その値はTOTALLYUSELESSです。

私が取り組んでいるプロジェクトには、「正確なミリ秒」の時間値が絶対に必要です(「1970年1月1日からのミリ秒」であっても)。その正確さなしで、私はめちゃくちゃです!

于 2021-01-12T18:23:21.220 に答える