2016-08-15 15 views
7

を返し、私は問題がある、私はandroid.location.LocationListeneronLocationChanged(Location location)を実施している三星ギャラクシータブA.が呼び出されると、それは私にちょっと右経度と緯度を与えるが、アンドロイドonLocationChanged location.getTimeは()間違った時間

持っています私に間違った時間を与える、それは300000ミル程度の時間を返します。それは1471243684497のようなものでなければなりません。

私は何をすべきかわかりません。 GPSTrackerクラスを拡張

import java.io.IOException; 
import java.util.List; 
import java.util.Locale; 

import android.app.Service; 
import android.content.Context; 
import android.content.Intent; 
import android.location.Address; 
import android.location.Geocoder; 
import android.location.Location; 
import android.location.LocationListener; 
import android.location.LocationManager; 
import android.os.Bundle; 
import android.os.IBinder; 
import android.util.Log; 

public class GPSTracker extends Service implements LocationListener 
{ 
    //flag for GPS Status 
    boolean isGPSEnabled = false; 

    //flag for network status 
    //boolean isNetworkEnabled = false; 

    boolean canGetLocation = false; 

    Location location; 
    double latitude; 
    double longitude; 

    //The minimum distance to change updates in metters 
    private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10; //10 metters 

    //The minimum time beetwen updates in milliseconds 
    private static final long MIN_TIME_BW_UPDATES = 1000 * 10; // 1 minute 

    //Declaring a Location Manager 
    protected LocationManager locationManager; 

    /*public GPSTracker(Context context) 
    { 
     this.mContext = context; 
     getLocation(); 
    }*/ 

    public Location getLocation(Context ctx) 
    { 
     try 
     { 
      locationManager = (LocationManager) ctx.getSystemService(LOCATION_SERVICE); 

      //getting GPS status 
      isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER); 

      //getting network status 
      //isNetworkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER); 

      if (!isGPSEnabled /*&& !isNetworkEnabled*/) 
      { 
       // no network provider is enabled 
      } 
      else 
      { 
       this.canGetLocation = true; 

       //First get location from Network Provider 
       /* if (isNetworkEnabled) 
       { 
        locationManager.requestLocationUpdates(
          LocationManager.NETWORK_PROVIDER, 
          MIN_TIME_BW_UPDATES, 
          MIN_DISTANCE_CHANGE_FOR_UPDATES, this); 

        Log.d("Network", "Network"); 

        if (locationManager != null) 
        { 
         location = 
           locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); 
         updateGPSCoordinates(); 
        } 
       }*/ 

       //if GPS Enabled get lat/long using GPS Services 
       if (isGPSEnabled) 
       { 
        if (location == null) 
        { 
         locationManager.requestLocationUpdates(
           LocationManager.GPS_PROVIDER, 
           MIN_TIME_BW_UPDATES, 
           MIN_DISTANCE_CHANGE_FOR_UPDATES, this); 

         Log.d("GPS Enabled", "GPS Enabled"); 

         if (locationManager != null) 
         { 
          location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); 
          updateGPSCoordinates(); 
         } 
        } 
       } 
      } 
     } 
     catch (Exception e) 
     { 
      //e.printStackTrace(); 
      Log.e("Error : Location", "Impossible to connect to LocationManager", e); 
     } 

     return location; 
    } 

    public void updateGPSCoordinates() 
    { 
     if (location != null) 
     { 
      latitude = location.getLatitude(); 
      longitude = location.getLongitude(); 
     } 
    } 

    /** 
    * Stop using GPS listener 
    * Calling this function will stop using GPS in your app 
    */ 

    public void stopUsingGPS() 
    { 
     if (locationManager != null) 
     { 
      locationManager.removeUpdates(GPSTracker.this); 
     } 
    } 

    /** 
    * Function to get latitude 
    */ 
    public double getLatitude() 
    { 
     if (location != null) 
     { 
      latitude = location.getLatitude(); 
     } 

     return latitude; 
    } 

    /** 
    * Function to get longitude 
    */ 
    public double getLongitude() 
    { 
     if (location != null) 
     { 
      longitude = location.getLongitude(); 
     } 

     return longitude; 
    } 

    /** 
    * Function to check GPS/wifi enabled 
    */ 
    public boolean canGetLocation() 
    { 
     if(!locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)/*&& 
       !locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)*/){ 
      this.canGetLocation = false; 
     } else { 
      this.canGetLocation = true; 
     } 
     return this.canGetLocation; 
    } 

    /** 
    * Get list of address by latitude and longitude 
    * @return null or List<Address> 
    */ 
    public List<Address> getGeocoderAddress(Context context) 
    { 
     if (location != null) 
     { 
      Geocoder geocoder = new Geocoder(context, Locale.ENGLISH); 
      try 
      { 
       List<Address> addresses = geocoder.getFromLocation(latitude, longitude, 1); 
       return addresses; 
      } 
      catch (IOException e) 
      { 
       //e.printStackTrace(); 
       Log.e("Error : Geocoder", "Impossible to connect to Geocoder", e); 
      } 
     } 

     return null; 
    } 

    /** 
    * Try to get AddressLine 
    * @return null or addressLine 
    */ 
    public String getAddressLine(Context context) 
    { 
     List<Address> addresses = getGeocoderAddress(context); 
     if (addresses != null && addresses.size() > 0) 
     { 
      Address address = addresses.get(0); 
      String addressLine = address.getAddressLine(0); 

      return addressLine; 
     } 
     else 
     { 
      return null; 
     } 
    } 

    /** 
    * Try to get Locality 
    * @return null or locality 
    */ 
    public String getLocality(Context context) 
    { 
     List<Address> addresses = getGeocoderAddress(context); 
     if (addresses != null && addresses.size() > 0) 
     { 
      Address address = addresses.get(0); 
      String locality = address.getLocality(); 

      return locality; 
     } 
     else 
     { 
      return null; 
     } 
    } 

    /** 
    * Try to get Postal Code 
    * @return null or postalCode 
    */ 
    public String getPostalCode(Context context) 
    { 
     List<Address> addresses = getGeocoderAddress(context); 
     if (addresses != null && addresses.size() > 0) 
     { 
      Address address = addresses.get(0); 
      String postalCode = address.getPostalCode(); 

      return postalCode; 
     } 
     else 
     { 
      return null; 
     } 
    } 

    /** 
    * Try to get CountryName 
    * @return null or postalCode 
    */ 
    public String getCountryName(Context context) 
    { 
     List<Address> addresses = getGeocoderAddress(context); 
     if (addresses != null && addresses.size() > 0) 
     { 
      Address address = addresses.get(0); 
      String countryName = address.getCountryName(); 

      return countryName; 
     } 
     else 
     { 
      return null; 
     } 
    } 

    @Override 
    public void onLocationChanged(Location location) 
    { 
    } 

    @Override 
    public void onProviderDisabled(String provider) 
    { 
    } 

    @Override 
    public void onProviderEnabled(String provider) 
    { 
    } 


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

    } 

    @Override 
    public IBinder onBind(Intent arg0) { 
     return null; 
    } 
} 

そして、私自身のクラス:

GPSTrackerクラス

public class NewMainService extends GPSTracker { 


    @Override 
    public void onLocationChanged(Location location) { 
     long time = location.getTime(); 
     Log.i("TAG", "onLocationChanged time: "+time); //prints wrong timestamp 
     super.onLocationChanged(location); 
    } 
} 

EDIT

すべてが他のデバイス上で正常に動作します。

私はそれをgoogled、それはいくつかのデバイスのバグです。ロケーションリスナーはしばらくしてから変更を受信しなくなります。

私の時間はデバイスの稼働時間のようなものですが、それは数時間ですが、それは日付ではありません。

+0

は(LocationManagerではなくエポックからの時間のデバイスの稼働時間と場所を返します)同じ問題を持っていた - 可能な場合、あなたはバグに関するリンクをお願いできますか?このSOの質問以外は何も見つかりませんでした。どうもありがとう! –

+1

@AlephAleph、私は自分自身のシンプルなロケーションリスナを実装しましたが、 "Fused Location"は実装しませんでした。それをPARTIAL_WAKE_LOCKタイプのウェイクロックと混ぜて、ネットワークプロバイダとgpsプロバイダの両方を聞くために 'Locationmanager'を登録しました。今は正常に動作しています。 –

答えて

0

NMEAロケーションリスナーを使用すると、その時間からしか取得できません。 デバイスのタイムゾーンや日時を変更しても、それは常に真であり、UTC時刻です。これは、現在の実際の日時を常に示します。

LIMITAIONS:

GPSや場所-ifオフになっている、あなたはNMEAを取得することはありません。 (ロケーションがオンになっているかどうかを確認できます)

-ifロケーションはオンになっていますが、ユーザが設定によってネットワークの精度を変更しただけでは、NMEAは取得されません。 (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)どうかを確認することができます)

関連する問題