在android 中开发java.net.SocketException: socket failed: EACCES (Permission denied) 报错

本文针对Android应用中出现的java.net.SocketException:socketfailed:EACCES(Permissiondenied)错误进行了探讨,提供了排查思路及解决方案,包括检查网络权限、避免UI线程网络操作等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在android 中开发java.net.SocketException: socket failed: EACCES (Permission denied) 报错


知识点:

1、SocketException网络操作报错;

2、解决方法;(原来是用户单一地关闭了我们app的连网权限,现在新的android系统可以对某一权限进行设置)


我今天遇到一个用户的反馈,遇到的是这样的问题,点击登录,但是无法登录,而是提示java.net.SocketException: socket failed: EACCES (Permission denied) 这个信息。第一反应就是缺少网络权限嘛,然后赶紧检查有没有加入网络访问权限。

在androidmanifest文件中加入

<uses-permission android:name=“android.permission.INTERNET”/>
然而,我在程序里面已经早就写好了。现在写android app项目极少可能不联网操作了吧,所以这个一开始就应该加入的了。所以,这个问题排除。但是,我找了好多资料,都没有找到合适的描述和解决方法。不能是我认同。

一下是我找的一些可能的原因。

无奈用户手机不在我这里,不然看下log 错误就明了了。现在只能叫用户重新下载app了。然后就OK了。这真的是有点蛋疼啊。


还有一个新的很可能的引起问题:用户禁用了你的app的访问网络的权限。注意是单一阻止了。所以根据系统来给你的应用程序开启联网的权限。

例如小米手机 的操作是:找到“安全中心”app,进入,然后看到“网络助手”,进入,然后点击“联网控制”,找到对应app,查看对应的“数据”和“WLAN”两个选项是否钩上了。

或者

java文件网络操作前,加入如下代码

StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().detectDiskReads().detectDiskWrites().detectNetwork().penaltyLog().build());

原因:

最有可能,是因为可能网络操作的代码写在了UI线程里,从android 4.0以后就不允许这样操作了。因为在UI线程里进行网络操作,如果网络不好那么整个程序就容易ANR。所以android4.0以后对要网络操作的代码必须新开一个线程来做。


又或者

网络权限要这样写:

<uses-permission android:name=“android.permission.INTERNET"/>

而不是这样写

<permission  android:name=“android.permission.INTERNET"></permission>

又或者

important - the uses-permission tag needs to be before the application tag in the manifest file. thats what fixed it for me at least.

墙外这样说:权限要在<application>标签后面引入才能起作用。(但是我一直都是这样写的,没问题)--去除


又或者

重启ide之后,又可以正常运行代码了。


总的原因:

缺少权限?

权限写错?

UI线程中网络操作?

端口占用导致?

android版本问题?

开发工具问题?重启,重编译




### Android 读写文件 `Permission denied` 的解决方案 在开发过程中遇到 `java.net.SocketException: socket failed: EACCES (Permission denied)` 或者 `open failed: EACCES (Permission denied)` 错误时,通常是因为应用程序尝试访问受限的外部存储区域而未获得适当权限。以下是针对不同版本 Android 的具体解决方法: #### 权限声明 无论哪个版本的 Android,都需要先在 `AndroidManifest.xml` 中声明必要的权限: ```xml <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> ``` 对于 Android 10(API Level 29)及以上版本,还需要考虑新的隐私保护机制。 --- #### 针对 Android 6.0 到 Android 9.0 的解决方案 从 Android 6.0 开始,运行时权限成为强制要求。如果仅通过静态声明权限而不请求动态权限,则可能导致操作失败并抛出 `Permission denied` 异常[^1]。 实现动态权限请求的方法如下: ```java if (ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_CODE); } ``` 上述代码会在必要时弹窗提示用户授予文件读写权限。 --- #### 针对 Android 10 的解决方案 从 Android 10 起,默认启用了 **Scoped Storage** 模型,这意味着应用只能访问其专属目录下的数据(路径类似于 `/storage/emulated/0/Android/data/<package_name>/files/`)。试图访问其他位置可能会触发 `Permission denied` 错误[^2][^3]。 ##### 解决方案一:启用 Legacy 存储模式 可以通过设置 `requestLegacyExternalStorage=true` 属性来暂时禁用 Scoped Storage 功能,从而恢复传统存储行为: ```xml <application android:requestLegacyExternalStorage="true" ... > </application> ``` 注意:此选项将在未来版本中被移除,因此建议作为过渡方案使用。 ##### 解决方案二:调整文件存取逻辑 修改程序设计以适应 Scoped Storage 规范,例如利用 Context 提供的安全 API 访问共享媒体资源: ```java ContentResolver resolver = getContentResolver(); Uri imageUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; Cursor cursor = resolver.query(imageUri, null, null, null, null); while(cursor.moveToNext()){ String filePath = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA)); File file = new File(filePath); // 对目标文件执行进一步处理... } cursor.close(); ``` --- #### 针对 Android 11 及以上的解决方案 自 Android 11 起,引入了更严格的管理策略——即只有具备特殊权限的应用才能完全控制整个外置存储器的内容。普通 App 若需获取此类能力,必须引导用户前往系统设置界面手动开启【允许管理所有文件】开关[^5]。 示例代码片段展示如何跳转至相应配置页: ```java Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION); intent.setData(Uri.parse("package:" + getApplicationContext().getPackageName())); startActivityForResult(intent, REQUEST_CODE); ``` 另外值得注意的是,某些场景下即便已成功授予权限仍可能出现异常情况。此时可以尝试重启进程后再试一次[^4]: ```java Process.killProcess(Process.myPid()); System.exit(0); ``` --- ### 总结 综上所述,面对 Android 不同平台间日益增强的数据隔离特性,“一刀切”的通用解法并不现实;开发者应依据实际需求灵活选用适配措施,并充分测试兼容性表现。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值