AsyncTask OutputStream fails for few devices - android

I have two AsyncTasks in my fragment. First to load (AsyncTask1) the initial set of data and then another (AsyncTask2) to load subsequent data as the app is scrolled down.
Both the tasks work perfectly in the emulator (Pixel, Nexus devices). As I scroll the second task loads new data seamlessly.
But when I run the app on Samsung Note 4, Samsung A5 and one other device then AsyncTask1 works correctly but the AsyncTask2 stops executing after the below line. I tried it on a Moto phone and it worked properly.
OutputStream outputStream1 = httpURLConnection.getOutputStream();
Below is my doInBackground method of AsyncTask2
#Override
protected String doInBackground(Integer... args) {
String arg_item_number = String.valueOf((args[0]*5));
np_page = args[0];
String arg_language;
if (args[1]==1){
arg_language = "en";
}else{
arg_language = "hi";
}
try {
URL url1 = new URL(url_get_next_posts);
HttpURLConnection httpURLConnection = (HttpURLConnection) url1.openConnection();
httpURLConnection.setRequestMethod("POST");
httpURLConnection.setDoOutput(true);
OutputStream outputStream1 = httpURLConnection.getOutputStream();
BufferedWriter bufferedWriter1 = new BufferedWriter(new OutputStreamWriter(outputStream1,"UTF-8"));
String data_string_language1 = URLEncoder.encode("item_number","UTF-8")+"="+URLEncoder.encode(arg_item_number,"UTF-8")
+"&"+URLEncoder.encode("selected_language","UTF-8")+"="+URLEncoder.encode(arg_language,"UTF-8");
bufferedWriter1.write(data_string_language1);
bufferedWriter1.flush();
bufferedWriter1.close();
outputStream1.close();
InputStream inputStream = httpURLConnection.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
StringBuilder stringBuilder = new StringBuilder();
while ((JSON_NEXT_POST = bufferedReader.readLine()) != null) {
stringBuilder.append(JSON_NEXT_POST + "\n");
}
bufferedReader.close();
inputStream.close();
httpURLConnection.disconnect();
return stringBuilder.toString().trim();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
Error log
I/System.out: (HTTPLog)-Static: isSBSettingEnabled false
I/System.out: (HTTPLog)-Static: isSBSettingEnabled false
D/tag_item_count: 1
I/Timeline: Timeline: Activity_idle id: android.os.BinderProxy#8bda7dd time:13839484
I/System.out: (HTTPLog)-Static: isSBSettingEnabled false
I/System.out: (HTTPLog)-Static: isSBSettingEnabled false
W/System.err: java.net.UnknownHostException: http:websitenname.com/script_url.php
W/System.err: at com.android.okhttp.internal.http.HttpEngine.createAddress(HttpEngine.java:1347)
W/System.err: at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:439)
W/System.err: at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:353)
W/System.err: at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:476)
W/System.err: at com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:118)
W/System.err: at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:249)
W/System.err: at com.app_name.android.app_name.PostTab$BackgroundNextPostsJSON.doInBackground(PostTab.java:374)
W/System.err: at com.app_name.android.app_name.PostTab$BackgroundNextPostsJSON.doInBackground(PostTab.java:347)
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)
I/System.out: (HTTPLog)-Static: isSBSettingEnabled false
I/System.out: (HTTPLog)-Static: isSBSettingEnabled false
Can it be something related to the Android version running on the phone (Note 4 is running 6.0.1)? I have no clue what is wrong with the code as it actually works on emulator & Moto phone. Can the problem occur on other non-Samsung devices too?

In your stacktrace
http:websitenname.com/ is invalid URL due to it is missing double slash in the url scheme. Should be http://websitenname.com/ probably.
It worked on emulator and some devices probably because they have some undocumented improvements, and try to open even invalid URLs.

Related

Issue with http connection on samsung device but not on other device

I have an android app which works perfectly on my phone (Huawei Mate 10 Pro) but when I try to run it on my tablet (Samsung Galaxy Tab S2) I get a java.io.FileNotFoundException when the app tries to access the input stream.
(I get the exception at "InputStream stream = connection.getInputStream();")
Is there a difference between Samsung and other devices regarding http communication? how can I write the code to work on every device?
Here's the code:
public String download_organisations(String url){
String jsonString = "";
try {
if(!url.startsWith("http://")){
url = "http://" + url;
}
if(url.endsWith("/")){
url = url.substring(0, url.lastIndexOf("/"));
}
url = url + ManagerSystemStatic.URL_SERVICE_WEB_ORGANISATION_MANAGER;
URL httpUrl = new URL(url);
HttpURLConnection connection = (HttpURLConnection) httpUrl.openConnection();
connection.setConnectTimeout(10000);
InputStream stream = connection.getInputStream();
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
int nRead;
byte[] data = new byte[1024];
while ((nRead = stream.read(data, 0, data.length)) != -1) {
buffer.write(data, 0, nRead);
}
buffer.flush();
byte[] inputStreamByteArray = buffer.toByteArray();
byte[] base64 = Base64.decode(inputStreamByteArray, 0);
byte[] decrypted = CipherUtils.decrypt(base64);
jsonString = new String(decrypted);
stream.close();
if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) {
Log.d("OrganisationManager", "Download succeded with response: " + connection.getResponseCode());
} else {
Log.d("OrganisationManager", "Download failed with response: " + connection.getResponseCode());
}
} catch (MalformedURLException e) {
Log.e("OrganisationManager", e.toString());
return DOWNLOAD_FAILED;
} catch (IOException e) {
Log.e("OrganisationManager", e.toString());
e.printStackTrace();
return DOWNLOAD_FAILED;
} catch (Exception e) {
Log.e("OrganisationManager", e.toString());
return DOWNLOAD_FAILED;
}
return jsonString;
}
Here's the StackTrace (with my url replaced):
E/OrganisationManager: java.io.FileNotFoundException: http://www.myurlhere.com
W/System.err: java.io.FileNotFoundException: http://www.myurlhere.com
W/System.err: at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:254)
W/System.err: at com.organisationmanager.ble.common.WebPortalCommunicationHelper.download_organisations(WebPortalCommunicationHelper.java:210)
at com.organisationmanager.ble.ScanningActivity$UpdateOrganisations.doInBackground(ScanningActivity.java:414)
at com.organisationmanager.ble.ScanningActivity$UpdateOrganisations.doInBackground(ScanningActivity.java:403)
W/System.err: at android.os.AsyncTask$2.call(AsyncTask.java:304)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
W/System.err: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
D/InputTransport: Input channel constructed: fd=82
W/System.err: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
W/System.err: at java.lang.Thread.run(Thread.java:762)
When it starts the http communication I also get this in the debugger console:
D/NetworkSecurityConfig: No Network Security Config specified, using platform default
I/System.out: (HTTPLog)-Static: isSBSettingEnabled false
Is that relevant?
After a lot of trial and error I still don't know what the issue was, but I tried using the class OkHttp instead of HttpUrlConnection, and suddenly everything worked. I have no idea why, but since I now have a working code I no longer need help with this issue. I hope this solution (changing class entirely) may help someone in the future. More about the class I used can be found here: http://square.github.io/okhttp/

HttpURLConnection .getInputStream() Crashes on Marshmallow not Oreo

The following code works flawlessly on Android 8. On a tablet running 6 it crashes when getting the getinputstream with a file io error. I've tried for HOURS and HOURS without any luck. PLEASE help. Nothing works. Even trying a volley doesn't help. My Web API works great on a computer and a phone.
#Override
protected String doInBackground(String... args) {
StringBuilder result = new StringBuilder();
try {
URL url = new URL("https://api.github.com/users/dmnugent80/repos");
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
InputStream in = new BufferedInputStream(urlConnection.getInputStream());
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
String line;
while ((line = reader.readLine()) != null) {
result.append(line);
}
}
catch(Exception e) {
e.printStackTrace();
}
return result.toString();
}
LOG CAT HERE
06-24 02:01:21.813 22840-22890/com.marcusengineering.recipedatabase
I/System.out: [CDS][DNS] getAllByNameImpl netId = 0 06-24 02:01:21.813
22840-22890/com.marcusengineering.recipedatabase D/libc-netbsd:
[getaddrinfo]: hostname=recipedatabase.gear.host; servname=(null);
netid=0; mark=0
[getaddrinfo]: ai_addrlen=0; ai_canonname=(null); ai_flags=4; ai_family=0 06-24 02:01:21.817
22840-22890/com.marcusengineering.recipedatabase D/libc-netbsd:
[getaddrinfo]: hostname=recipedatabase.gear.host; servname=(null);
netid=0; mark=0 06-24 02:01:21.818
22840-22890/com.marcusengineering.recipedatabase D/libc-netbsd:
[getaddrinfo]: ai_addrlen=0; ai_canonname=(null); ai_flags=1024;
ai_family=0 06-24 02:01:21.824
22840-22890/com.marcusengineering.recipedatabase D/libc-netbsd:
getaddrinfo: recipedatabase.gear.host get result from proxy gai_error
= 0 06-24 02:01:21.824 22840-22890/com.marcusengineering.recipedatabase I/System.out: [CDS]rx
timeout:0 06-24 02:01:21.826
22840-22890/com.marcusengineering.recipedatabase I/System.out:
[socket][0] connection
recipedatabase.gear.host/204.246.56.80:80;LocalPort=43028(0)
[CDS]connect[recipedatabase.gear.host/204.246.56.80:80] 06-24 02:01:21.826 22840-22890/com.marcusengineering.recipedatabase D/Posix:
[Posix_connect Debug]Process com.marcusengineering.recipedatabase :80
06-24 02:01:21.919 22840-22890/com.marcusengineering.recipedatabase
I/System.out: [CDS]port[43028]
[socket][/192.168.1.163:43028] connected 06-24 02:01:21.920 22840-22890/com.marcusengineering.recipedatabase I/System.out: [CDS]rx
timeout:0
[CDS]SO_SND_TIMEOUT:0 06-24 02:01:21.921 22840-22890/com.marcusengineering.recipedatabase I/System.out:
[OkHttp] sendRequest>>
[OkHttp] sendRequest<< 06-24 02:01:21.982 22840-22890/com.marcusengineering.recipedatabase W/System.err:
java.io.FileNotFoundException:
http://recipedatabase.gear.host/RestServiceImpl.svc/jsonfindtable/SELECT
UnitID, UnitName, HiddenFlag FROM TblUnits ORDER BY UnitName FOR JSON
PATH
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:238)
at com.marcusengineering.recipedatabase.MainActivity.getRestFromWebAsString(MainActivity.java:334)
at com.marcusengineering.recipedatabase.MainActivity$MyAsyncInitialLoad.doInBackground(MainActivity.java:252)
at com.marcusengineering.recipedatabase.MainActivity$MyAsyncInitialLoad.doInBackground(MainActivity.java:232)
at android.os.AsyncTask$2.call(AsyncTask.java:295) 06-24 02:01:21.983 22840-22890/com.marcusengineering.recipedatabase
W/System.err: at
java.util.concurrent.FutureTask.run(FutureTask.java:237)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
at java.lang.Thread.run(Thread.java:818)
FINNNNNNNALY FIGURED IT OUT!.
Not sure which ones were 100% needed but here's what I did to help any other poor souls.
Ensure that your web api is fomratted without the extra wrapping added from WCF, i.e. is plain text. (not critical)
Get rid of spaces in your URL. It appears OREO does this for you. Earlier versions must not. The code to do this is: URL url = new URL(query.replace(" ","%20"));
Happy dance
In totality the call should be as follows:
URL url = new URL(query.replace(" ","%20"));
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
int i = urlConnection.getResponseCode();
InputStream inputs;
if (i < HttpURLConnection.HTTP_BAD_REQUEST) {
inputs = urlConnection.getInputStream();
} else {
// Error
inputs = urlConnection.getErrorStream();
return "-1";
}
InputStream in = new BufferedInputStream(urlConnection.getInputStream());
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
String line = "";
while ((line = reader.readLine()) != null) {
result.append(line);
}
To set the formatting to raw string in the WCF see the following.
In the *****.cs
[OperationContract]
[WebGet( UriTemplate = "jsonFindTableBare/{id}")]
Stream DoWork(string id);
In the svc.cs
public Stream DoWork(String id)
{
WebOperationContext.Current.OutgoingResponse.ContentType = "application/json; charset=utf-8";
String str = "YOUR RESPONSE HERE";
WebOperationContext.Current.OutgoingResponse.ContentType = "text/plain";
return new MemoryStream(Encoding.UTF8.GetBytes(str));
}
Thanks for all the help, Mangal. Appreciate it.
You should first check response code to also handle the error input stream.
InputStream inputs;
if (urlConnection.getResponseCode() < HttpURLConnection.HTTP_BAD_REQUEST) {
inputs = urlConnection.getInputStream();
} else {
// Error
inputs = urlConnection.getErrorStream();
}
then call
InputStream in = new BufferedInputStream(urlConnection);
I had also faced some app crashing experience because of handling error stream direclty.
Please do check always, It's a good practice.

How can I connect between android client and python-Flask server, using REST API, without localhost communication?

I want to build a simple android mobile app, that will communicate through REST API with a python-Flask server -
So the android client will run on my Sumsung Galaxy J7 Prime phone (using USB connection through an android-studio script which runs on my computer), and the python-Flask server will run on my computer (using running python-Flask file through PyCharm workspace).
All i want to do is to pass a simple message between those client and server, with a regular connection (not localhost).
This is the simple server code:
from flask import Flask
app = Flask(__name__)
#app.route("/RESTfulExample/json/product/get")
def hello():
return "Hello World !!"
if __name__ == "__main__":
app.run(host='0.0.0.0', debug=True)
This code works well when i run this server, and enter the URL address with google chrome URL: http://127.0.0.1:5000/RESTfulExample/json/product/get
It works fine also when I run a script in Jave which sends this URL to the server (with localhost communication):
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
public class firstJava {
public static void main(String[] args) {
try {
URL url = new URL("http://localhost:5000/RESTfulExample/json/product/get");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setRequestProperty("Accept", "application/json");
if (conn.getResponseCode() != 200) {
throw new RuntimeException("Failed : HTTP error code : "
+ conn.getResponseCode());
}
BufferedReader br = new BufferedReader(new InputStreamReader(
(conn.getInputStream())));
String output;
System.out.println("Output from Server .... \n");
while ((output = br.readLine()) != null) {
System.out.println(output);
}
conn.disconnect();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
The output is:
Output from Server ....
Hello World !!
The problem comes when i use the exact same code in the my andriod-studio project, except of changing the IP address from localhost(127.0.0.1) to the IP of my computer (10.0.0.54):
public void buttonClicked (View view){
EditText editText = (EditText) findViewById(R.id.passwordEditText);
try {
URL url = new URL("http://10.0.0.54:5000/RESTfulExample/json/product/get");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setRequestProperty("Accept", "application/json");
System.out.println(conn.getResponseCode());
if (conn.getResponseCode() != 200) {
throw new RuntimeException("Failed : HTTP error code : "
+ conn.getResponseCode());
}
BufferedReader br = new BufferedReader(new InputStreamReader(
(conn.getInputStream())));
String output;
System.out.println("Output from Server .... \n");
while ((output = br.readLine()) != null) {
editText.setText(output);
}
conn.disconnect();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
When I run this script in android studio, the application in my phone collapses, and in the console in the android-studio, the error lines are those:
I/System.out: (HTTPLog)-Static: isSBSettingEnabled false
I/System.out: (HTTPLog)-Static: isSBSettingEnabled false
D/AndroidRuntime: Shutting down VM
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.owner.firstapp, PID: 25703
java.lang.IllegalStateException: Could not execute method for android:onClick
at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:293)
at android.view.View.performClick(View.java:5721)
at android.widget.TextView.performClick(TextView.java:10931)
at android.view.View$PerformClick.run(View.java:22620)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:7409)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Method.invoke(Native Method)
at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288)
at android.view.View.performClick(View.java:5721) 
at android.widget.TextView.performClick(TextView.java:10931) 
at android.view.View$PerformClick.run(View.java:22620) 
at android.os.Handler.handleCallback(Handler.java:739) 
at android.os.Handler.dispatchMessage(Handler.java:95) 
at android.os.Looper.loop(Looper.java:148) 
at android.app.ActivityThread.main(ActivityThread.java:7409) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 
Caused by: android.os.NetworkOnMainThreadException
at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1273)
at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:110)
at libcore.io.IoBridge.connectErrno(IoBridge.java:137)
at libcore.io.IoBridge.connect(IoBridge.java:122)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:183)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:452)
at java.net.Socket.connect(Socket.java:884)
at com.android.okhttp.internal.Platform.connectSocket(Platform.java:117)
at com.android.okhttp.internal.http.SocketConnector.connectRawSocket(SocketConnector.java:438)
at com.android.okhttp.internal.http.SocketConnector.connectCleartext(SocketConnector.java:105)
at com.android.okhttp.Connection.connect(Connection.java:1333)
at com.android.okhttp.Connection.connectAndSetOwner(Connection.java:1412)
at com.android.okhttp.OkHttpClient$1.connectAndSetOwner(OkHttpClient.java:131)
at com.android.okhttp.internal.http.HttpEngine.nextConnection(HttpEngine.java:485)
at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:466)
at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:372)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:476)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:418)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:540)
at com.example.owner.firstapp.MainActivity.buttonClicked(MainActivity.java:44)
at java.lang.reflect.Method.invoke(Native Method) 
at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288) 
at android.view.View.performClick(View.java:5721) 
at android.widget.TextView.performClick(TextView.java:10931) 
at android.view.View$PerformClick.run(View.java:22620) 
at android.os.Handler.handleCallback(Handler.java:739) 
at android.os.Handler.dispatchMessage(Handler.java:95) 
at android.os.Looper.loop(Looper.java:148) 
at android.app.ActivityThread.main(ActivityThread.java:7409) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 
I/Process: Sending signal. PID: 25703 SIG: 9
Application terminated.
As the separated line above tells, the problem is with line 44 - System.out.println(conn.getResponseCode());
which means, that for some reason, the conn.getResponseCode() isn't work.
So i understand that the problem occures when i stop use the localhost connection and move to a regular connection between 2 devices. I just don't know how to fix it.
I didn't know i will stuck so much time with a simple server-client communication.. I will glad if someone here will help me solve this simple problem.
Thank you very much in advance, and sorry for my bad english :)
I know you posted this few months ago, but have you thought enabling internet permissions in your manifest file ?

AsyncTask - java.net.SocketException: Connection reset

I have an AsyncTask to fetch JSON data from a DB on my server. It works well normally but is failing sometimes with the below error. It seems like this happens when I keep the app idle but open for some time and then make a request.
doInBackground Method
try {
URL url = new URL(url_get_initial_posts);
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
httpURLConnection.setRequestMethod("POST");
httpURLConnection.setDoOutput(true);
OutputStream outputStream = httpURLConnection.getOutputStream();
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream,"UTF-8"));
String data_string_language = URLEncoder.encode("selected_language","UTF-8")+"="+URLEncoder.encode(arg_language,"UTF-8")
+"&"+URLEncoder.encode("app_time","UTF-8")+"="+URLEncoder.encode(String.valueOf(arg_app_time),"UTF-8");
bufferedWriter.write(data_string_language);
bufferedWriter.flush();
bufferedWriter.close();
outputStream.close();
InputStream inputStream = httpURLConnection.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
StringBuilder stringBuilder = new StringBuilder();
while ((JSON_INITIAL_POST = bufferedReader.readLine()) != null) {
stringBuilder.append(JSON_INITIAL_POST + "\n");
}
bufferedReader.close();
inputStream.close();
httpURLConnection.disconnect();
return stringBuilder.toString().trim();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
This line in the error
W/System.err: at com.indiparent.android.indiparent.PostTab$BackgroundJSONPosts.doInBackground(PostTab.java:343)
links to
InputStream inputStream = httpURLConnection.getInputStream();
Error
W/System.err: java.net.SocketException: Connection reset
W/System.err: at java.net.SocketInputStream.read(SocketInputStream.java:209)
W/System.err: at java.net.SocketInputStream.read(SocketInputStream.java:139)
W/System.err: at com.android.okhttp.okio.Okio$2.read(Okio.java:136)
W/System.err: at com.android.okhttp.okio.AsyncTimeout$2.read(AsyncTimeout.java:211)
W/System.err: at com.android.okhttp.okio.RealBufferedSource.indexOf(RealBufferedSource.java:306)
W/System.err: at com.android.okhttp.okio.RealBufferedSource.indexOf(RealBufferedSource.java:300)
W/System.err: at com.android.okhttp.okio.RealBufferedSource.readUtf8LineStrict(RealBufferedSource.java:196)
W/System.err: at com.android.okhttp.internal.http.Http1xStream.readResponse(Http1xStream.java:186)
W/System.err: at com.android.okhttp.internal.http.Http1xStream.readResponseHeaders(Http1xStream.java:127)
W/System.err: at com.android.okhttp.internal.http.HttpEngine.readNetworkResponse(HttpEngine.java:737)
W/System.err: at com.android.okhttp.internal.http.HttpEngine.readResponse(HttpEngine.java:609)
W/System.err: at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:471)
W/System.err: at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:407)
W/System.err: at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:244)
W/System.err: at com.indiparent.android.indiparent.PostTab$BackgroundJSONPosts.doInBackground(PostTab.java:343)
W/System.err: at com.indiparent.android.indiparent.PostTab$BackgroundJSONPosts.doInBackground(PostTab.java:308)
W/System.err: at android.os.AsyncTask$2.call(AsyncTask.java:333)
W/System.err: at java.util.concurrent.FutureTask.run(FutureTask.java:266)
W/System.err: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
W/System.err: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
W/System.err: at java.lang.Thread.run(Thread.java:764)
Extra Info - This is not the only Asynctask in the application. There are more in other activities and fragments. For example - if AsynckTask of Activity 2 throws this error then if I come back to Activity 1 then its AsyncTask also does not work.
Am I supposed to do something here or on the server side? Appreciate any help here.

Android Studio Get request java.io.FileNotFoundException: http://10.0.2.2

I am working on android app that should send GCS registration token to .NET MVC service that is running on localhost. I am using android Emulator with API 23 version. I have eliminated nearly everything that can be wrong, URL and parameters I send at the moment are hardcoded and If I copy paste url into browser (and replace 10.0.2.2 with localhost obviously) everything works. I am using fiddler but request that is supposed to originate from android does not get registered.
What I am getting instead is IO exception on InputStream inputStream = connection.getInputStream(); line
1-18 18:26:28.305 3488-3524/gcm.play.android.samples.com.gcmquickstart
W/System.err: java.io.FileNotFoundException:
http://10.0.2.2:61594/api/Account/RegisterDevice?token=2342342&coordinates=12.012;13.1515
01-18 18:26:28.305
3488-3524/gcm.play.android.samples.com.gcmquickstart W/System.err:
at
com.android.okhttp.internal.huc.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:238)
01-18 18:26:28.305
3488-3524/gcm.play.android.samples.com.gcmquickstart W/System.err:
at
gcm.play.android.samples.com.gcmquickstart.RegistrationIntentService.sendRegistrationToServer(RegistrationIntentService.java:108)
01-18 18:26:28.305
3488-3524/gcm.play.android.samples.com.gcmquickstart W/System.err:
at
gcm.play.android.samples.com.gcmquickstart.RegistrationIntentService.onHandleIntent(RegistrationIntentService.java:69)
01-18 18:26:28.305
3488-3524/gcm.play.android.samples.com.gcmquickstart W/System.err:
at
android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:66)
01-18 18:26:28.306
3488-3524/gcm.play.android.samples.com.gcmquickstart W/System.err:
at android.os.Handler.dispatchMessage(Handler.java:102) 01-18
18:26:28.306 3488-3524/gcm.play.android.samples.com.gcmquickstart
W/System.err: at android.os.Looper.loop(Looper.java:148) 01-18
18:26:28.306 3488-3524/gcm.play.android.samples.com.gcmquickstart
W/System.err: at
android.os.HandlerThread.run(HandlerThread.java:61)
In watch connection.getResponseCode() status code is 400 (bad request) - but again server isn't even being hit.
I have configured following permissions in manifest:
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.INTERNET" />
Code that makes request:
StringBuffer chaine = new StringBuffer("");
try{
URL url = new URL("http://10.0.2.2:61594/api/Account/RegisterDevice?token=2342342&coordinates=12.012;13.1515");
HttpURLConnection connection = (HttpURLConnection)url.openConnection();
connection.setRequestProperty("User-Agent", "");
connection.setRequestMethod("GET");
connection.setDoInput(true);
connection.connect();
InputStream inputStream = connection.getInputStream();
BufferedReader rd = new BufferedReader(new InputStreamReader(inputStream));
String line = "";
while ((line = rd.readLine()) != null) {
chaine.append(line);
}
} catch (IOException e) {
// writing exception to log
e.printStackTrace();
}
Code from .NET Server
[AllowAnonymous]
[System.Web.Http.AcceptVerbs("GET", "POST")]
[System.Web.Http.HttpGet]
public void RegisterDevice(string token, string coordinates)
{
if (string.IsNullOrWhiteSpace(token))
{
throw new ArgumentNullException("Token is empty");
}
var data = new Data.EmergencyService();
if (data.AddUser(token, coordinates))
{
HttpContext.Current.Response.StatusCode = 200;
}
}
After I couldn't get fiddler to register request it made me to be completely lost.
Why can't I make request GET request from Andriod Studio which perfectly works in browser?
Ok for those who are wondering the reason for Android not being able to access PC localhost on http://10.0.2.2 was me running MVC service from Visual Studio in debug mode.
Once I have configured local IIS server and published website ( to local file system), Android was able to access it on http://10.0.2.2.
Hope this saves you some time.

Categories

Resources