【问题标题】:Android - ServerSocket permission deniedAndroid - ServerSocket 权限被拒绝
【发布时间】:2015-12-21 09:49:47
【问题描述】:

我正在尝试在我的 Android 手机和我的 Raspberry Pi 之间建立 TCP 连接。应该很容易,事实证明不是吗? 所以我开始用 ServerSocket 编写一个简单的服务器。 它没有用,所以我减少了代码,直到我得到这个不起作用的部分:

    try
    {
        String wifiip = wifiIpAddress(this);
        Log.v("SERVER", wifiip);

        ServerSocket serverSocket = new ServerSocket();
        serverSocket.setReuseAddress(true);
        serverSocket.bind(new InetSocketAddress(wifiip, 4117));
    }catch (Exception ex)
    {
        ex.printStackTrace();
    }

(代码位于我的 MainActivity 中的 onCreate 方法中,该方法是由 AndroidStudio 创建的)

我也尝试用这种方法创建ServerSocket,但没有成功。

ServerSocket serverSocket = new ServerSocket(4117);

wifiIpAddress 方法取自这里:https://stackoverflow.com/a/18638588/2394967 并且工作得很好。

AndroidManifest.xml

<manifest ...>
<uses-sdk android:targetSdkVersion="21"></uses-sdk>
<uses-permission android:name="ANDROID.PERMISSION.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
...
</manifest>

可能有用的信息:

  • 我在 ArchLinux 上运行 AndroidStudio
  • 我尝试使用一个新的、未受影响的项目
  • 我尝试了不同的端口(1024 以上)
  • 我正在真实设备上运行应用程序(Xperia Z,Android 5.0.2)
  • 我尝试在另一个线程中运行 ServerSocket

Logcat

    java.net.SocketException: socket failed: EACCES (Permission denied)
W/System.err﹕ at libcore.io.IoBridge.socket(IoBridge.java:632)
W/System.err﹕ at java.net.PlainSocketImpl.create(PlainSocketImpl.java:198)
W/System.err﹕ at java.net.PlainServerSocketImpl.create(PlainServerSocketImpl.java:38)
W/System.err﹕ at java.net.ServerSocket.<init>(ServerSocket.java:64)
W/System.err﹕ at eu.therealskynet.socketstest.MainActivity.onBtSendClicked(MainActivity.java:47)
W/System.err﹕ at java.lang.reflect.Method.invoke(Native Method)
W/System.err﹕ at java.lang.reflect.Method.invoke(Method.java:372)
W/System.err﹕ at android.view.View$1.onClick(View.java:4078)
W/System.err﹕ at android.view.View.performClick(View.java:4832)
W/System.err﹕ at android.view.View$PerformClick.run(View.java:19839)
W/System.err﹕ at android.os.Handler.handleCallback(Handler.java:739)
W/System.err﹕ at android.os.Handler.dispatchMessage(Handler.java:95)
W/System.err﹕ at android.os.Looper.loop(Looper.java:211)
W/System.err﹕ at android.app.ActivityThread.main(ActivityThread.java:5333)
W/System.err﹕ at java.lang.reflect.Method.invoke(Native Method)
W/System.err﹕ at java.lang.reflect.Method.invoke(Method.java:372)
W/System.err﹕ at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1016)
W/System.err﹕ at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:811)
W/System.err﹕ Caused by: android.system.ErrnoException: socket failed: EACCES (Permission denied)
W/System.err﹕ at libcore.io.Posix.socket(Native Method)
W/System.err﹕ at libcore.io.BlockGuardOs.socket(BlockGuardOs.java:282)
W/System.err﹕ at libcore.io.IoBridge.socket(IoBridge.java:617)
W/System.err﹕ ... 17 more

我什至不知道“套接字失败:EACCES(权限被拒绝)”应该告诉我什么......

【问题讨论】:

  • 你的应用有INTERNET权限吗?
  • 试试 我认为它是区分大小写的。
  • 感谢丹尼尔·博!这就是问题所在。 (Android Studio,你本可以告诉我的,真的:/)你能把这个作为答案发布,以便我接受吗?
  • '代码位于 onCreate 方法中'。这是行不通的。此类代码应在线程或 AsyncTask 中执行。
  • 'ServerSocket serverSocket = new ServerSocket(4117);'。这样更好。不要将其绑定到您的 Android 服务器的 wifi 地址。你为什么要这样做?

标签: java android


【解决方案1】:

我会自己发布答案。

问题在于这是区分大小写:

ANDROID.PERMISSION.INTERNET

而且必须这样写:

android.permission.INTERNET

【讨论】:

    猜你喜欢
    • 2013-07-03
    • 2020-06-03
    • 2020-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-06
    • 1970-01-01
    • 2012-06-13
    相关资源
    最近更新 更多