Android Studio 代码实现手机连接 WiFi 热点并进行 TCP 通信

本代码示例使用 Android Studio 实现手机连接 WiFi 热点并进行 TCP 通信,按下按钮向 WiFi 热点发送 'a',并展示连接、通信和数据发送的具体流程。

1. 添加权限

由于涉及到连接 WiFi 和 TCP 通信,需要在 AndroidManifest.xml 文件中添加以下权限:

<uses-permission android:name='android.permission.ACCESS_WIFI_STATE' />
<uses-permission android:name='android.permission.CHANGE_WIFI_STATE' />
<uses-permission android:name='android.permission.INTERNET' />

2. 代码实现

MainActivity.java 文件中添加以下代码:

import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiManager;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

public class MainActivity extends AppCompatActivity {

    private WifiManager wifiManager;
    private ConnectivityManager connectivityManager;
    private Button sendButton;
    private String ssid = 'WiFi热点名称';
    private String password = 'WiFi热点密码';
    private String ipAddress = 'WiFi热点IP地址';
    private int port = 8888;

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

        wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
        connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);

        sendButton = findViewById(R.id.send_button);
        sendButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (isConnectedToWifi()) {
                    new SendDataTask().execute('a');
                } else {
                    Toast.makeText(MainActivity.this, '请连接WiFi热点', Toast.LENGTH_SHORT).show();
                }
            }
        });
    }

    private boolean isConnectedToWifi() {
        NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
        if (networkInfo != null && networkInfo.getType() == ConnectivityManager.TYPE_WIFI) {
            return true;
        }
        return false;
    }

    private boolean connectToWifi() {
        WifiConfiguration wifiConfiguration = new WifiConfiguration();
        wifiConfiguration.SSID = ''' + ssid + ''';
        wifiConfiguration.preSharedKey = ''' + password + ''';

        int netId = wifiManager.addNetwork(wifiConfiguration);
        wifiManager.disconnect();
        wifiManager.enableNetwork(netId, true);
        wifiManager.reconnect();

        int tryCount = 0;
        while (!isConnectedToWifi()) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            tryCount++;
            if (tryCount > 10) {
                return false;
            }
        }
        return true;
    }

    private class SendDataTask extends AsyncTask<String, Void, String> {

        @Override
        protected String doInBackground(String... params) {
            try {
                if (!isConnectedToWifi()) {
                    if (!connectToWifi()) {
                        return null;
                    }
                }

                Socket socket = new Socket(ipAddress, port);
                PrintWriter out = new PrintWriter(socket.getOutputStream());
                BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

                out.write(params[0]);
                out.flush();

                String result = in.readLine();

                out.close();
                in.close();
                socket.close();

                return result;
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(String result) {
            if (result != null) {
                Toast.makeText(MainActivity.this, '成功发送:' + result, Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(MainActivity.this, '发送失败', Toast.LENGTH_SHORT).show();
            }
        }
    }
}

代码说明:

  • connectToWifi() 方法用于连接 WiFi 热点。
  • isConnectedToWifi() 方法用于判断是否已连接到 WiFi 热点。
  • SendDataTask 是一个异步任务,用于在后台线程中发送数据并接收响应。
  • 在按钮点击事件中,先判断是否已连接到 WiFi 热点,如果未连接则尝试连接,然后执行 SendDataTask 任务发送数据。
  • 在异步任务的 doInBackground() 方法中,先判断是否已连接到 WiFi 热点,如果未连接则返回 null,否则建立 socket 连接并发送数据。发送完成后关闭连接,然后在 onPostExecute() 方法中根据响应结果显示 Toast 提示。

注意:

  • 请将代码中的 WiFi热点名称WiFi热点密码WiFi热点IP地址 替换为实际的热点信息。
  • 确保手机已开启 WiFi 并处于可连接状态。
  • 本代码示例仅供参考,实际使用中可能需要根据具体需求进行修改。
Android Studio 代码实现手机连接 WiFi 热点并进行 TCP 通信

原文地址: https://www.cveoy.top/t/topic/nKUf 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录