2011-02-05 50 views
17

Tôi muốn chọn một LocationProvider được bật trong Android. Mục tiêu xây dựng dự án là Android 2.1.LocationManager: nhà cung cấp "mạng" có luôn được bật không?

Đây là những gì tôi làm trong onCreate().

// ... 
LocationManager locationMgr = (LocationManager) 
getSystemService(Context.LOCATION_SERVICE); 

Criteria criteria = new Criteria(); 
criteria.setAccuracy(Criteria.NO_REQUIREMENT); 
criteria.setPowerRequirement(Criteria.NO_REQUIREMENT); 
criteria.setCostAllowed(false);  

String bestProvider = locationMgr.getBestProvider(criteria, true); 

Toast.makeText(getApplicationContext(), "Provider = " + bestProvider + " enabled= " + locationMgr.isProviderEnabled(bestProvider), Toast.LENGTH_LONG).show(); 
// ... 

Bây giờ, tôi tắt mỗi giao diện mạng và đặt chế độ trên thiết bị của mình (HTC Desire, Android 2.2). Tôi ngắt kết nối thiết bị khỏi USB. Rõ ràng là không có nhà cung cấp nào có thể cung cấp dữ liệu vị trí cho thiết bị. Tôi đặc biệt yêu cầu getBestProvider chỉ dành cho nhà cung cấp được bật, vì vậy tôi hy vọng nó trả về null hoặc một chuỗi trống trong trường hợp đó. Tôi mong đợi isProviderEnabled để trả về false.

Kết quả thực tế là getBestProvider Thu nhập "mạng" và isProviderEnabled báo cáo nó được "kích hoạt". Có phải "mạng" luôn "bật" ngay cả khi nó không?

+0

Điều này cũng có thể do vị trí mạng trong bộ nhớ cache của Android gây ra, vì nó không thể thay đổi sớm do độ chi tiết thô. Đó chỉ là một đoán mặc dù. –

Trả lời

21

Sau khi một số digging tôi có thể trả lời câu hỏi của riêng tôi. Đầu tiên tôi đã cố gắng chế độ máy bay với:

ConnectivityManager connectivityMgr = (ConnectivityManager) 
getSystemService(Context.CONNECTIVITY_SERVICE); 

NetworkInfo[] nwInfos = connectivityMgr.getAllNetworkInfo(); 
for (NetworkInfo nwInfo : nwInfos) { 
    Log.d(TAG, "Network Type Name: " + nwInfo.getTypeName()); 
    Log.d(TAG, "Network available: " + nwInfo.isAvailable()); 
    Log.d(TAG, "Network c_or-c: " + nwInfo.isConnectedOrConnecting()); 
    Log.d(TAG, "Network connected: " + nwInfo.isConnected()); 
} 

Các ConnectivityManager báo cáo một cách chính xác "false" vì không có kết nối. Điều này rất hữu ích để kiểm tra xem bạn có thực sự có mạng hay không và do đó nhà cung cấp vị trí dựa trên mạng có sẵn. Sau đó, tôi đã xem lại lần thứ hai về cài đặt thiết bị của mình. Và đây là câu trả lời:

locationMgr.isProviderEnabled(LocationManager.NETWORK_PROVIDER) 

báo cáo nếu người dùng đã kiểm tra các thiết lập thiết bị (trong trường hợp của tôi dưới Location - Vị trí của tôi). Nếu bạn bỏ chọn tất cả các nhà cung cấp, nó sẽ trả lại null như mong đợi. Nó thực sự là tài liệu trong isProviderEnabled() nhưng tôi phải có bỏ qua nó. Trường hợp đóng cửa.

+1

Cảm ơn bạn đã theo dõi! –

+0

'isProviderEnabled()' sẽ trả về false trong ví dụ này, phải không? Bạn không thể có một phương thức với kiểu trả về nguyên thủy trả về null. Có lẽ bạn có nghĩa là 'getBestProvider()'? –

+0

Bạn đã bao giờ tìm ra giải pháp cho vấn đề này chưa? Trên điện thoại Galaxy S IV của tôi trong cài đặt, tôi đã đặt 'Quyền' -> 'Dịch vụ định vị' -> 'Sử dụng mạng không dây' là TRUE. Tuy nhiên, nếu tôi tắt mọi thứ (tắt GPS, WiFi và radio di động, đồng thời bật chế độ trên máy bay), thì 'isProviderEnabled (LocationManager.NETWORK_PROVIDER)' vẫn trả về TRUE. – stackoverflowuser2010

1

Hãy thử điều này

public static boolean isLocationSensingAvailable() 
{ 
    boolean hasActiveLocationProvider = false; 
    List<String> providers = locationManager.getProviders(true); 
    for (String providerName:providers) 
    { 
     if (providerName.equals(LocationManager.GPS_PROVIDER)) 
     { 
      hasActiveLocationProvider = isLocationProviderEnabled(providerName); 
     } 
     if (providerName.equals(LocationManager.NETWORK_PROVIDER)) 
     { 
      hasActiveLocationProvider = (SpondleApplication.isOnline() && isLocationProviderEnabled(providerName)); 
     } 
    } 
    return hasActiveLocationProvider; 
} 
+0

Cảm ơn bạn đã phản hồi nhanh Ollie. Tôi nên nói thêm rằng tôi biết cách làm việc xung quanh tình hình. Tôi quan tâm để có được câu trả lời nếu kết quả của ** getBestProvider ** và ** isLocationProviderEnabled ** luôn giống như tôi đã mô tả, tức là nếu "mạng" luôn được báo cáo là "đã bật" ngay cả khi không được. –

1

Bạn luôn nhận được câu trả lời đúng vì bạn đã chọn tùy chọn "Sử dụng mạng" trong menu cài đặt. Tôi cũng đã có vấn đề này cho đến khi tôi tìm thấy điều này. Tôi hy vọng bạn thấy nó hữu dụng.

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