InputStream is = conn.getInputStream() doesn't get Datastream --> App-crash

1k views Asked by At

This is a code from Digi Device Cloud slightly modified. I don't get any Inputstream, so my App crash. I'm trying to display the data from Digi Device on my Android App. Trying to debug it the App work smoothly until it get to

InputStream is = conn.getInputStream();.

I get in Debugger:

com.android.okhttp.internal.http.HttpsURLConnectionImpl$HttpUrlConnectionDelegate:https://devicecloud.digi.com/ws/DataStream/00000000-00000000-00409DFF-FF60FE08/xbee.serialIn. After this line it jumps directly to catch (Exception e).

Looking in getInputStream() it seems like it don't get override. I already searched here because of this problem, but couldn't find a solution, maybe I just overlooked something.

public InputStream getInputStream() throws IOException {
    throw new UnknownServiceException("Does not support writing to the input stream");
}

Here is the code:

public class InputXML extends ActionBarActivity {

    TextView view_xml;
    private String encodedAuthorization,responseContent;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_input_xml);

        XMLreference();
        String request = getRequest().toString();
        view_xml.setText(request);

    }

        /**
         * Run the web service request
         */
        public String getRequest() {
            HttpsURLConnection conn = null;

            final String username = "username"; // put your Device Cloud username here
            final String password = "password"; // put your Device Cloud password here

            try {
                // Create url to the Device Cloud server for a given web service request
                URL url = new URL("https://devicecloud.digi.com/ws/DataStream/00000000-00000000-00409DFF-FF60FE08/xbee.serialIn");
                conn = (HttpsURLConnection) url.openConnection();
                conn.setDoOutput(true);
                conn.setDoInput(true);
                conn.setRequestMethod("GET");

                // Build authentication string
                String userpassword = username + ":" + password;

                // can change this to use a different base64 encoder
                // String encodedAuthorization =  Base64.encodeBase64String(userpassword.getBytes()).trim();
                byte[] data = null;
                try {
                    data = userpassword.getBytes("UTF-8");
                } catch (UnsupportedEncodingException e1) {
                    e1.printStackTrace();
                }

                encodedAuthorization = Base64.encodeToString(data, Base64.DEFAULT).trim();


                // set request headers
                conn.setRequestProperty("Authorization", "Basic "
                        + encodedAuthorization);
                // Get input stream from response and convert to String
                InputStream is = conn.getInputStream();

                Scanner isScanner = new Scanner(is);
                StringBuffer buf = new StringBuffer();
                while (isScanner.hasNextLine()) {
                    buf.append(isScanner.nextLine() + "\n");
                    Toast.makeText(getBaseContext(),"in while schleife",Toast.LENGTH_LONG);
                }
                responseContent = buf.toString();

                // add line returns between tags to make it a bit more readable
                responseContent = responseContent.replaceAll("><", ">\n<");
                //responseContent = "Es übergibt weiter";

                // Output response to standard out
                System.out.println(responseContent);
            } catch (Exception e) {
                // Print any exceptions that occur
                e.printStackTrace();
            } finally {
                if (conn != null)
                    conn.disconnect();
            }
            return responseContent;
        }



    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_input_xml, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    public void XMLreference(){
        view_xml = (TextView) findViewById(R.id.view_xml);
    }
}

If it helps, here is the original code:

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import javax.net.ssl.HttpsURLConnection;
import java.net.URL;
import java.util.Scanner;

/* Can replace this with any base 64 encoder for basic authentication. For java 6 
 * installations on Sun's JRE you can use "sun.misc.BASE64Encoder" however this will 
 * not work in some installations (using OpenJDK).  Java mail 
 * (javax.mail.internet.MimeUtility) also contains a Base 64 encoder in Java 6.  A 
 * public domain version exists at http://iharder.sourceforge.net/current/java/base64/
 */
import org.apache.commons.codec.binary.Base64;

/**
 * This is a stub class with a main method to run a Device Cloud web service.
 */
public class WebServiceRequest {
    private static final String username = "username"; // put your Device Cloud username here
    private static final String password = "password"; // put your Device Cloud password here

    /**
     * Run the web service request
     */
    public static void main(String[] args) {
        HttpsURLConnection conn = null;

        try {
            // Create url to the Device Cloud server for a given web service request
            URL url = new URL("https://devicecloud.digi.com/ws/DataStream/00000000-00000000-00409DFF-FF60FE08/xbee.serialIn");
            conn = (HttpsURLConnection) url.openConnection(); 
            conn.setDoOutput(true);
            conn.setDoInput(true);
            conn.setRequestMethod("GET"); 

            // Build authentication string
            String userpassword = username + ":" + password;

            // can change this to use a different base64 encoder
            String encodedAuthorization = Base64.encodeBase64String(userpassword.getBytes()).trim();

            // set request headers
            conn.setRequestProperty("Authorization", "Basic "
                    + encodedAuthorization);
// Get input stream from response and convert to String
            InputStream is = conn.getInputStream();

            Scanner isScanner = new Scanner(is);
            StringBuffer buf = new StringBuffer();
            while (isScanner.hasNextLine()) {
                buf.append(isScanner.nextLine() + "\n");
            }
            String responseContent = buf.toString();

            // add line returns between tags to make it a bit more readable
            responseContent = responseContent.replaceAll("><", ">\n<");

            // Output response to standard out
            System.out.println(responseContent);
        } catch (Exception e) {
            // Print any exceptions that occur
            e.printStackTrace();
        } finally {
            if (conn != null)
                conn.disconnect();
        }
    }
}
1

There are 1 answers

3
Mousa Jafari On

You can't perform Http operations in main thread! you should do that on a separate thread and pass the result to the main thread.