2013-07-15 37 views
6

tôi sẽ đánh giá cao sự giúp đỡ của bạn, nếu có ai có thể giúp tôi. tôi cần có trình theo dõi vị trí chính xác trong ứng dụng của mình và tôi muốn nó hoạt động như thế này. nó tìm thấy vị trí đầu tiên của người có mạng, trong khi đó tôi bắt đầu yêu cầu bản địa hóa GPS. khi gps cho tôi một vị trí, tôi không muốn nghe nữa đến các vị trí mạng. Sau đó tôi muốn yêu cầu một vị trí từ mạng và chỉ khi Gps không cố định (không thể cho tôi một vị trí). Khi Gps được cố định một lần nữa tôi muốn ngừng nghe mạng, và đây là vòng lặp tôi muốn thực hiện kể từ khi GPS là acurate hơn và tôi muốn có nội địa hóa mạng như một bản sao lưu. Tôi đã xem bài này, nhưng tôi không thể hiểu nổi làm thế nào để thích ứng với nhu cầu của tôi,nhà cung cấp mạng và vị trí GPS có thể hoán đổi cho nhau theo trạng thái gps android

How can I check the current status of the GPS receiver?

Ý tưởng là cần thiết, cảm ơn bạn trước Stackoverflow Comunity.

Trả lời

1

1. Dừng nghe bản cập nhật vị trí mạng: Rất đơn giản để làm như vậy. Đơn giản chỉ cần gọi

your_loc_manager.removeUpdates(network_location_listener); 

2. Bắt Location từ nhà cung cấp mạng nếu Nhà cung cấp GPS không đưa ra bất kỳ sửa chữa Bạn có thể thử một cái gì đó giống như đưa ra dưới đây (thay vì hẹn giờ bạn có thể thử sử dụng GpsStatus Listener ...)

bên trong phương pháp để nhận thông tin cập nhật nhà cung cấp mạng

boolean network_enabled ; 
try { 
    network_enabled = locManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER); 
} catch(Exception ex) { 
    ex.printStackTrace(); 
} 

if(!network_enabled) 
    return; 

locManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 100, networkLocationListener); 

return; 

bên trong phương pháp để nhận Địa điểm GPS

01.235.
boolean gps_enabled; 
try { 
    gps_enabled = locManager.isProviderEnabled(LocationManager.GPS_PROVIDER); 
} catch(Exception ex) { 
    ex.printStackTrace(); 
} 

if(!gps_enabled) { 
    // call your method for getting network location updates 
    return; 
} 

locManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 50, locationListenerGps); 
new Timer().schedule(new TimerTask() { 

    @Override 
    public void run() { 
     // You should call your method of getting Network locations based on some 
     // condition which would tell whether you really need to ask for network location 

    } 
}, 20000 /* Time Value after which you want to stop trying for GPS and switch to Network*/); 

EDIT 1:

Cũng "Tôi không cần phải biết khi nào để có được thông tin cập nhật từ GPS, tôi cần phải biết khi nào để có được thông tin cập nhật từ mạng (i có nghĩa là tôi cần phải biết khi nào gps là tìm kiếm, không phải khi nó được sửa). và làm thế nào để kiểm soát năng hoán đổi giữa mạng và GPS"

... Nếu việc sửa chữa đã bị mất sau đó duy nhất mà bạn cần phải tìm kiếm các cập nhật mạng vì vậy tôi đã đề nghị gọi

if (hasGPSFix) { 
    Log.i("GPS","Fix Lost (expired)"); 
    lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 2000, 10, locationListener); 
    lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 2000, 10, locationListener); //===> new line which I am suggesting 
} 
hasGPSFix = false; 

Bằng cách này, bạn Một khi sửa chữa GPS đạt được hasGPSFix sẽ thay đổi giá trị của nó và mã hiện tại trong liên kết nói sẽ ngừng tìm kiếm các bản cập nhật mạng. Ít nhất đây là những gì tôi có thể hiểu được mà bạn muốn đạt được. Có thể tôi chưa hiểu bạn hoàn toàn.

EDIT 2: Đây là lớp học của tôi để xử lý cả GPS và các nhà cung cấp NETWORK

Các mapActivity hoặc bất cứ nơi nào bạn cần để có được thông tin cập nhật vị trí, bạn cần phải tạo ra một thể hiện của lớp MyLocation này. Ngoài ra, để tiếp tục nhận các cập nhật vị trí, bạn cần triển khai LocationResult trong hoạt động gọi điện của mình. public abstract void gotLocation(Location location, boolean isGpsData); sẽ cho bạn biết liệu bản cập nhật bạn vừa nhận được từ mạng hay GPS. Ngoài ra, trong trường hợp dữ liệu được trả về từ GPS, nó sẽ tự động đóng trình nghe netowrk. Bạn sẽ cần phải gọi phương thức getFineLocation() nếu bạn muốn dữ liệu từ GPS, v.v.Bạn sẽ cần phải tăng cường mã cho mục đích của bạn (như bạn cần tăng cường phương thức closeListeners() để chỉ đóng một nhà cung cấp khi bạn chỉ muốn loại bỏ các bản cập nhật mạng, v.v.), nhưng nó cho phép thực hiện cơ bản những gì bạn muốn (cùng với việc thực hiện GpsStatus.Listener, tất nhiên, vì vậy cả hai kết hợp sẽ phục vụ mục đích của bạn tốt).

public class MyLocation { 
    LocationManager locManager; 
    LocationResult locationResult; 
    boolean gps_enabled = false; 
    boolean network_enabled = false; 

    public boolean getCoarseLocation(Context context, LocationResult result) { 
    locationResult = result; 
    if(locManager == null) 
     locManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE); 

    try { 
     network_enabled = locManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER); 
    } catch(Exception ex) { 
     ex.printStackTrace(); 
    } 

    if(!network_enabled) 
     return false; 

    locManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 100, networkLocationListener); 
    return true; 
    } 

    public boolean getFineLocation(Context context, LocationResult result) { 
    locationResult = result; 
    if(locManager == null) 
     locManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE); 

    try { 
     gps_enabled = locManager.isProviderEnabled(LocationManager.GPS_PROVIDER); 
    } catch(Exception ex) { 

    } 

    if(!gps_enabled) 
     return false;//No way to get location data 

    locManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 100, locationListenerGps); 
    return true; 
    } 

    LocationListener locationListenerGps = new LocationListener() { 
    public void onLocationChanged(Location location) { 
     locationResult.gotLocation(location,true); 
     locManager.removeUpdates(networkLocationListener); 
    } 
    public void onProviderDisabled(String provider) {} 
    public void onProviderEnabled(String provider) {} 
    public void onStatusChanged(String provider, int status, Bundle extras) {} 
    }; 

    LocationListener networkLocationListener = new LocationListener() { 
    public void onLocationChanged(Location location) { 
     locationResult.gotLocation(location,false); 
    } 
    public void onProviderDisabled(String provider) {} 
    public void onProviderEnabled(String provider) {} 
    public void onStatusChanged(String provider, int status, Bundle extras) {} 
    }; 

    public void closeListeners() { 
    if(locManager == null) 
     return; 

    if(locationListenerGps != null) 
     locManager.removeUpdates(locationListenerGps); 
    if(networkLocationListener != null) 
     locManager.removeUpdates(networkLocationListener); 
    } 

    public static abstract class LocationResult { 
    public abstract void gotLocation(Location location, boolean isGpsData); 
    } 

    public static boolean hasNetworkProvider(Context mContext) { 
    List<String> myProvidersList = ((LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE)).getProviders(false); 
    return myProvidersList.contains("network"); 
    } 

    public static boolean hasGPSProvider(Context mContext) { 
    List<String> myProvidersList = ((LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE)).getProviders(false); 
    return myProvidersList.contains("gps"); 
    } 
} 
+0

// Bạn nên gọi phương thức nhận địa điểm Mạng dựa trên một số điều kiện // cho biết bạn thực sự cần hỏi vị trí mạng hay không. Nhận xét của tôi: đây là vấn đề của tôi, tôi không thể tìm ra cách để tạo điều kiện đó, điều kiện là nếu gps cố định hay không. mater của GPS được kích hoạt hay không không phải là vấn đề, vấn đề là hiểu được nếu gps có thể đáp ứng hoặc là nó tìm kiếm vệ tinh (đó là những gì tôi có nghĩa là cố định hoặc tìm kiếm) –

+0

Sau đó, tôi nghĩ bạn nên xem xét [câu trả lời] này (http://stackoverflow.com/a/6782146/430480). Nó là khá nhiều làm những gì bạn muốn làm. Phần mà anh ta đang làm việc này 'if (hasGPSFix) { Log.i (" GPS "," Khắc phục sự cố mất (hết hạn) "); lm.requestLocationUpdates (LocationManager.GPS_PROVIDER, 2000, 10, locationListener); } cóGPSFix = false; 'ở đây bạn nên yêu cầu cả bản cập nhật GPS và mạng. Điều đó nên làm điều đó như xử lý có liên quan đã có vẻ là có khi GPS Fix đã được mua lại một lần nữa – Rajeev

+0

câu trả lời này không hợp lệ từ những gì tôi đã thử vì ông sử dụng một phương pháp Global.getInstance(). CurrentGPSLocation là một phương pháp không hợp lệ, doesn ' t tồn tại trong lớp Global từ những gì tôi thấy. Một điều khác là tôi không cần phải biết khi nào để có được cập nhật từ GPS, tôi cần phải biết khi nào để có được thông tin cập nhật từ mạng (tôi có nghĩa là tôi cần phải biết khi gps được tìm kiếm, không phải khi nó được cố định). và cách kiểm soát khả năng thay thế giữa mạng và GPS. –

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