1

The problem occurs when trying to connect to the apache server either using volley or httpURLConnection. I am using a digitalocean ubuntu server running LAMP but that shouldn't matter because the app isn't even connecting to the server.

I've tried:

  • uninstalling and reinstalling the app
  • adding <uses-permission android:name="android.permission.INTERNET " /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> to the manifest file
  • adding android:usesCleartextTraffic="true" to the manifest file
  • using both the built in android studio emulator and my own phone (Google Pixel 4 XL)
  • trying different methods of connecting to the server as shown below

The first way I tried using volley:

StringRequest stringRequest = new StringRequest(Request.Method.POST, URL,
            new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    try
                    {
                        JSONObject jsonObject = new JSONObject(response);
                        String success = jsonObject.getString("success");
                        if(success.equals("1"))
                        {
                            Toast.makeText(RegisterActivity.this, "Registration Successful", Toast.LENGTH_SHORT).show();
                        }
                    } catch (JSONException e) {
                        e.printStackTrace();
                        Toast.makeText(RegisterActivity.this, "Registration Error! Error inserting values to db" + e.toString(), Toast.LENGTH_SHORT).show();
                        loading.setVisibility(View.GONE);
                        registerButton.setVisibility(View.VISIBLE);
                    }
                }
            },
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    error.printStackTrace();
                    Toast.makeText(RegisterActivity.this, "Registration Error! error connecting to db " + error.toString(), Toast.LENGTH_SHORT).show();
                    error.printStackTrace();
                    loading.setVisibility(View.GONE);
                    registerButton.setVisibility(View.VISIBLE);
                }
            })
    {
        @Override
        protected Map<String, String> getParams() throws AuthFailureError {
            Map<String,String> params = new HashMap<>();
            params.put("name",name);
            params.put("emailAddress",emailAddress);
            params.put("password",password);
            params.put("postalAddress",postalAddress);
            params.put("phoneNumber",phoneNumber);
            params.put("bloodType",bloodType);

            return params;
        }
    };

    RequestQueue requestQueue = Volley.newRequestQueue(this);
    requestQueue.add(stringRequest); */

}

The second way using httpURLConnection:

//make button invisible and make loading widget visible
    loading.setVisibility(View.VISIBLE);
    registerButton.setVisibility(View.GONE);

    //get inputs and convert to strings
    final String name = this.nameInput.getText().toString().trim();
    final String emailAddress = this.emailAddressInput.getText().toString().trim();
    final String password = this.passwordInput.getText().toString().trim();
   // final String confirmPassword = this.confirmPasswordInput.getText().toString().trim();
    final String postalAddress = this.addressInput.getText().toString().trim();
    final String phoneNumber = this.nameInput.getText().toString().trim();
   // final int phoneNumber = Integer.parseInt(this.nameInput.getText().toString().trim());
    final String bloodType = bloodTypeInput.getSelectedItem().toString().trim();


    class RegisterClass extends AsyncTask<String,Void,String>{

        @Override
        protected void onPreExecute()
        {
            super.onPreExecute();
        }
        @Override
        protected void onPostExecute(String httpResponseMsg)
        {

        }
        @Override
        protected String doInBackground(String... params) {
            hashMap.put("name",params[0]);
            hashMap.put("emailAddress",params[1]);
            hashMap.put("password",params[2]);
            hashMap.put("postalAddress",params[3]);
            hashMap.put("phoneNumber",params[4]);
            hashMap.put("bloodType",params[5]);

            String finalResult = httpParse.postRequest(hashMap,URL);

            return finalResult;
        }
    }

    RegisterClass registerClass = new RegisterClass();

    registerClass.execute(name,emailAddress,password,postalAddress,phoneNumber,bloodType);

edit

Stack trace for httpURLConnection:

    W/System.err: java.net.SocketException: socket failed: EPERM (Operation not permitted)
        at java.net.Socket.createImpl(Socket.java:492)
        at java.net.Socket.getImpl(Socket.java:552)
        at java.net.Socket.setSoTimeout(Socket.java:1180)
        at com.android.okhttp.internal.io.RealConnection.connectSocket(RealConnection.java:143)
W/System.err:     at com.android.okhttp.internal.io.RealConnection.connect(RealConnection.java:116)
        at com.android.okhttp.internal.http.StreamAllocation.findConnection(StreamAllocation.java:186)
        at com.android.okhttp.internal.http.StreamAllocation.findHealthyConnection(StreamAllocation.java:128)
        at com.android.okhttp.internal.http.StreamAllocation.newStream(StreamAllocation.java:97)
        at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:289)
        at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:232)
        at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:465)
        at com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:131)
        at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:262)
        at com.example.blooddonorsystem.HttpParse.postRequest(HttpParse.java:37)
        at com.example.blooddonorsystem.RegisterActivity$1RegisterClass.doInBackground(RegisterActivity.java:136)
        at com.example.blooddonorsystem.RegisterActivity$1RegisterClass.doInBackground(RegisterActivity.java:115)
        at android.os.AsyncTask$3.call(AsyncTask.java:378)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:289)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
        at java.lang.Thread.run(Thread.java:919)

stack trace for volley:

W/System.err: com.android.volley.NoConnectionError: java.net.SocketException: socket failed: EPERM (Operation not permitted)
    at com.android.volley.toolbox.BasicNetwork.performRequest(BasicNetwork.java:177)
    at com.android.volley.NetworkDispatcher.processRequest(NetworkDispatcher.java:120)
    at com.android.volley.NetworkDispatcher.run(NetworkDispatcher.java:87)
Caused by: java.net.SocketException: socket failed: EPERM (Operation not permitted)
    at java.net.Socket.createImpl(Socket.java:492)
    at java.net.Socket.getImpl(Socket.java:552)
    at java.net.Socket.setSoTimeout(Socket.java:1180)
    at com.android.okhttp.internal.io.RealConnection.connectSocket(RealConnection.java:143)
    at com.android.okhttp.internal.io.RealConnection.connect(RealConnection.java:116)
    at com.android.okhttp.internal.http.StreamAllocation.findConnection(StreamAllocation.java:186)
    at com.android.okhttp.internal.http.StreamAllocation.findHealthyConnection(StreamAllocation.java:128)
    at com.android.okhttp.internal.http.StreamAllocation.newStream(StreamAllocation.java:97)
    at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:289)
    at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:232)
    at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:465)
    at com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:131)
    at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:262)
    at com.android.volley.toolbox.HurlStack.addBody(HurlStack.java:259)
    at com.android.volley.toolbox.HurlStack.addBodyIfExists(HurlStack.java:247)
    at com.android.volley.toolbox.HurlStack.setConnectionParametersForRequest(HurlStack.java:219)
    at com.android.volley.toolbox.HurlStack.executeRequest(HurlStack.java:97)
    at com.android.volley.toolbox.BasicNetwork.performRequest(BasicNetwork.java:131)
    ... 2 more
Tavian T
  • 27
  • 7
  • Could you post the complete stack trace for one or both of your attempts? – CommonsWare Apr 05 '20 at 18:44
  • @CommonsWare completely forgot about that my bad. – Tavian T Apr 05 '20 at 18:55
  • That feels like the `INTERNET` permission is not taking effect. Usually the error mentions "cleartext" if it were a cleartext traffic problem. Is your `INTERNET` permission element a child of the root `` element? – CommonsWare Apr 05 '20 at 18:57
  • not sure what you mean but this is the top of my manifest file where the internet permission is located // – Tavian T Apr 05 '20 at 19:04
  • That too looks normal. Try changing your URL to one that is for some general public Web page, even if it's not JSON. If you get the same error, then the server/URL is not the problem. If, instead, you get a JSON parsing error, then there is something about your server or the URL that is the source of your difficulty. – CommonsWare Apr 05 '20 at 19:09
  • I get this when i change it to a random http webpage // W/System.err: com.android.volley.NoConnectionError: java.io.IOException: Cleartext HTTP traffic to cassidymae.myspecies.info not permitted at com.android.volley.toolbox.BasicNetwork.performRequest(BasicNetwork.java:177) at com.android.volley.NetworkDispatcher.processRequest(NetworkDispatcher.java:120) at com.android.volley.NetworkDispatcher.run(NetworkDispatcher.java:87) Caused by: java.io.IOException: Cleartext HTTP traffic to cassidymae.myspecies.info not permitted at com.android.okhttp.HttpHandl – Tavian T Apr 05 '20 at 19:17
  • had to shorten it due to character constraints – Tavian T Apr 05 '20 at 19:17
  • OK, that's the sign of an `http` URL. So, your original URL is simply not accessible for some reason. I don't know why -- perhaps it is only set up to accept requests from `localhost` or something. – CommonsWare Apr 05 '20 at 19:54
  • I used the command ufw allow proto tcp from any to any port 80,443 in the terminal for the server so that should allow http to work correctly. Also accessing the webpages from my phone typing in the ip addresses work fine too – Tavian T Apr 05 '20 at 20:09
  • `¯\_(ツ)_/¯`. All I can tell you is that the apps are not liking that URL for some reason. – CommonsWare Apr 05 '20 at 20:12
  • use postman or other tools to check is params (key - value) are correctly, to ensure – Iqbal Rizky Apr 05 '20 at 22:33
  • what is postman @IqbalRizky – Tavian T Apr 05 '20 at 23:10
  • i used it to check my api call simulation and make sure response are as expected `https://www.postman.com/` – Iqbal Rizky Apr 05 '20 at 23:12
  • @IqbalRizky so I installed postman to check the params and it returns the error message (success: 0, message: error) which means it's either not connecting to the database or not inserting correctly right? – Tavian T Apr 06 '20 at 12:14
  • thank you for the postman recommendation, it did not fix my initial problem but I managed to fix problems I would've encountered down the line – Tavian T Apr 06 '20 at 12:51

0 Answers0