CIS 470 Mobile App Development

Slides:



Advertisements
Similar presentations
Introduction to Java 2 Programming Lecture 7 IO, Files, and URLs.
Advertisements

Android Application Development Tutorial. Topics Lecture 5 Overview Overview of Networking Programming Tutorial 2: Downloading from the Internet.
HTTP and Threads. Download some code I’ve created an Android Project which gives examples of everything covered in this lecture. Download code here.here.
1 CSCE 4013: Mobile Systems Programming Nilanjan Banerjee Mobile Systems Programming (Acknowledgment to Deepa Shinde and Cindy Atheron University of Arkansas.
Appendix F: Network Programming in Java ©SoftMoore ConsultingSlide 1.
Simple Web Services. Internet Basics The Internet is based on a communication protocol named TCP (Transmission Control Protocol) TCP allows programs running.
Application Protocols: HTTP CSNB534 Semester 2, 2007/2008 Asma Shakil.
Mobile Programming Lecture 14 Communicating via the Internet.
Networking: Part 2 (Accessing the Internet). The UI Thread When an application is launched, the system creates a “main” UI thread responsible for handling.
Networking Android Club Networking AsyncTask HttpUrlConnection JSON Parser.
HTTP and Threads. Download some code I’ve created an Android Project which gives examples of everything covered in this lecture. Download code here.here.
1/29/ Android Programming: FrameLayout By Dr. Ramji M. Makwana Professor and Head, Computer Engineering Department A.D. Patel.
Networking: Part 1 (Web Content). Networking with Android Android provides A full-featured web browser based on Chromium, the open source browser engine.
TCS Internal Maps. 2 TCS Internal Objective Objective :  MAPS o Integration of Maps.
Adding network connections. Connecting to the Network To perform the network operations, your application manifest must include the following permissions:
Google map v2.
CMPE419 Mobile Application Development Asst.Prof.Dr.Ahmet Ünveren SPRING Computer Engineering Department Asst.Prof.Dr.Ahmet Ünveren
USING ANDROID WITH THE INTERNET. Slide 2 Lecture Summary Getting network permissions Working with the HTTP protocol Sending HTTP requests Getting results.
Messaging and Networking. Objectives Send SMS messages using the Messaging app Send SMS messages programmatically from within your app Receive and consume.
CMPE419 Mobile Application Development Asst.Prof.Dr.Ahmet Ünveren SPRING Computer Engineering Department Asst.Prof.Dr.Ahmet Ünveren
Introduction to android
Lab7 – Advanced.
Permissions.
Android – Read/Write to External Storage
Picasso Revisted.
CIS 470 Mobile App Development
CIS 470 Mobile App Development
Android Programming Lecture 6
CIS 470 Mobile App Development
CIS 470 Mobile App Development
CIS 470 Mobile App Development
CIS 470 Mobile App Development
CIS 470 Mobile App Development
CIS 470 Mobile App Development
CIS 470 Mobile App Development
CIS 470 Mobile App Development
CIS 470 Mobile App Development
CIS 470 Mobile App Development
null, true, and false are also reserved.
CIS 470 Mobile App Development
URL in Java C343 Lab (Week 13).
Android Sensor Programming
CIS 470 Mobile App Development
CMPE419 Mobile Application Development
CIS 470 Mobile App Development
CIS 470 Mobile App Development
CIS 470 Mobile App Development
CIS 470 Mobile App Development
CIS 470 Mobile App Development
CIS 470 Mobile App Development
CIS 493/EEC 492 Android Sensor Programming
CIS 470 Mobile App Development
CIS 470 Mobile App Development
CIS 470 Mobile App Development
CIS 493/EEC 492 Android Sensor Programming
Mobile Programming Gestures in Android.
CIS 470 Mobile App Development
Adding Components to Activity
Uniform Resource Locator: URL
BLP 4216 MOBİL UYGULAMA GELİŞTİRME-2
// Please Setting App_name to Send Successful
CIS 470 Mobile App Development
Mobile Programming Broadcast Receivers.
Android Sensor Programming
Android Sensor Programming
CIS 694/EEC 693 Android Sensor Programming
CIS 694/EEC 693 Android Sensor Programming
CA16R405 - Mobile Application Development (Theory)
CIS 470 Mobile App Development
CIS 694/EEC 693 Android Sensor Programming
Presentation transcript:

CIS 470 Mobile App Development Lecture 14 Wenbing Zhao Department of Electrical Engineering and Computer Science Cleveland State University wenbing@ieee.org 11/12/2018 CIS 470: Mobile App Development

CIS 470: Mobile App Development Networking How to connect to the web using HTTP How to consume XML web services How to consume JSON web services 11/12/2018 CIS 470: Mobile App Development

Fetch Web Content using HTTP Create a new app as usual and name it Networking Add the INTERNET permission in manifest Add an ImageView in activity_main.xml <uses-permission android:name="android.permission.INTERNET"/> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/activity_main" tools:context="com.wenbing.networking.MainActivity"> <ImageView android:src="@color/material_grey_300" android:layout_width="209dp" android:layout_height="272dp" android:id="@+id/imageView" app:layout_constraintLeft_toLeftOf="@+id/activity_main" app:layout_constraintTop_toTopOf="@+id/activity_main" app:layout_constraintRight_toRightOf="@+id/activity_main" app:layout_constraintBottom_toBottomOf="@+id/activity_main" /> </android.support.constraint.ConstraintLayout> 11/12/2018 CIS 470: Mobile App Development

Fetch Web Content using HTTP import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLConnection; import android.Manifest; import android.content.pm.PackageManager; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.AsyncTask; import android.widget.ImageView; import android.widget.Toast; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import java.io.InputStreamReader; Modify MainActivity.java. We will first fetch an image, then the text/html public class MainActivity extends AppCompatActivity { ImageView img; final private int REQUEST_INTERNET = 123; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if (ContextCompat.checkSelfPermission(this, Manifest.permission.INTERNET) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.INTERNET}, REQUEST_INTERNET); } else{ downloadSomething(); } } 11/12/2018 CIS 470: Mobile App Development

Fetch Web Content using HTTP private void downloadSomething() { String texturl = "http://academic.csuohio.edu/zhao_w/"; String imgurl = "http://2.bp.blogspot.com/-us_u2PBLSOI/UqgPMh7ovjI/AAAAAAAACdI/ujdyGregs6Y/s1600/amazing-butterfly-hd-image.jpg"; new DownloadImageTask().execute(imgurl); new DownloadTextTask().execute(texturl); } @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { switch (requestCode) { case REQUEST_INTERNET: if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { downloadSomething(); } else { Toast.makeText(MainActivity.this, "Permission Denied", Toast.LENGTH_SHORT).show(); } break; default: super.onRequestPermissionsResult(requestCode, permissions, grantResults); } } 11/12/2018 CIS 470: Mobile App Development

CIS 470: Mobile App Development private InputStream OpenHttpConnection(String urlString) throws IOException { InputStream in = null; int response = -1; URL url = new URL(urlString); URLConnection conn = url.openConnection(); if (!(conn instanceof HttpURLConnection)) throw new IOException("Not an HTTP connection"); try{ HttpURLConnection httpConn = (HttpURLConnection) conn; httpConn.setAllowUserInteraction(false); httpConn.setInstanceFollowRedirects(true); httpConn.setRequestMethod("GET"); httpConn.connect(); response = httpConn.getResponseCode(); if (response == HttpURLConnection.HTTP_OK) { in = httpConn.getInputStream(); } } catch (Exception ex) { Log.d("Networking", ex.getLocalizedMessage()); throw new IOException("Error connecting"); } return in; } private InputStream download(String URL) { InputStream in = null; try { in = OpenHttpConnection(URL); return in; } catch (IOException e1) { Log.d("NetworkingActivity", e1.getLocalizedMessage()); } return null; } 11/12/2018 CIS 470: Mobile App Development

CIS 470: Mobile App Development private Bitmap DownloadImage(String URL) { Bitmap bitmap = null; InputStream in = download(URL); if(in != null) { bitmap = BitmapFactory.decodeStream(in); try { in.close(); } catch (IOException e1) { Log.d("NetworkingActivity", e1.getLocalizedMessage()); } } return bitmap; } private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> { protected Bitmap doInBackground(String... urls) { return DownloadImage(urls[0]); } protected void onPostExecute(Bitmap result) { ImageView img = (ImageView) findViewById(R.id.imageView); img.setImageBitmap(result); } } The three periods after the final parameter's type indicate that the final argument may be passed as an array or as a sequence of arguments. Varargs can be used only in the final argument position 11/12/2018 CIS 470: Mobile App Development

CIS 470: Mobile App Development private String DownloadText(String URL) { int BUFFER_SIZE = 2000; InputStream in = download(URL); InputStreamReader isr = new InputStreamReader(in); int charRead; String str = ""; char[] inputBuffer = new char[BUFFER_SIZE]; try { while ((charRead = isr.read(inputBuffer))>0) { String readString = String.copyValueOf(inputBuffer, 0, charRead); str += readString; inputBuffer = new char[BUFFER_SIZE]; } in.close(); } catch (IOException e) { Log.d("Networking", e.getLocalizedMessage()); return ""; } return str; } private class DownloadTextTask extends AsyncTask<String, Void, String> { protected String doInBackground(String... urls) { return DownloadText(urls[0]); } @Override protected void onPostExecute(String result) { Toast.makeText(getBaseContext(), result, Toast.LENGTH_LONG).show(); } } } 11/12/2018 CIS 470: Mobile App Development

Fetch Web Content using HTTP 11/12/2018 CIS 470: Mobile App Development

Accessing Web Services import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import android.util.Log; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLConnection; import android.Manifest; import android.content.pm.PackageManager; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.AsyncTask; import android.widget.ImageView; import android.widget.Toast; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; Create another app and name it WebService Add INTERNET permission in manifest Modify MainActivity.java 11/12/2018 CIS 470: Mobile App Development

Accessing Web Services public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if (ContextCompat.checkSelfPermission(this, Manifest.permission.INTERNET) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.INTERNET}, REQUEST_INTERNET); } else { new AccessWebServiceTask().execute("apple"); } } 11/12/2018 CIS 470: Mobile App Development

Accessing Web Services ImageView img; final private int REQUEST_INTERNET = 123; private InputStream OpenHttpConnection(String urlString) throws IOException { InputStream in = null; int response = -1; URL url = new URL(urlString); URLConnection conn = url.openConnection(); if (!(conn instanceof HttpURLConnection)) throw new IOException("Not an HTTP connection"); try { HttpURLConnection httpConn = (HttpURLConnection) conn; httpConn.setAllowUserInteraction(false); httpConn.setInstanceFollowRedirects(true); httpConn.setRequestMethod("GET"); httpConn.connect(); response = httpConn.getResponseCode(); if (response == HttpURLConnection.HTTP_OK) { in = httpConn.getInputStream(); } } catch (Exception ex) { Log.d("Networking", ex.getLocalizedMessage()); throw new IOException("Error connecting"); } return in; } 11/12/2018 CIS 470: Mobile App Development

CIS 470: Mobile App Development private String WordDefinition(String word) { InputStream in = null; String strDefinition = ""; try { in = OpenHttpConnection( "http://services.aonaware.com" + "/DictService/DictService.asmx/Define?word=" + word); Document doc = null; DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db; try { db = dbf.newDocumentBuilder(); doc = db.parse(in); } catch (ParserConfigurationException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } doc.getDocumentElement().normalize(); NodeList definitionElements = doc.getElementsByTagName("Definition"); for (int i = 0; i < definitionElements.getLength(); i++) { Node itemNode = definitionElements.item(i); if (itemNode.getNodeType() == Node.ELEMENT_NODE) { Element definitionElement = (Element) itemNode; NodeList wordDefinitionElements = (definitionElement).getElementsByTagName("WordDefinition"); strDefinition = ""; for (int j = 0; j < wordDefinitionElements.getLength(); j++) { Node n = wordDefinitionElements.item(j); if (n.getNodeType() == Node.ELEMENT_NODE) { Element wordDefinitionElement = (Element) n; NodeList textNodes = ((Node) wordDefinitionElement).getChildNodes(); strDefinition += ((Node) textNodes.item(0)).getNodeValue() + ". \n"; } } } } } catch (IOException e1) { Log.d("NetworkingActivity", e1.getLocalizedMessage()); } return strDefinition; } 11/12/2018 CIS 470: Mobile App Development

CIS 470: Mobile App Development private class AccessWebServiceTask extends AsyncTask<String, Void, String> { protected String doInBackground(String... urls) { return WordDefinition(urls[0]); } protected void onPostExecute(String result) { Toast.makeText(getBaseContext(), result, Toast.LENGTH_LONG).show(); } } } 11/12/2018 CIS 470: Mobile App Development

Consuming JSON Services [ { "appeId":"1", "survId":"1", "location":"", "surveyDate":"2008-03 14", "surveyTime":"12:19:47", "inputUserId":"1", "inputTime":"2008-03-14 12:21:51", "modifyTime":"0000-00-00 00:00:00” }, "appeId":"2", "survId":"32", "surveyDate":"2008-03-14", "surveyTime":"22:43:09", "inputUserId":"32", "inputTime":"2008-03-14 22:43:37", "modifyTime":"0000-00-00 00:00:00" } ] XML is expensive both for decoding and transmission JSON is a concise representation of XML document Create another app and name it JSON Add INTERNET permission in manifest 11/12/2018 CIS 470: Mobile App Development

Consuming JSON Services import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.os.AsyncTask; import android.util.Log; import android.widget.Toast; import org.json.JSONArray; import org.json.JSONObject; import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); new ReadJSONFeedTask().execute( "http://extjs.org.cn/extjs/examples/grid/survey.html"); } Modify MainActivity.java 11/12/2018 CIS 470: Mobile App Development

Consuming JSON Services public String readJSONFeed(String address) { URL url = null; try { url = new URL(address); } catch (MalformedURLException e) { e.printStackTrace(); }; StringBuilder stringBuilder = new StringBuilder(); HttpURLConnection urlConnection = null; try { urlConnection = (HttpURLConnection) url.openConnection(); } catch (IOException e) { e.printStackTrace(); } try { InputStream content = new BufferedInputStream( urlConnection.getInputStream()); BufferedReader reader = new BufferedReader( new InputStreamReader(content)); String line; while ((line = reader.readLine()) != null) { stringBuilder.append(line); } } catch (IOException e) { e.printStackTrace(); } finally { urlConnection.disconnect(); } return stringBuilder.toString(); } Modify MainActivity.java 11/12/2018 CIS 470: Mobile App Development

Consuming JSON Services private class ReadJSONFeedTask extends AsyncTask<String, Void, String> { protected String doInBackground(String... urls) { return readJSONFeed(urls[0]); } protected void onPostExecute(String result) { try { JSONArray jsonArray = new JSONArray(result); Log.i("JSON", "Number of surveys in feed: " + jsonArray.length()); for (int i = 0; i < jsonArray.length(); i++) { JSONObject jsonObject = jsonArray.getJSONObject(i); Toast.makeText(getBaseContext(), jsonObject.getString("appeId") + " - " + jsonObject.getString("inputTime"), Toast.LENGTH_SHORT).show(); } } catch (Exception e) { e.printStackTrace(); } } } } Modify MainActivity.java 11/12/2018 CIS 470: Mobile App Development

CIS 470: Mobile App Development Exercises (required) Refactor the Networking app: Load a webpage that contains at least one image Analyze the text received and find the <img> component Retrieve the URL for that image and write the downloaded image to a file If there are two or more images, iterate through all of them and save each one to file Optional tasks: Load a webpage that has at least two images Analyze the html page received and fetch every images referenced by the page Store the fetched images in a Bitmap array Display the thumbnail images in a GridView On touching each thumbnail in the GridView, display the full image 11/12/2018 CIS 470: Mobile App Development