Sending traffic in android app via particular connection
NickName:Nilesh Ask DateTime:2016-12-17T01:27:19

Sending traffic in android app via particular connection

I am developing an android app in which I specifically need to make a HTTP connection over WiFi only. It seems there were a lot of connectivity related changes in Android L and above.

This is the piece of code I'm using:

ConnectivityManager manager = (ConnectivityManager)
ctx.getSystemService(Context.CONNECTIVITY_SERVICE);
Network[] allNetworks = manager.getAllNetworks();

for(Network network : allNetworks) {
  NetworkInfo info = manager.getNetworkInfo(network);
  if(info.getType() == ConnectivityManager.TYPE_WIFI && info.getState() == NetworkInfo.State.CONNECTED) {
   System.out.println("FOUND WIFI NETWORK!");

   if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
     manager.bindProcessToNetwork(network);
   }

   app.network = network;
   break;
 }
 }

As per ConnectivityManager and Network API docs I should be able to do networkObject.openConnection to get a HttpUrlConnection bound that network. But I'm getting exception something of this type

W/System.err: java.net.SocketException: Binding socket to network 586 failed: EPERM (Operation not permitted)
W/System.err:     at android.net.Network.bindSocket(Network.java:362)
W/System.err:     at android.net.Network.bindSocket(Network.java:331)
W/System.err:     at android.net.Network$NetworkBoundSocketFactory.createSocket(Network.java:182)
W/System.err:     at com.android.okhttp.internal.http.SocketConnector.connectRawSocket(SocketConnector.java:155)
W/System.err:     at com.android.okhttp.internal.http.SocketConnector.connectCleartext(SocketConnector.java:67)
W/System.err:     at com.android.okhttp.Connection.connect(Connection.java:152)
W/System.err:     at com.android.okhttp.Connection.connectAndSetOwner(Connection.java:185)
W/System.err:     at com.android.okhttp.OkHttpClient$1.connectAndSetOwner(OkHttpClient.java:128)
W/System.err:     at com.android.okhttp.internal.http.HttpEngine.nextConnection(HttpEngine.java:341)
W/System.err:     at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:330)
W/System.err:     at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:248)
W/System.err:     at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:437)
W/System.err:     at com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:114)
W/System.err:     at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:245)
W/System.err:     at com.mypkg.myapp.utils.HttpRequestBackground.doInBackground(HttpRequestBackground.java:90)
W/System.err:     at com.mypkg.myapp.utils.HttpRequestBackground.doInBackground(HttpRequestBackground.java:38)
W/System.err:     at android.os.AsyncTask$2.call(AsyncTask.java:295)
W/System.err:     at java.util.concurrent.FutureTask.run(FutureTask.java:237)
W/System.err:     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)
W/System.err:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
W/System.err:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
W/System.err:     at java.lang.Thread.run(Thread.java:818)
W/System.err: Caused by: android.system.ErrnoException: Binding socket to network 586 failed: EPERM (Operation not permitted)

These are the network related permissions declared in the manifest

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

I'm not quite understanding what's wrong here.

The reason to do this: Android doesn't let me use wifi connection in my app when data is enabled and the AP to which it is connected does not have internet.

Copyright Notice:Content Author:「Nilesh」,Reproduced under the CC 4.0 BY-SA copyright license with a link to the original source and this disclaimer.
Link to original article:https://stackoverflow.com/questions/41189537/sending-traffic-in-android-app-via-particular-connection

More about “Sending traffic in android app via particular connection” related questions

Sending traffic in android app via particular connection

I am developing an android app in which I specifically need to make a HTTP connection over WiFi only. It seems there were a lot of connectivity related changes in Android L and above. This is the ...

Show Detail

android gps app for traffic application

I've currently finished learning the basics of android development and am trying to learn to make an android gps app in smartphones for my traffic system project. Not so very good yet in doing

Show Detail

No internet connection on trying to record traffic from a android app with JMeter

Trying to record traffic from mobile via jmeter, but once all setup is done internet is not working. Steps followed: jmeter template with thread group, recording controller, view results tree and...

Show Detail

IP traffic over Bluetooth in Android

I would like to create an app that communicates with a device through Bluetooth. I want to use a mobile app in order to pair and connect with some hardware (containing a Bluetooth server) and be a...

Show Detail

How to reroute SFTP traffic via NGINX

I'm trying to setup an FTP subdomain, such that all incoming SFTP requests to (say) ftp.myname.com, get routed to a particular internal server, (say) 10.123.456 via port 22. How do I use nginx to ...

Show Detail

Can't see HTTP/S traffic from an android app using Fiddler

I am trying to catch all the traffic that my android app is generating so I installed Fiddler on my desktop and set it up to catch android traffic. I can capture all the traffic from a browser or a...

Show Detail

Android is not receiving information sent via UDP

I am trying to obtain information with the usage of UDP protocol on my Android device. I have to consider two cases - connection via access point, and router. Sadly, in case of access point, I am l...

Show Detail

allow access to only particular folder via USB on android

i want that only particular folders can be accessed via the USB connection to the computer. Basically i want to give access to only the images and videos and notes that are stored on the android ta...

Show Detail

Fiddler - Decrypt Android HttpsUrlConnection SSL traffic

I've spent countless hours trying to decrypt Android SSL traffic via Fiddler for HttpsUrlConnection with very little success. How do I reliably configure Fiddler to decrypt SSL traffic from an And...

Show Detail

Android BLE - Measure traffic from inside application

In an android application I want to display the data rate (e.g.: in bytes/second) at which the application (or at least the device) is currently sending data via BLE. For network traffic there is ...

Show Detail