Reputation: 47
I'm trying to send UDP packets to a remote host in android studio. But this error showed up:
java.net.BindException: bind failed: EACCES (Permission denied)
at libcore.io.IoBridge.bind(IoBridge.java:103)
at java.net.PlainDatagramSocketImpl.bind0(PlainDatagramSocketImpl.java:104)
at java.net.AbstractPlainDatagramSocketImpl.bind(AbstractPlainDatagramSocketImpl.java:110)
at java.net.DatagramSocket.bind(DatagramSocket.java:412)
at java.net.DatagramSocket.<init>(DatagramSocket.java:262)
at java.net.DatagramSocket.<init>(DatagramSocket.java:319)
at com.genean.dronecontroller.PacketSender.sendConnectionPacket(PacketSender.java:55)
at com.genean.dronecontroller.PacketSender.access$000(PacketSender.java:20)
at com.genean.dronecontroller.PacketSender$1.run(PacketSender.java:45)
at java.lang.Thread.run(Thread.java:784)
Caused by: android.system.ErrnoException: bind failed: EACCES (Permission denied)
at libcore.io.Linux.bind(Native Method)
at libcore.io.ForwardingOs.bind(ForwardingOs.java:60)
at libcore.io.IoBridge.bind(IoBridge.java:99)
at java.net.PlainDatagramSocketImpl.bind0(PlainDatagramSocketImpl.java:104)
at java.net.AbstractPlainDatagramSocketImpl.bind(AbstractPlainDatagramSocketImpl.java:110)
at java.net.DatagramSocket.bind(DatagramSocket.java:412)
at java.net.DatagramSocket.<init>(DatagramSocket.java:262)
at java.net.DatagramSocket.<init>(DatagramSocket.java:319)
at com.genean.dronecontroller.PacketSender.sendConnectionPacket(PacketSender.java:55)
at com.genean.dronecontroller.PacketSender.access$000(PacketSender.java:20)
at com.genean.dronecontroller.PacketSender$1.run(PacketSender.java:45)
at java.lang.Thread.run(Thread.java:784)
Here's line 55 of PacketSender:
socket = new DatagramSocket(HOST_PORT);
I've tried adding android.permission.INTERNET and even checked for it with
if (ContextCompat.checkSelfPermission(activity, Manifest.permission.INTERNET)
!= PackageManager.PERMISSION_GRANTED) {
Toast toast = Toast.makeText(activity.getApplicationContext(),
activity.getString(R.string.no_internet_perms), Toast.LENGTH_LONG);
toast.show();
}
However it still gives me a permission error.
EDIT: suspect it might be the port im using which is 333.
Upvotes: 0
Views: 1599
Reputation: 47
Apparently, I realised that it is impossible to use a specific local port to establish the socket despite having android.permission.INTERNET. Either you get a permission error or the port has been occupied by another app. Hence, I fixed it by initiating my DatagramSocket without any parameters to allow Android to set an arbitrary port number instead.
Upvotes: 1