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();
}
}
}
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.