2012-05-14 26 views
5

Tôi đang cố truy xuất # vệ tinh được sử dụng trong bản sửa lỗi GPS. Tôi đã thực hiện hai phương pháp khác nhau, như hình dưới đây:Lấy # vệ tinh được sử dụng trong sửa lỗi gps từ Android

package ti.utils; 

import android.app.Activity; 
import android.content.Context; 
import android.location.GpsSatellite; 
import android.location.GpsStatus; 
import android.location.Location; 
import android.location.LocationListener; 
import android.location.LocationManager; 
import android.os.Bundle; 

public class Gps { 

    private static final int TWO_MINUTES = 1000 * 60 * 2; 
    private static Location Location; 
    public static int Satellites = -1; 

    public static void StartTracking(Activity activity) 
    { 
     final LocationManager locationManager = (LocationManager) activity.getSystemService(Context.LOCATION_SERVICE); 

     //listen for gps status changes. 
     GpsStatus.Listener gpsStatusListener = new GpsStatus.Listener() { 
      public void onGpsStatusChanged(int event) { 
       Log("In onGpsStatusChanged event: " + event); 
       if (event == GpsStatus.GPS_EVENT_SATELLITE_STATUS || event == GpsStatus.GPS_EVENT_FIRST_FIX) { 
        GpsStatus status = locationManager.getGpsStatus(null); 
        Iterable<GpsSatellite> sats = status.getSatellites(); 
        // Check number of satellites in list to determine fix state 
        Satellites = 0; 
        for (GpsSatellite sat : sats) { 
         //if(sat.usedInFix()) 
         Satellites++; 
        } 
        Log("Setting Satellites from GpsStatusListener: " + Satellites); 
       } 
      } 
     }; 
     locationManager.addGpsStatusListener(gpsStatusListener); 

     //listen for location changes. 
     LocationListener locationListener = new LocationListener() { 
      public void onLocationChanged(Location location) { 
       // Called when a new location is found by the network location provider. 
       try 
       { 
        Log("Location changed! Speed = " + location.getSpeed() + " & Satellites = " + location.getExtras().getInt("satellites")); 
        boolean isBetter = isBetterLocation(location, Location); 
        if(isBetter) 
        { 
         Log("Set to new location"); 
         Location = location; 
         Satellites = location.getExtras().getInt("satellites"); 
         Log("Setting Satellites from LocationListener: " + Satellites); 
        } 
       } 
       catch(Exception exc) 
       { 
        Log(exc.getMessage()); 
       } 
      } 
      public void onStatusChanged(String provider, int status, Bundle extras) {} 
      public void onProviderEnabled(String provider) {} 
      public void onProviderDisabled(String provider) {} 
     }; 
     locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener); 
    } 

    /** Determines whether one Location reading is better than the current Location fix 
     * @param location The new Location that you want to evaluate 
     * @param currentBestLocation The current Location fix, to which you want to compare the new one 
     */ 
    protected static boolean isBetterLocation(Location location, Location currentBestLocation) { 
     if (currentBestLocation == null) { 
      // A new location is always better than no location 
      return true; 
     } 

     // Check whether the new location fix is newer or older 
     long timeDelta = location.getTime() - currentBestLocation.getTime(); 
     boolean isSignificantlyNewer = timeDelta > TWO_MINUTES; 
     boolean isSignificantlyOlder = timeDelta < -TWO_MINUTES; 
     boolean isNewer = timeDelta > 0; 

     // If it's been more than two minutes since the current location, use the new location 
     // because the user has likely moved 
     if (isSignificantlyNewer) { 
      return true; 
     // If the new location is more than two minutes older, it must be worse 
     } else if (isSignificantlyOlder) { 
      return false; 
     } 

     // Check whether the new location fix is more or less accurate 
     int accuracyDelta = (int) (location.getAccuracy() - currentBestLocation.getAccuracy()); 
     boolean isLessAccurate = accuracyDelta > 0; 
     boolean isMoreAccurate = accuracyDelta < 0; 
     boolean isSignificantlyLessAccurate = accuracyDelta > 200; 

     // Check if the old and new location are from the same provider 
     boolean isFromSameProvider = isSameProvider(location.getProvider(), 
       currentBestLocation.getProvider()); 

     // Determine location quality using a combination of timeliness and accuracy 
     if (isMoreAccurate) { 
      return true; 
     } else if (isNewer && !isLessAccurate) { 
      return true; 
     } else if (isNewer && !isSignificantlyLessAccurate && isFromSameProvider) { 
      return true; 
     } 
     return false; 
    } 

    /** Checks whether two providers are the same */ 
    private static boolean isSameProvider(String provider1, String provider2) { 
     if (provider1 == null) { 
      return provider2 == null; 
     } 
     return provider1.equals(provider2); 
    } 

    private static void Log(String message) { 
     if(message != null && message.length() > 0) { 
      //android.util.Log.i(LCAT, message); 
      org.appcelerator.kroll.common.Log.i("SygicModule", message); 
     } 
    } 

} 

Cả trong những sự kiện người nghe (onGpsStatusChanged & onLocationChanged) bao giờ cháy, mặc dù tôi có độc GPS được kích hoạt trên điện thoại của tôi. Tôi có tập phép ACCESS_FINE_LOCATION:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> 

Tôi đã tải về một ứng dụng bên thứ 3 được gọi là GPS Status và nó đã có thể hiển thị một cách chính xác cáC# của các vệ tinh, vì vậy tôi biết nó không phải là một vấn đề với Droid X2 của tôi.

Bất kỳ ý tưởng nào?

Trả lời

3
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener); 

Nên

locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener); 
+0

Điều này đã giúp một số phương pháp tiếp cận thứ hai, hiện tại sự kiện onLocationChanged được kích hoạt, tuy nhiên nó luôn có 0 vệ tinh trong location.getExtras(). GetInt ("vệ tinh") – Justin

+0

Điều này đã kết thúc ... Tôi nghĩ mình đã thử hai phương pháp riêng biệt, nhưng hóa ra tôi cần cả hai để nó hoạt động! – Justin

+0

Rất vui khi bạn làm việc đó;) – techiServices

0

Nếu bạn không thể có được numebr các vệ tinh thông qua GPS_EVENT_SATELLITE_STATUS sau đó bạn có thể có hoạt tính của bạn thực hiện NmeaListener.

Nếu bạn triển khai NmeaListener thì bạn sẽ phải phân tích cú pháp chuỗi tin nhắn nhận được trong onNmeaReceived để trích xuất số lượng vệ tinh. Các định dạng NMEA được mô tả here. Sau đó, bạn có thể thực hiện tìm kiếm Google cho "Java" + "NMEA parser"

+0

Tôi thấy khó tin rằng tôi phải phân tích cú pháp thủ công thông qua dữ liệu NMEA chỉ để truy xuất # vệ tinh. Phương pháp đầu tiên cũng đang xử lý sự kiện GPS_EVENT_FIRST_FIX, điều này sẽ được kích hoạt. Ngoài ra, bạn không đề cập đến phương pháp thứ hai, nên được kích hoạt trên thay đổi vị trí ... – Justin

+0

Hmm, tôi khá chắc chắn rằng khi điện thoại của tôi chạy Gingerbread, nó luôn trả về 0 vệ tinh. Bây giờ nó đang chạy ICS I DO xem số vệ tinh trong GPS_EVENT_SATELLITE_STATUS. Tôi sẽ chỉnh sửa câu trả lời của mình. – NickT

+0

Sony Ericsson Xperia Pro của tôi chạy Gingerbread 2.3.4 cũng trả lại 0 vệ tinh. Phân tích dữ liệu NMEA không giúp (hoặc 0 chất lượng), và dựa trên http://stackoverflow.com/questions/587441/roll-your-own-nmea-parser-or-use-an-open-source- gps-parser có vẻ như NMEA là không đáng tin cậy và tôi sẽ phải đi cho các định dạng nhị phân cụ thể của thiết bị GPS. – Piovezan

6

Đây là mã kết thúc hoạt động.

package ti.utils; 

import android.app.Activity; 
import android.content.Context; 
import android.location.GpsSatellite; 
import android.location.GpsStatus; 
import android.location.Location; 
import android.location.LocationListener; 
import android.location.LocationManager; 
import android.os.Bundle; 

public class Gps { 

    private static final int TWO_MINUTES = 1000 * 60 * 2; 
    private static Location Location; 
    public static int Satellites = -1; 

    public static void StartTracking(Activity activity) 
    { 
     final LocationManager locationManager = (LocationManager) activity.getSystemService(Context.LOCATION_SERVICE); 

     //listen for gps status changes. 
     GpsStatus.Listener gpsStatusListener = new GpsStatus.Listener() { 
      @Override 
      public void onGpsStatusChanged(int event) { 
       Log("In onGpsStatusChanged event: " + event); 
       if (event == GpsStatus.GPS_EVENT_SATELLITE_STATUS || event == GpsStatus.GPS_EVENT_FIRST_FIX) { 
        GpsStatus status = locationManager.getGpsStatus(null); 
        Iterable<GpsSatellite> sats = status.getSatellites(); 
        // Check number of satellites in list to determine fix state 
        Satellites = 0; 
        for (GpsSatellite sat : sats) { 
         //if(sat.usedInFix()) 
         Satellites++; 
        } 
        Log("Setting Satellites from GpsStatusListener: " + Satellites); 
       } 
      } 
     }; 
     locationManager.addGpsStatusListener(gpsStatusListener); 

     //listen for location changes. 
     LocationListener locationListener = new LocationListener() { 
      @Override 
      public void onLocationChanged(Location location) { 
       // Called when a new location is found by the network location provider. 
       /*try 
       { 
        Log("Location changed! Speed = " + location.getSpeed() + " & Satellites = " + location.getExtras().getInt("satellites")); 
        boolean isBetter = isBetterLocation(location, Location); 
        if(isBetter) 
        { 
         Log("Set to new location"); 
         Location = location; 
         Satellites = location.getExtras().getInt("satellites"); 
         Log("Setting Satellites from LocationListener: " + Satellites); 
        } 
       } 
       catch(Exception exc) 
       { 
        Log(exc.getMessage()); 
       }*/ 
      } 
      public void onStatusChanged(String provider, int status, Bundle extras) {} 
      public void onProviderEnabled(String provider) {} 
      public void onProviderDisabled(String provider) {} 
     }; 
     locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener); 
    } 

    /** Determines whether one Location reading is better than the current Location fix 
     * @param location The new Location that you want to evaluate 
     * @param currentBestLocation The current Location fix, to which you want to compare the new one 
     */ 
    protected static boolean isBetterLocation(Location location, Location currentBestLocation) { 
     if (currentBestLocation == null) { 
      // A new location is always better than no location 
      return true; 
     } 

     // Check whether the new location fix is newer or older 
     long timeDelta = location.getTime() - currentBestLocation.getTime(); 
     boolean isSignificantlyNewer = timeDelta > TWO_MINUTES; 
     boolean isSignificantlyOlder = timeDelta < -TWO_MINUTES; 
     boolean isNewer = timeDelta > 0; 

     // If it's been more than two minutes since the current location, use the new location 
     // because the user has likely moved 
     if (isSignificantlyNewer) { 
      return true; 
     // If the new location is more than two minutes older, it must be worse 
     } else if (isSignificantlyOlder) { 
      return false; 
     } 

     // Check whether the new location fix is more or less accurate 
     int accuracyDelta = (int) (location.getAccuracy() - currentBestLocation.getAccuracy()); 
     boolean isLessAccurate = accuracyDelta > 0; 
     boolean isMoreAccurate = accuracyDelta < 0; 
     boolean isSignificantlyLessAccurate = accuracyDelta > 200; 

     // Check if the old and new location are from the same provider 
     boolean isFromSameProvider = isSameProvider(location.getProvider(), 
       currentBestLocation.getProvider()); 

     // Determine location quality using a combination of timeliness and accuracy 
     if (isMoreAccurate) { 
      return true; 
     } else if (isNewer && !isLessAccurate) { 
      return true; 
     } else if (isNewer && !isSignificantlyLessAccurate && isFromSameProvider) { 
      return true; 
     } 
     return false; 
    } 

    /** Checks whether two providers are the same */ 
    private static boolean isSameProvider(String provider1, String provider2) { 
     if (provider1 == null) { 
      return provider2 == null; 
     } 
     return provider1.equals(provider2); 
    } 

    private static void Log(String message) { 
     if(message != null && message.length() > 0) { 
      //android.util.Log.i(LCAT, message); 
      org.appcelerator.kroll.common.Log.i("UtilsModule", message); 
     } 
    } 

} 
+1

Tại sao bạn có câu lệnh 'if (sat.usedInFix())' đã nhận xét? Tôi sẽ un-bình luận rằng dòng nếu bạn muốn đếm của bạn để được các vệ tinh thực sự được sử dụng trong sửa chữa gần đây nhất. –

0

Tôi làm việc này bằng cách làm theo mã. locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, new LocationUpdateHandler()); int nSatellites = location.getExtras().getInt("satellites", -1);

nSatellites được tìm thấy là> 0 khi tôi bắt đầu sửa chữa (onLocationChanged gọi lại).