You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android平台Wi-Fi Direct热点创建失败求助(错误码0)

问题:Android Wi-Fi Direct 创建组失败(错误码0)

我是Android平台新手,想要开发一款应用:创建Wi-Fi Direct热点供ESP32-C3微控制器连接,应用仅包含WebView,且能自动获取微控制器的IP地址以建立WebSocket连接接收传感器数据。

在克服IDE搭建的诸多困难后,我成功构建并运行了简易应用,但始终遇到创建组失败的问题,错误码为0(WifiP2pManager.ERROR),据文档描述这是内部错误。我已在Android 12和13的多款设备上测试,结果一致。

我发现相关示例极少,想确认自己是否存在操作失误,以及能否获取更详细的错误信息而非仅通用错误码。由于PdaNet+应用可成功创建Wi-Fi Direct热点,说明该功能可行,恳请帮忙解决此问题。


代码实现

public class MainActivity extends AppCompatActivity implements WifiP2pManager.ChannelListener, WifiP2pManager.ActionListener {
    private final IntentFilter intentFilter = new IntentFilter();
    private TextView tv1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv1 = this.findViewById(R.id.tv1);

        intentFilter.addAction(WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION);
        intentFilter.addAction(WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION);
        intentFilter.addAction(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION);
        intentFilter.addAction(WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION);

        WifiP2pManager manager = (WifiP2pManager) getSystemService(Context.WIFI_P2P_SERVICE);
        WifiP2pManager.Channel channel = manager.initialize(this, getMainLooper(), this);
        manager.createGroup(channel, this);

        BroadcastReceiver receiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                String action = intent.getAction();
                tv1.append("\n" + action);
                if (WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION.equals(action)) {
                    int state = intent.getIntExtra(WifiP2pManager.EXTRA_WIFI_STATE, -1);
                    if (state == WifiP2pManager.WIFI_P2P_STATE_ENABLED) {
                        tv1.append("\nWifi P2P is enabled");
                    } else {
                        tv1.append("\nWifi P2P is disabled");
                    }
                } else if (WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION.equals(action)) {
                    tv1.append("\nCall WifiP2pManager.requestPeers() to get a list of current peers");
                } else if (WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION.equals(action)) {
                    tv1.append("\nRespond to new connection or disconnections");
                } else if (WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION.equals(action)) {
                    tv1.append("\nRespond to this device's wifi state changing");
                }
            }
        };
        registerReceiver(receiver, intentFilter);
    }

    @Override
    public void onSuccess() {
        tv1.append("\nGroup created successfully");
    }

    @Override
    public void onFailure(int reason) {
        tv1.append("\nFailed to create group (reason "+reason+")");
    }

    @Override
    public void onChannelDisconnected() {
        tv1.append("\nonChannelDisconnected");
    }
}

Manifest权限配置

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.NEARBY_WIFI_DEVICES" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

解决建议

1. 等待Wi-Fi P2P状态就绪后再创建组

当前代码在onCreate中直接调用createGroup,但此时Wi-Fi P2P可能未完成初始化。必须等到收到WIFI_P2P_STATE_CHANGED_ACTION且状态为WIFI_P2P_STATE_ENABLED后,再执行创建组操作:

  • 将WifiP2pManager和Channel改为类成员变量;
  • 在广播接收器的WIFI_P2P_STATE_CHANGED_ACTION分支中,当状态为ENABLED时调用manager.createGroup(channel, this)。

2. 主动申请必要权限

Android 12+的NEARBY_WIFI_DEVICES属于危险权限,需主动申请,且搭配ACCESS_FINE_LOCATION权限才能正常使用Wi-Fi Direct。添加权限申请逻辑:

private static final int PERMISSIONS_REQUEST_CODE = 1001;
private String[] requiredPermissions = {
    Manifest.permission.ACCESS_FINE_LOCATION,
    Manifest.permission.NEARBY_WIFI_DEVICES,
    Manifest.permission.CHANGE_WIFI_STATE,
    Manifest.permission.ACCESS_WIFI_STATE
};

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

    // 先申请权限
    if (checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
        || checkSelfPermission(Manifest.permission.NEARBY_WIFI_DEVICES) != PackageManager.PERMISSION_GRANTED) {
        requestPermissions(requiredPermissions, PERMISSIONS_REQUEST_CODE);
    } else {
        initWifiP2p();
    }

    // 注册广播接收器...
}

private void initWifiP2p() {
    // 初始化intentFilter和Wi-Fi P2P相关逻辑,不直接调用createGroup
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode == PERMISSIONS_REQUEST_CODE) {
        boolean allGranted = true;
        for (int result : grantResults) {
            if (result != PackageManager.PERMISSION_GRANTED) {
                allGranted = false;
                break;
            }
        }
        if (allGranted) {
            initWifiP2p();
        } else {
            tv1.append("\n需要授予必要权限才能使用Wi-Fi Direct");
        }
    }
}

3. 关闭普通Wi-Fi热点避免冲突

若设备当前开启了普通Wi-Fi热点,会导致Wi-Fi Direct组创建失败。可在创建组前检查并关闭:

WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
if (wifiManager.isWifiApEnabled()) {
    wifiManager.setWifiApEnabled(null, false);
}

注意此操作需要CHANGE_WIFI_STATE权限,部分厂商ROM可能限制该操作。

4. 获取详细错误日志

通过Logcat过滤WifiP2pService或WifiDirect相关日志,可查看系统层面的错误原因,比如权限不足、硬件限制、状态冲突等。

5. 适配厂商差异

部分Android设备的Wi-Fi Direct实现存在厂商定制差异,可尝试在不同品牌设备上测试,或查看厂商开发者文档的特殊要求。

内容的提问来源于stack exchange,提问作者ffk27

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 19:01:28