2011-07-14 32 views
86

Có thể nhận vị trí hiện tại của người dùng mà không sử dụng gps hoặc internet không? Ý tôi là với sự trợ giúp của nhà cung cấp mạng di động. Ai giúp tôi với?Android: nhận vị trí hiện tại của người dùng mà không cần sử dụng gps hoặc internet

+1

Câu trả lời được chấp nhận có hoạt động hoàn hảo không? Đối với tôi nó không hoạt động ... !!! –

+3

Thật không may là câu trả lời được chấp nhận là sai :-(Thật ngạc nhiên là nó có 28 phiếu bầu, mặc dù nó không trả lời đúng câu hỏi! –

+0

@DavidWasser Đánh giá cao nhận xét có giá trị của bạn Và bạn có nghĩ rằng thực sự không có phương pháp nào để có được vị trí chi tiết mà không sử dụng internet hoặc gps? (ngoài việc sử dụng tin nhắn quảng bá) –

Trả lời

76

Những gì bạn đang tìm kiếm để làm là có được vị trí bằng cách sử dụng LocationManager.NETWORK_PROVIDER thay vì LocationManager.GPS_PROVIDER. Các NETWORK_PROVIDER sẽ giải quyết trên GSM hoặc wifi, trong đó bao giờ có sẵn. Rõ ràng với wifi tắt, GSM sẽ được sử dụng. Hãy nhớ rằng việc sử dụng mạng di động chính xác về cơ bản là 500m.

http://developer.android.com/guide/topics/location/obtaining-user-location.html có một số thông tin thực sự tuyệt vời và mã mẫu.

Sau khi bạn có được thực hiện với hầu hết các mã trong OnCreate(), thêm này:

// Acquire a reference to the system Location Manager 
LocationManager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE); 

// Define a listener that responds to location updates 
LocationListener locationListener = new LocationListener() { 
    public void onLocationChanged(Location location) { 
     // Called when a new location is found by the network location provider. 
     makeUseOfNewLocation(location); 
    } 

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

    public void onProviderEnabled(String provider) {} 

    public void onProviderDisabled(String provider) {} 
    }; 

// Register the listener with the Location Manager to receive location updates 
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener); 

Bạn cũng có thể có hoạt động của bạn thực hiện các lớp LocationListener và do đó thực hiện onLocationChanged() trong hoạt động của bạn.

+1

Không phải "internet" được tính là nhà cung cấp mạng không? – hwrdprkns

+0

ý của bạn là gì? Từ tài liệu LocationManager cho NETWORK_PROVIDER: "Nhà cung cấp này xác định vị trí dựa trên tính sẵn có của các điểm truy cập WiFi và tháp di động". Người ta có thể tưởng tượng rằng không có wifi, điện thoại sẽ mặc định cho tháp di động. – Ian

+1

Er, tôi nghĩ bạn đúng. Nvm xin lỗi. – hwrdprkns

14

Bằng cách nhận số getLastKnownLocation, bạn không thực sự tự sửa lỗi.

Hãy lưu ý rằng điều này có thể bắt đầu nhà cung cấp, nhưng nếu người dùng đã từng nhận được vị trí trước đó, tôi không nghĩ điều đó sẽ xảy ra. Các tài liệu không thực sự quá rõ ràng về điều này.

Theo các tài liệu getLastKnownLocation:

Trả về một Địa chỉ các dữ liệu từ vị trí cuối cùng được biết sửa chữa thu được từ nhà cung cấp nhất định. Điều này có thể được thực hiện mà không cần bắt đầu nhà cung cấp.

Dưới đây là một đoạn nhanh:

import android.content.Context; 
import android.location.Location; 
import android.location.LocationManager; 
import java.util.List; 

public class UtilLocation { 
    public static Location getLastKnownLoaction(boolean enabledProvidersOnly, Context context){ 
     LocationManager manager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE); 
     Location utilLocation = null; 
     List<String> providers = manager.getProviders(enabledProvidersOnly); 
     for(String provider : providers){ 

      utilLocation = manager.getLastKnownLocation(provider); 
      if(utilLocation != null) return utilLocation; 
     } 
     return null; 
    } 
} 

Bạn cũng cần phải thêm giấy phép mới để AndroidManifest.xml

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

u có thể giải thích cho tôi một cách rõ ràng –

+0

Tôi sẽ cập nhật trả lời bằng đoạn mã. – hwrdprkns

+0

Điều tôi đang nghĩ là, Có thể lấy vị trí hiện tại bằng mạng di động –

4

Có thể nhận vị trí hiện tại của người dùng mà không sử dụng GPS và nhà cung cấp mạng.

1. Convert cellLocation to real location (Latitude and Longitude), using "http://www.google.com/glm/mmap"

2. Click Here For Your Reference

0

Bạn hãy xem Google Maps Định vị Api? Google Map Geolocation

này được đơn giản RestApi, bạn chỉ cần gửi một yêu cầu, các dịch vụ này sẽ trả về một vị trí với độ chính xác trong mét

Trân trọng

4
boolean gps_enabled = false; 
boolean network_enabled = false; 

LocationManager lm = (LocationManager) mCtx 
       .getSystemService(Context.LOCATION_SERVICE); 

gps_enabled = lm.isProviderEnabled(LocationManager.GPS_PROVIDER); 
network_enabled = lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER); 

Location net_loc = null, gps_loc = null, finalLoc = null; 

if (gps_enabled) 
    gps_loc = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER); 
if (network_enabled) 
    net_loc = lm.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); 

if (gps_loc != null && net_loc != null) { 

    //smaller the number more accurate result will 
    if (gps_loc.getAccuracy() > net_loc.getAccuracy()) 
     finalLoc = net_loc; 
    else 
     finalLoc = gps_loc; 

     // I used this just to get an idea (if both avail, its upto you which you want to take as I've taken location with more accuracy) 

} else { 

    if (gps_loc != null) { 
     finalLoc = gps_loc; 
    } else if (net_loc != null) { 
     finalLoc = net_loc; 
    } 
} 
2

Không, bạn không thể hiện được vị trí mà không sử dụng GPS hoặc internet.

Kỹ thuật vị trí dựa trên WiFi, di động hoặc Bluetooth hoạt động với sự trợ giúp của cơ sở dữ liệu lớn liên tục được cập nhật.Một thiết bị quét ID máy phát và sau đó gửi chúng trong một truy vấn thông qua internet đến một dịch vụ như Google, Apple hoặc Skyhook. Dịch vụ đó phản hồi với một vị trí dựa trên các cuộc khảo sát không dây trước đó từ các địa điểm đã biết. Nếu không có truy cập internet, bạn phải có một bản sao cục bộ của một cơ sở dữ liệu như vậy và giữ cho đến nay. Để sử dụng toàn cầu, điều này là rất không thực tế.

Về mặt lý thuyết, nhà cung cấp dịch vụ di động chỉ có thể cung cấp dịch vụ dữ liệu cục bộ nhưng không có quyền truy cập internet và sau đó trả lời các truy vấn vị trí từ thiết bị di động. Các nhà cung cấp dịch vụ di động không làm điều này; không ai muốn trả tiền cho loại truy cập dữ liệu bị hạn chế này. Nếu bạn có dịch vụ dữ liệu qua nhà cung cấp dịch vụ di động, thì bạn có thể truy cập internet.

Tóm lại, sử dụng LocationManager.NETWORK_PROVIDER hoặc android.hardware.location.network để nhận vị trí yêu cầu sử dụng internet.

Sử dụng vị trí đã biết cuối cùng yêu cầu bạn đã có GPS hoặc truy cập internet rất gần đây. Nếu bạn chỉ có internet, có lẽ bạn có thể điều chỉnh vị trí của bạn hoặc cài đặt để có được internet một lần nữa. Nếu thiết bị của bạn chưa có GPS hoặc truy cập internet, tính năng vị trí đã biết cuối cùng sẽ không giúp bạn.

Nếu không có GPS hoặc internet, bạn có thể:

  1. Chụp ảnh của bầu trời đêm và sử dụng thời gian hiện tại để ước tính vị trí của bạn dựa trên một biểu đồ sao. Điều này có lẽ sẽ yêu cầu thiết bị bổ sung để đảm bảo rằng các góc cho hình ảnh của bạn được đo chính xác.
  2. Sử dụng gia tốc kế để theo dõi vị trí bắt đầu từ vị trí đã biết. Sự tích tụ của lỗi trong cách tiếp cận này làm cho nó không thực tế đối với hầu hết các tình huống.
Các vấn đề liên quan