如何用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
- Java代码:
二、配置权限
打开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
相关产品推荐
相关产品推荐

