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

如何用Java编写Android应用扫描局域网IP查找带Web应用的设备?

局域网设备扫描+WebView集成Android应用完整方案

一、Android Studio基础操作

  • 下载安装Android Studio,新建Empty Views Activity项目,命名为DeviceScanner,语言选择Java,SDK最低选Android 8.0(API 26)。
  • 等待项目同步完成,核心文件位置:
    • Java代码:app/src/main/java/[包名]/MainActivity.java
    • 布局文件:app/src/main/res/layout/activity_main.xml
    • 权限配置:app/src/main/AndroidManifest.xml

二、配置权限

打开AndroidManifest.xml,在<manifest>标签内、<application>标签外添加权限:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- Android 10+ 需添加后台网络权限 -->
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />

同时在<application>标签内添加HTTP明文访问许可:

<application
    ...
    android:usesCleartextTraffic="true">

三、核心扫描逻辑

1. 获取当前WiFi网段

在MainActivity.java中添加方法,提取手机连接的WiFi网段前缀:

private String getLocalWifiSubnet() {
    WifiManager wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
    WifiInfo wifiInfo = wifiManager.getConnectionInfo();
    int ipAddress = wifiInfo.getIpAddress();
    return String.format("%d.%d.%d.", 
        (ipAddress & 0xff), 
        (ipAddress >> 8 & 0xff), 
        (ipAddress >> 16 & 0xff));
}

2. 多线程扫描目标设备

用线程池并行扫描网段内IP,检测http://[IP]:4600/wui是否可访问:

private void scanDevice() {
    String subnet = getLocalWifiSubnet();
    ExecutorService executor = Executors.newFixedThreadPool(10); // 同时扫描10个IP,平衡速度与性能
    for (int i = 1; i <= 254; i++) {
        final int finalI = i;
        executor.execute(() -> {
            String ip = subnet + finalI;
            String targetUrl = "http://" + ip + ":4600/wui";
            try {
                URL url = new URL(targetUrl);
                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                conn.setConnectTimeout(1000);
                conn.setReadTimeout(1000);
                if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
                    // 找到设备后切回主线程更新UI,停止所有扫描线程
                    runOnUiThread(() -> {
                        loadDevicePage(targetUrl);
                        executor.shutdownNow();
                    });
                }
                conn.disconnect();
            } catch (IOException ignored) {
                // 连接失败,跳过该IP
            }
        });
    }
}

四、WebView集成与界面布局

1. 修改布局文件activity_main.xml

替换默认布局为扫描按钮+WebView:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <Button
        android:id="@+id/scanBtn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="扫描设备" />

    <WebView
        android:id="@+id/webView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:visibility="gone" />
</LinearLayout>

2. 初始化WebView与按钮逻辑

在MainActivity.java的onCreate方法中添加初始化代码,处理权限申请与扫描触发:

public class MainActivity extends AppCompatActivity {
    private WebView webView;
    private Button scanBtn;

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

        webView = findViewById(R.id.webView);
        scanBtn = findViewById(R.id.scanBtn);

        // 配置WebView支持JavaScript(按需开启)
        WebSettings webSettings = webView.getSettings();
        webSettings.setJavaScriptEnabled(true);
        webSettings.setDomStorageEnabled(true);

        // 扫描按钮点击事件
        scanBtn.setOnClickListener(v -> {
            // Android 6.0+ 动态申请权限
            if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_WIFI_STATE) != PackageManager.PERMISSION_GRANTED
                    || ContextCompat.checkSelfPermission(this, Manifest.permission.INTERNET) != PackageManager.PERMISSION_GRANTED) {
                ActivityCompat.requestPermissions(this,
                        new String[]{Manifest.permission.ACCESS_WIFI_STATE, Manifest.permission.INTERNET},
                        100);
            } else {
                scanDevice();
            }
        });
    }

    // 权限申请回调
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == 100) {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                scanDevice();
            } else {
                Toast.makeText(this, "需要权限才能扫描设备", Toast.LENGTH_SHORT).show();
            }
        }
    }

    // 加载设备Web页面
    private void loadDevicePage(String url) {
        scanBtn.setVisibility(View.GONE);
        webView.setVisibility(View.VISIBLE);
        webView.loadUrl(url);
        // 拦截链接跳转,在WebView内打开
        webView.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
                view.loadUrl(request.getUrl().toString());
                return true;
            }
        });
    }

    // 前面的getLocalWifiSubnet()和scanDevice()方法放在此处
}

五、测试与优化

  • 确保手机与目标设备连接同一WiFi网络,点击“扫描设备”按钮等待结果
  • 可添加ProgressBar显示扫描进度,或增加手动输入网段的功能适配非192.168.1.X的场景

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 12:54:20