如何将安卓手机连接到adhoc wifi网络?

67

我是Android系统的新手。 这是否正确,Android 2.2.1仅能检测非ad hoc无线网络? 我想知道是否有办法将我的Android连接到从笔记本电脑建立的ad hoc网络。


7
如果这与编程无关,那么它可能属于这里 - Reno
5个回答

43

你说得对,目前Android尚不支持这个功能,但自从Android正式发布以来,谷歌一直在表示将会推出该功能。

虽然不是原生支持,但迄今为止发布的每个Android设备上的硬件都支持它。它只是在软件中被禁用了,您需要启用它才能使用这些功能。

然而,实现这一点相当容易,但您需要获取root权限,而且具体细节可能在不同的设备中略有不同。获取更多信息的最佳来源是XDA开发者社区:http://forum.xda-developers.com/forumdisplay.php?f=564。 大多数现有的解决方案都基于替换wpa_supplicant,并且如果可能的话,这也是我推荐的方法。有关更多详细信息,请参见http://szym.net/2010/12/adhoc-wifi-in-android/

更新:几年过去了,每当我需要在手机上建立一个adhoc网络连接时,我会使用CyanogenMod。它可以给您程序化和脚本化访问这些功能的能力,并且可以在WiFi设置菜单中创建adhoc(ibss)网络。


19
如果你想使用临时的无线网络,那么 Andy的答案 似乎是你唯一的选择。但是,如果你只是想通过任何必要的方式共享笔记本电脑的互联网连接,以便使用Wi-Fi,则至少还有两个选项:
  1. 使用你的笔记本电脑作为路由器,使用 Virtual RouterConnectify 创建 WiFi 热点。这里可以找到一组不错的说明 here.
  2. 使用 Wi-fi Direct 协议创建任何支持它的设备之间的直接连接,尽管 Android 设备的支持受到限制*,并且在 Windows 上,该功能似乎仅在 Windows 8 上可用。

*一些具有 Android 2.3 的手机具有专有的操作系统扩展名,可启用 Wi-Fi Direct (大多数较新的三星手机),但 Android 4 应完全支持此功能 (source)。


1
+1 for VirtualRouter,真的是一个非常有用的工具,而且还是开源的。 - aL3891
1
+1 给 VirtualRouter。为这个问题苦恼了好几天,但这个方法完美解决了。 - Aelexe
1
VirtualRouter 是一个非常好的解决方案。它是开源的,没有广告驱动,也不会跟踪流量。安装和修复我的问题不到两分钟时间。我一定会给这个答案点赞的。 - C0M37

7
如果您的可用网络适配器中有Microsoft Virtual WiFi Miniport Adapter,则可以执行以下操作:
  • 以管理员身份运行Windows命令处理程序(cmd)
  • 输入:netsh wlan set hostednetwork mode=allow ssid=NAME key=PASSWORD
  • 然后输入:netsh wlan start hostednetwork
  • 打开“控制面板\网络和Internet\网络连接”
  • 右键单击您的活动网络适配器(用于连接互联网的适配器),然后单击“属性”
  • 然后打开共享选项卡
  • 勾选“允许其他网络用户连接...”并选择您的WiFi Miniport适配器
  • 完成后,输入:netsh wlan stop hostednetwork

就是这样!

来源:如何在没有软件的情况下将Android手机连接到自组网络。


6
我注意到一个有趣的地方:在我使用的2.3.4手机中,我无法在“设置 > 无线和网络”菜单中看到AP/AdHoc SSIDs。然而,在运行Android 4.0.3的Acer A500上,我能看到它们,前面有(*)标记。
但是,在下面这段代码中,我从某个来源中(不好意思,我忘记了)改编过来,我在我的2.3.4手机上看到Ad Hoc出现在Wifi扫描中。我仍在寻找连接并创建套接字+输入/输出流的方法。但是,这是结果:
    public class MainActivity extends Activity {

private static final String CHIPKIT_BSSID = "E2:14:9F:18:40:1C";
private static final int CHIPKIT_WIFI_PRIORITY = 1;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    final Button btnDoSomething = (Button) findViewById(R.id.btnDoSomething);
    final Button btnNewScan = (Button) findViewById(R.id.btnNewScan);
    final TextView textWifiManager = (TextView) findViewById(R.id.WifiManager);
    final TextView textWifiInfo = (TextView) findViewById(R.id.WifiInfo);
    final TextView textIp = (TextView) findViewById(R.id.Ip);

    final WifiManager myWifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
    final WifiInfo myWifiInfo = myWifiManager.getConnectionInfo();

    WifiConfiguration wifiConfiguration = new WifiConfiguration();
    wifiConfiguration.BSSID = CHIPKIT_BSSID;
    wifiConfiguration.priority = CHIPKIT_WIFI_PRIORITY;
    wifiConfiguration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
    wifiConfiguration.allowedKeyManagement.set(KeyMgmt.NONE);
    wifiConfiguration.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
    wifiConfiguration.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);
    wifiConfiguration.status = WifiConfiguration.Status.ENABLED;

    myWifiManager.setWifiEnabled(true);

    int netID = myWifiManager.addNetwork(wifiConfiguration);

    myWifiManager.enableNetwork(netID, true);

    textWifiInfo.setText("SSID: " + myWifiInfo.getSSID() + '\n' 
            + myWifiManager.getWifiState() + "\n\n");

    btnDoSomething.setOnClickListener(new View.OnClickListener() {          
        public void onClick(View v) {
            clearTextViews(textWifiManager, textIp);                
        }           
    });

    btnNewScan.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            getNewScan(myWifiManager, textWifiManager, textIp);
        }
    });     
}

private void clearTextViews(TextView...tv) {
    for(int i = 0; i<tv.length; i++){
        tv[i].setText("");
    }       
}

public void getNewScan(WifiManager wm, TextView...textViews) {
    wm.startScan();

    List<ScanResult> scanResult = wm.getScanResults();

    String scan = "";

    for (int i = 0; i < scanResult.size(); i++) {
        scan += (scanResult.get(i).toString() + "\n\n");
    }

    textViews[0].setText(scan);
    textViews[1].setText(wm.toString());
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

不要忘记在Eclipse中使用Ctrl+Shift+[字母O]来填充缺失的导入...

以及我的清单:

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.digilent.simpleclient"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="15" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>

<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name=".MainActivity"
        android:label="@string/title_activity_main" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

希望这有所帮助!

你能够连接到adhoc网络吗?使用你的代码,我能够获取adhoc网络的SSID。 - Ratan
嗨,你能连接那个adhoc网络并在上面传输一些东西吗? - Sandip Armal Patil
@Ratan和Sandip,我已经实现了双向通信。虽然我不确定我使用了多少上面的代码。 - Chris

1
你说得没错,但请注意你也可以反过来做 - 使用 Android Wifi 共享网络功能将手机设置为基站,然后从笔记本电脑连接到该基站。

你只能在一些手机上这样做(没有 root 的情况下)。 - diedthreetimes
1
我能用这种方法共享电脑上的网络吗? - Imon
1
@Imon 不是的。它是用来将手机的3G连接分享给电脑的。 - gby
我认为无论通过哪种方式建立wifi连接,您都可以共享PC的IP上行链路。 您只需要在PC上设置路由,包括NAPT,并将PC的IP地址设置为手机的默认网关即可。 - Szocske

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接