Nhận vị trí hiện tại của người dùng trong Android mà không cần sử dụng GPS hoặc Internet


91

Có thể lấy vị trí hiện tại của người dùng mà không cần 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.


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 ... !!!
Samitha Chathuranga

3
Thật không may là câu trả lời được chấp nhận là sai :-( tuyệt vời mà nó đã 28 upvotes mặc dù nó không trả lời câu hỏi một cách chính xác!
David Wasser

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

2
@SamithaChathuranga Hãy suy nghĩ về điều này: nếu bạn không có GPS và bạn không có Internet, bạn sẽ lấy thông tin này ở đâu? Bạn có thể lấy thông tin ID di động từ mạng. Điều này chỉ cung cấp cho bạn ID. Sau đó, bạn sẽ cần một cách để ánh xạ ID thành một tọa độ hoặc tên thực tế. Bạn luôn có thể xây dựng cơ sở dữ liệu cell ID của riêng mình và đưa nó vào ứng dụng của mình, nhưng bạn sẽ mất rất nhiều công sức để thu thập tất cả dữ liệu đó và ánh xạ không tĩnh: nó thay đổi khi các nhà khai thác di động cài đặt tháp di động mới và đánh số lại mạng của họ. Về cơ bản, câu trả lời thực tế là "không".
David Wasser

@DavidWasser Cảm ơn bạn đã trả lời. Tôi cũng đã rất ngạc nhiên khi làm thế nào để có được vị trí mà không cần internet hoặc gps. Nhưng bao gồm stackoverflow trong nhiều diễn đàn, điều này được cho là có thể. Đó là lý do tại sao tôi nghĩ rằng nó sẽ có thể. Có vẻ như nhiều người cũng đang hiểu sai.
Samitha Chathuranga

Câu trả lời:


87

Những gì bạn đang muốn làm là có được vị trí bằng cách sử dụng LocationManager.NETWORK_PROVIDERthay vì LocationManager.GPS_PROVIDER. Điều NETWORK_PROVIDERnày sẽ giải quyết trên GSM hoặc wifi, từng có sẵn. Rõ ràng khi tắt wifi, GSM sẽ được sử dụng. Hãy nhớ rằng sử dụng mạng di động về cơ bản là chính xác đến 500m.

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

Sau khi bạn hoàn thành hầu hết các mã OnCreate(), hãy thêm 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 triển khai LocationListenerlớp học và do đó thực hiện onLocationChanged()trong hoạt động của bạn.


1
hãy nhớ kiểm tra các chiến lược bảo quản pin. Ngoài ra, tùy thuộc vào ứng dụng của bạn, PASSIVE_PROVIDER và sử dụng getLastKnownLocation có thể giúp bạn tiết kiệm rất nhiều công việc và pin nếu các ứng dụng khác đang sử dụng ăng-ten.
Ian

2
Này @Ian, tôi đã sử dụng cùng một đoạn mã .. Nhưng trong trường hợp của tôi, phương thức lắng nghe onLocationChanged () không bao giờ được gọi. Tôi đã sử dụng requestLocationUpdates trên phương thức onResume (). nó vẫn chưa bao giờ được gọi .. Vì vậy, những gì đã được vấn đề ở đó?
MS.

2
Hey @lan hoặc bất kỳ người nào khác, những người có thể giúp tôi ra tôi triển khai mã trên nhưng phương pháp onLocationChanged neved được gọi những gì sẽ là vấn đề có thể bất kỳ một sự giúp đỡ tôi ra xin vui lòng .....
pareshm

1
Có thể nhận được các tọa độ mà không có internet? Trong một số thiết bị, nó dường như không hoạt động.
iammilind

20
Câu trả lời này sai :-( OP đã hỏi cách lấy vị trí mà không cần sử dụng kết nối Internet. LOCATION_PROVIDER cần sử dụng Internet để truy cập máy chủ nhằm phân giải tập hợp các địa chỉ MAC Cell-ID và WIFI thành một tọa độ địa lý. Nếu bạn không có Internet kết nối bạn sẽ không thể có được tọa độ. Nếu bạn cho tôi biết nó phù hợp với bạn, điều đó có nghĩa là bạn có kết nối Internet hoặc bạn đã có kết nối Internet (tải xuống API vị trí và lưu vào bộ nhớ cache một số thông tin về khu vực xung quanh bạn) hoặc thông tin vị trí đã cũ (và do đó không chính xác).
David Wasser

16

Bằng cách nhận được getLastKnownLocationbạn không thực sự tự bắt đầu sửa chữa.

Cần biết 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 có vị trí trước đó, tôi không nghĩ nó sẽ làm được. Các tài liệu không thực sự quá rõ ràng về điều này.

Theo tài liệu getLastKnownLocation:

Trả về Vị trí cho biết dữ liệu từ lần sửa vị trí đã biết gần đây nhất 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 khởi động trình cung cấp.

Đây là một đoạn mã 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 phải thêm quyền mới vào AndroidManifest.xml

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

Những gì tôi đang suy nghĩ là, Có thể để có được vị trí hiện tại bằng mạng di động
Prabhu M

Bạn cần đọc tài liệu. Tìm hiểu sự khác nhau giữa PASSIVE_PROVIDER, NETWORK_PROVIDERGPS_PROVIDER.
hwrdprkns

1
Mặc dù điều này là lý tưởng, tôi sẽ kiểm tra thời gian của vị trí cuối cùng bằng cách sử dụng getTime (). Sau đó, vấn đề chỉ là quyết định bạn sẽ cho phép điều này bao nhiêu tuổi. Nếu nó quá cũ, sau đó nhận một vị trí mới bằng cách sử dụng bài đăng của tôi.
Ian

1
@Ian Làm cách nào để có được vị trí mới hoặc vị trí mới?
Archie.bpgc

5
Chúng tôi có thể nhận được vị trí nếu gps bị tắt không
Prasad

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;
    }
}

4

Không, bạn hiện không thể xác định vị trí nếu không sử dụng GPS hoặc internet.

Các kỹ thuật định vị dựa trên WiFi, Cellular 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 các ID thiết bị truyền và sau đó gửi các ID này trong một truy vấn thông qua internet tới 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 vị trí đã 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 cơ sở dữ liệu như vậy và luôn cập nhật thông tin này. Đối với việc 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, mộ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, 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 thông qua nhà cung cấp dịch vụ di động, thì bạn có quyền truy cập internet.

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

Sử dụng vị trí đã biết gần đây nhất yêu cầu bạn phải có GPS hoặc truy cập internet gần đây. Nếu bạn vừa có internet, có lẽ bạn có thể điều chỉnh vị trí hoặc cài đặt của mình để có internet trở lại. 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 được bạn.

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

  1. Chụp ảnh 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 biểu đồ sao. Điều này có thể sẽ yêu cầu thiết bị bổ sung để đảm bảo rằng các góc cho ả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ừ một vị trí đã biết. Việc tích lũy lỗi trong kiểu tiếp cận này khiến nó không thực tế đối với hầu hết các tình huống.

3

Tại đây có thể có được vị trí hiện tại của Người dùng mà không cần 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. Bấm vào đây để bạn tham khảo




Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.