2013-03-03 35 views
5

Tôi muốn nhận tọa độ vị trí chính xác hiện tại trong Android. Tôi có thể có được vị trí nếu điện thoại di động được kết nối với kết nối internet Wifi và trong trường hợp khác khi tôi đi một số nơi khác và không có kết nối internet thì nó không đưa ra tọa độ vị trí hiện tại. thay vào đó cho các tọa độ vị trí cuối cùng.Làm thế nào để có được vị trí chính xác hiện tại trong Android mà không cần kết nối internet?

Ví dụ:

Hiện nay tôi đang ở một thành phố và nhận được tọa độ hiện tại bằng cách vào kết nối wifi và di chuyển đến thành phố B thì tôi không thể lấy tọa độ hiện hành. Thay vì điều này, nó đưa ra các tọa độ vị trí cuối cùng.

Bất kỳ ai cũng có thể đề xuất tôi làm cách nào để có được vị trí hiện tại mà không cần kết nối internet.

public Location getLocation() { 
    try { 
     locationManager = (LocationManager) context.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); 
       if (locationManager != null) { 
        location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); 
        if (location != null) { 
         latitude = location.getLatitude(); 
         longitude = location.getLongitude(); 
        } 
       } 
      } 

      // 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); 
        if (locationManager != null) { 
         location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); 
         if (location != null) { 
          latitude = location.getLatitude(); 
          longitude = location.getLongitude(); 
         } 
        } 
       } 
      } 
     } 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    return location; 
} 

/** 
* Stop using GPS listener 
* Calling this function will stop using GPS in your app 
* */ 
public void stopUsingGPS(){ 
    if(locationManager != null){ 
     locationManager.removeUpdates(GetLocations.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; 
} 
+1

Thấy Android sử dụng AGPS, bạn không thể. –

+0

@Raghav Sood Không có cách nào để giải quyết vấn đề của tôi ?? –

+0

AGPS là viết tắt của Assisted GPS. Trong đó, module GPS được hỗ trợ bởi dữ liệu lấy từ internet. Không có internet = no AGPS –

Trả lời

1

Mã bạn hiển thị chỉ là phương thức getLocation của lớp học. Có lẽ lớp học của bạn cũng thực hiện LocationListener, đúng không? (Giả sử nó mà không nhìn thấy nó, bởi vì bạn gán "này" trong requestLocationUpdates như người nghe.)

Phương pháp bạn đã được hiển thị sẽ chỉ bao giờ quay trở lại vị trí Last Known vì cập nhật vị trí thông qua các nhà cung cấp là không đồng bộ. Bạn cho biết rằng bạn muốn nhận thông tin vị trí thông qua việc đăng ký người nghe và rằng người nghe sẽ nhận các bản cập nhật định kỳ (dựa trên cài đặt bạn cung cấp và dựa trên khả năng và tình huống thiết bị thực tế). Bạn sẽ KHÔNG lấy lại vị trí ngay sau khi đăng ký.

Trong trường hợp câu hỏi của bạn, nhận thông tin vị trí khi KHÔNG kết nối với mạng, bạn sẽ cần phải sử dụng nhà cung cấp GPS (nó hoạt động trong khi không kết nối với mạng dữ liệu). Sau khi bạn đã đăng ký trình lắng nghe nhà cung cấp GPS (như bạn đã có), bạn sẽ nhận được các cập nhật vị trí thông qua cuộc gọi lại trong trình nghe, onLocationChanged(Location location).

Gọi lại onLocationChanged của bạn là gì? Đó là nơi bạn sẽ nhận được thông tin vị trí được cập nhật từ vài giây đến vài phút sau khi bạn đăng ký nhà cung cấp GPS (tùy thuộc vào phần cứng trong thiết bị bạn đang sử dụng và điều kiện môi trường, GPS sử dụng nhiều vệ tinh và hoạt động nhanh hơn với một cái nhìn rõ ràng về bầu trời, nó có thể không hoạt động chút nào nếu bạn ở trong nhà hoặc tín hiệu bị che khuất).

Ngoài việc chờ người nghe giúp bạn cập nhật thông tin vị trí, bạn cũng có thể cân nhắc sử dụng một số phương pháp đơn giản, riêng biệt để nhận vị trí cuối cùng và đăng ký nhà cung cấp tốt nhất. Bạn có thể sử dụng một vài vòng lặp đơn giản và Criteria mà bạn quan tâm (COARSE vs FINE, LOW_POWER hay không, v.v.).

Các nhà phát triển Android đã ghi lại tài liệu này khá tốt trong tài liệu và ứng dụng mẫu "Nguồn mở cho Vị trí" và bài đăng trên blog "Deep Dive" (có liên kết tới tất cả các tài nguyên khác trong đó): http://android-developers.blogspot.com/2011/06/deep-dive-into-location.html .

-2

Nếu không có Internet và GPS, bạn có thể nhận Vị trí dựa trên GSM (Mạng di động).

NETWORK_PROVIDER sẽ giải quyết trên GSM hoặc wifi, có sẵn. Rõ ràng với wifi tắt, GSM sẽ được sử dụng. Tuy nhiên, độ chính xác của mạng di động có thể thay đổi từ 500m đến 2000M.

+0

Áp phích đã biết về nhà cung cấp mạng, và chỉ định nó trong câu hỏi ban đầu. Vấn đề là anh ấy không chờ người nghe. (Ngoài ra, nhà cung cấp mạng không phải lúc nào cũng sử dụng "GSM hoặc Wifi", không phải tất cả thiết bị đều là GSM. Và nhà cung cấp mạng có thể chính xác hơn 500m tối thiểu, chắc chắn có thể không, nhưng đó không phải là trường hợp tốt nhất của nó). –

Các vấn đề liên quan