2011-12-20 26 views
13

Tôi đang sử dụng API Wi-Fi Direct mới từ google trên Android 4.0 và trong mã Mẫu, họ gửi Người dùng đến Cài đặt, để kích hoạt Chế độ chuyển hướng WiFi.Tôi có thể bật Wi-Fi trực tiếp từ mã không? trên Android API-14 (ICS)

Có cách nào để Bắt đầu bằng mã ???

tất cả họ cung cấp là để nghe WIFI_P2P_STATE_CHANGED_ACTION ý định, và sau đó sử dụng mã này

String action = intent.getAction(); 

if (WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION.equals(action)) { 

    // UI update to indicate wifi p2p status. 
    int state = intent.getIntExtra(WifiP2pManager.EXTRA_WIFI_STATE, -1); 

    if (state == WifiP2pManager.WIFI_P2P_STATE_ENABLED) { 
     // Wifi Direct mode is enabled 

    } else { 
     // Wifi Direct mode is disabled 
    } 
+1

Không biết nếu nó hoạt động trên 4.0, nhưng hoạt động trên theo thời gian: http: // www .tutorialforandroid.com/2009/10/turn-off-turn-on-wifi-in-android-using.html – Carlos

Trả lời

13

Có cách sử dụng phản chiếu. Hoạt động trên GSII của tôi (và thất bại một cách duyên dáng trên cảm biến HTC Wifi không trực tiếp) nhưng vì điều này phản ánh nó có thể không hoạt động trên tất cả các điện thoại.

p2pManager = (WifiP2pManager) getSystemService(WIFI_P2P_SERVICE); 
channel = p2pManager.initialize(getApplicationContext(), 
     getMainLooper(), null); 

try { 
    Class<?> wifiManager = Class 
      .forName("android.net.wifi.p2p.WifiP2pManager"); 

    Method method = wifiManager 
      .getMethod(
       "enableP2p", 
       new Class[] { android.net.wifi.p2p.WifiP2pManager.Channel.class }); 

    method.invoke(p2pManager, channel); 

} catch (Exception e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 

Xin lưu ý:

On Jelly Bean trở lên, khi bạn cố gắng sử dụng WifiP2pManager API, WiFi-Direct được tự động kích hoạt (miễn là WiFi trên), vì vậy không có cần phải sử dụng hack này.

+0

Tôi muốn thêm WiFi trực tiếp trên JB trở lên (ít nhất là trên AOSP) không hoạt động mọi lúc - nó chỉ xuất hiện . Nếu bạn nhìn vào người nghe cho WiFi trực tiếp, nó sẽ tự tắt sau một thời gian. Nó quay trở lại chính nó nếu bạn mở menu trực tiếp wifi, tuy nhiên. Bạn có thể phải có máy chủ thực hiện tìm kiếm ngang hàng hoặc khởi tạo chính nó để có thể được tìm thấy. Có thể là mẹo tiết kiệm pin. Tôi cũng thấy rằng nó đang chặn, vì nó chấp nhận một kết nối, toàn bộ hệ thống sẽ khóa và không kết nối đôi khi. (Lời mời hệ thống) – Mgamerz

+0

Và thêm một điều nữa: Mã này chỉ hoạt động nếu Wifi đang bật để bắt đầu với nó. Điện thoại của tôi (LG Mach 4.0.4) ném phương pháp không tìm thấy nếu nó tắt, nhưng nó hoạt động đẹp nếu nó đã được bật. – Mgamerz

+0

@Mgamerz Wierd, trên GSII nó hoạt động khi Wifi là Bật hoặc Tắt (nếu tắt nó tự động bật lên nhưng phải mất vài giây để thực sự hoạt động mặc dù phương thức trả về ngay) –

2

Không, tất cả các bạn có thể làm là thông báo cho người dùng để bật Wi-Fi.

+0

Có cách nào để kiểm tra xem nó có bật mà không phải chờ ý định không? ví dụ nếu người dùng bật trước khi chạy ứng dụng của tôi .... – zaxy78

0

Trên một số thiết bị, mặc dù Wi-Fi trực tiếp được hỗ trợ, nhưng nó không được kích hoạt do một số lỗi hệ thống. Đây là một cách đáng tin cậy hơn để kiểm tra xem nó có được kích hoạt hay không (tiếc là nó yêu cầu root) bằng Kotlin.

val matcher = "^mNetworkInfo .* (isA|a)vailable: (true|false)" 
    .toPattern(Pattern.MULTILINE) 
    .matcher(su("dumpsys ${Context.WIFI_P2P_SERVICE}")) 
if (!matcher.find()) return "Root unavailable" 
if (matcher.group(2) != "true") return "Wi-Fi Direct unavailable" 
return "Wi-Fi Direct available" 

Điều này sẽ hoạt động cho Android 4.3 - 8.1. mã kiểm tra nguồn dưới đây:

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