2011-12-20 13 views
13

Android 4.0 numaralı telefondan google'dan yeni Wi-Fi Direct API'yi kullanıyorum ve Örnek kodunda Kullanıcıyı Ayarlar'a göndererek WiFi-Doğrudan Modu'nu etkinleştirin.WiFi-Direct'i koddan açabilir miyim? Android API-14'de (ICS)

Kodla başlatmanın bir yolu var mı ???

sundukları tüm niyet WIFI_P2P_STATE_CHANGED_ACTION dinlemek ve sonra bütün yapabileceği WiFi açmak için kullanıcıya bildirmek olduğunu bu kodu

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

o 4.0 çalışıp çalışmadığını biliyorum ama önceki çalışır etmeyin: http: // www .tutorialforandroid.com/2009/10/açmak-off-on-wifi-in-android-using.html – Carlos

cevap

13

Evet, yansımayı kullanarak bir yol var. GSII'mde çalışıyor (ve Wifi Dışı Doğrudan HTC Sensation üzerinde incelikle başarısız oluyor), ancak bu yansıma olduğundan tüm telefonlarda çalışmayabilir.

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

Lütfen dikkat: Yukarıda

Jelly Bean üzerinde

ve eğer WifiP2pManager API WiFi Direct otomatik (sürece WiFi olduğu gibi), bu yüzden hiçbir orada etkindir kullanmaya çalıştığınızda Bu hack kullanmanız gerekir.

+0

Bu WiFi’yi doğrudan JB’de ve yukarıda (en azından AOSP’ta) sürekli aktif olarak eklemek istiyorum. . Doğrudan WiFi için dinleyicilere bakarsanız, bir süre sonra kendini kapatır. Ancak, wifi doğrudan menüyü açarsanız, kendisini tekrar açar. Ev sahibinin bulunabilmesi için bir akran araması yapması veya kendini başlatmak için sahip olmanız gerekebilir. Muhtemelen bir pil tasarrufu hilesi. Ayrıca, bir bağlantıyı kabul ettiğinden, tüm sistemin kilitleneceğini ve bazen bağlanamayacağını engellediğini de buldum. (Sistem daveti) – Mgamerz

+0

Ve bir şey daha ekleyin: Bu kod sadece Wifi açık görünüyorsa görünür. Telefonum (LG Mach 4.0.4) kapalıysa, bir yöntem atar, ancak zaten açıksa güzel çalışır. – Mgamerz

+0

@Mgamerz Wierd, GSII'de, Wifi Açık veya Kapalı olduğunda çalışır (kapalıysa, otomatik olarak açılırsa ancak yöntemin hemen geri dönmesine rağmen, gerçekten çalışmak birkaç saniyenizi alır) –

2

yok kullanmaktır.

+0

Niyeti beklemeden olup olmadığını kontrol etmek için bir yolu var mı? -Örneğin uygulamamı çalıştırmadan önce kullanıcı açılmışsa .... – zaxy78

0

Bazı aygıtlarda, Wi-Fi doğrudan desteklense de, bazı sistem hataları nedeniyle etkin değildir. İşte, Kotlin'i kullanarak etkin olup olmadığını (maalesef kök gerektiriyor) kontrol etmek için daha güvenilir bir yol.

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" 

Bu, Android 4.3 - 8.1 için çalışmalıdır. Aşağıdaki Kontrol kaynak kodu:

İlgili konular