2013-07-05 58 views
1

我在的Android就是一個完整的小白的Java,我已經與C++和一個小C#的工作。 我試圖創建一個簡單的Android應用程序,它連接到一個無線網絡網絡。問題在於在addNetwork()函數中崩潰。WiFi的連接應用程序崩潰(Java和Android)

import android.net.ConnectivityManager; 
import android.net.wifi.WifiConfiguration; 
import android.net.wifi.WifiManager; 
import android.os.Bundle; 
import android.app.Activity; 
import android.content.Context; 
import android.view.Menu; 
import android.view.View; 
import android.widget.Button; 

public class MainActivity extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     final WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE); 
     final WifiConfiguration wc = new WifiConfiguration();   
     String networkSSID = "********"; 
     String networkPass = "*******";  
     wc.SSID = "\"" + networkSSID + "\""; 
     wc.preSharedKey = "\""+ networkPass +"\""; 
     wc.hiddenSSID = true; 
     wc.status = WifiConfiguration.Status.ENABLED; 
     wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP); 
     wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP); 
     wc.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK); 
     wc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP); 
     wc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP); 
     wc.allowedProtocols.set(WifiConfiguration.Protocol.RSN); 
     int res = wifi.addNetwork(wc); 
     wifi.enableNetwork(res, true); 
     wifi.setWifiEnabled(true); 
     ConnectivityManager connec = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE); 

    } 
    } 

我正在使用的Eclipse項目與目標2.3.3版本的Android(我的手機是2.3.6)。我必須在這裏包含除導入之外的其他文件(MainActivity.java)嗎?

編輯:回答此問題this答案。 對我的其他問題的回答()我的網絡列表中添加了相應的SSID,但當我101%確定它是'不在範圍內'時,因爲那是我的路由器!你知道什麼可能會消失嗎?錯誤的?)和完整的如何爲WiFi連接here

回答

2

你是否聲明瞭使用ACCESS_WIFI_STATE的權限在AndroidMainfest.xml 這是你的Android項目的根目錄。

只要打開這一點,並把它應用標籤的上方或下方

這樣

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> 
+0

我對Manifest一無所知,我無法在項目中找到它的代碼。 – Bonnev

+0

你走了,我編輯了答案,更詳細地解釋它。 –

+0

謝謝!我找到了它,並將該行標記在標記的正上方,但結果相同,該應用在其打開期間崩潰 – Bonnev

1

請參考這個答案的詳細信息,我得到這個從here

的WEP提取網絡你需要這樣做:

ws.wepKeys[0] = "\"" + networkPass + "\""; 
ws.wepTxKeyIndex = 0; 
ws.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE); 
ws.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40); 

對於WPA網絡,你需要添加密碼是這樣的:

ws.preSharedKey = "\""+ networkPass +"\""; 

對於開放式的網絡,你需要做到這一點:

ws.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE); 

然後,你需要將它添加到Android的WiFi管理設置:

WifiManager wifiManager = (WifiManager)context.getSystemService(Context.WIFI_SERVICE); 
wifiManager.addNetwork(conf); 

如果需要,你可以添加該啓用的WiFi本身(如果它已經是,狀態不會改變):

wifiManager.setWifiEnabled(true); 

最後,你可能需要啓用它,因此Android conntects它:

List<WifiConfiguration> list = wifiManager.getConfiguredNetworks(); 
for(WifiConfiguration i : list) { 
    if(i.SSID != null && i.SSID.equals("\"" + networkSSID + "\"")) { 
     wifiManager.disconnect(); 
     wifiManager.enableNetwork(i.networkId, true); 
     wifiManager.reconnect();    

     break; 
    }   
} 

UPD:在WEP的情況下,如果你的密碼是十六進制,你並不需要將其包圍引號。

+0

當我運行該程序時得到了即時連接。感謝您的時間和幫助。 – Bonnev

+0

不客氣。請將您的最終評論解釋爲「問題」下面的「第二個問題」和「編輯」標記,以便將來參考人員不會對正確答案有任何疑問。 –