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

Android中java.net.DatagramSocket报EPERM错误,索尼相机连接受阻

解决索尼相机SSDP连接时的java.net.DatagramSocket EPERM权限错误

你在通过SSDP协议发现索尼相机时遇到的权限问题,在Android开发中属于多播网络操作的常见坑,我来一步步帮你排查解决:

1. 补全Manifest里的必要权限

首先确保你的AndroidManifest.xml添加了所有网络相关权限,尤其是多播操作的关键权限:

<!-- 基础网络访问权限 -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!-- 核心:多播数据包收发必须的权限 -->
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />

2. 获取Wi-Fi多播锁(解决EPERM的关键)

Android系统默认会限制应用接收多播数据包,所以你必须在发送SSDP请求前主动获取MulticastLock,否则会直接触发权限拒绝错误。在你的SSDP发送代码前添加这段逻辑:

// 获取系统Wifi服务实例
WifiManager wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
// 创建多播锁,名称可以自定义
WifiManager.MulticastLock multicastLock = wifiManager.createMulticastLock("SonyCameraSSDP");
// 申请锁,允许应用接收多播数据
multicastLock.acquire();

// 这里执行你的SSDP发送逻辑(也就是你写的发送3次数据包的代码)

// 操作完成后记得释放锁,避免资源泄漏
multicastLock.release();

3. 修正DatagramSocket的创建方式

避免绑定到系统预留或需要特殊权限的端口,建议让系统自动分配可用端口:

// 正确的创建方式:绑定到0端口,让系统分配可用端口
DatagramSocket socket = new DatagramSocket(null);
socket.setReuseAddress(true);
socket.bind(new InetSocketAddress(0));

4. 额外环境检查

  • 确认你的手机和索尼相机连接在同一个Wi-Fi局域网下,SSDP是局域网协议,跨网络无法正常工作。
  • 如果是Android 10及以上版本,部分设备可能需要开启位置权限(ACCESS_FINE_LOCATION)才能发现局域网设备,你可以尝试动态申请这个权限测试。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 10:10:05