cosc 4730
DESCRIPTION
cosc 4730. Brief return Sockets And HttpClient (and with AsyncTask ) DownloadManager. Android. Networking is based on standard Java SE methods And get the BufferedReader / PrintWriter Most Java SE network code works with almost no modifications. . typical Android network code. - PowerPoint PPT PresentationTRANSCRIPT
![Page 1: cosc 4730](https://reader033.vdocument.in/reader033/viewer/2022051219/568164a1550346895dd6948e/html5/thumbnails/1.jpg)
cosc 4730
Brief return SocketsAnd HttpURLConnection (and with AsyncTask)
DownloadManager
![Page 2: cosc 4730](https://reader033.vdocument.in/reader033/viewer/2022051219/568164a1550346895dd6948e/html5/thumbnails/2.jpg)
Android
• Networking is based on standard Java SE methods– And get the BufferedReader/PrintWriter– Most Java SE network code works with almost no
modifications.
![Page 3: cosc 4730](https://reader033.vdocument.in/reader033/viewer/2022051219/568164a1550346895dd6948e/html5/thumbnails/3.jpg)
typical Android network code.try {
InetAddress serverAddr = InetAddress.getByName(host);//make the connectionSocket socket = new Socket(serverAddr, port);String message = "Hello from Client android emulator";
try {//receive a messagePrintWriter out = new PrintWriter( new BufferedWriter( new OutputStreamWriter(socket.getOutputStream())),
true);out.println(message);//send a message nowBufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String str = in.readLine(); } catch(Exception e) {
//error! } finally { socket.close(); in.close(); out.close(); } } catch (Exception e) { //unable to connect }
![Page 4: cosc 4730](https://reader033.vdocument.in/reader033/viewer/2022051219/568164a1550346895dd6948e/html5/thumbnails/4.jpg)
Android Client Code
• Making a connection, the code is pretty straight forward
String hostname = “localhost”; // remote machineInt port = 3012; //remote port number
//make the connectionInetAddress serverAddr = InetAddress.getByName(hostname);Socket socket = new Socket(serverAddr, port);//now we have a connection to the server
![Page 5: cosc 4730](https://reader033.vdocument.in/reader033/viewer/2022051219/568164a1550346895dd6948e/html5/thumbnails/5.jpg)
Android Server Code
• Again pretty straight forwardInt port = 3012; //this is the local port number//create the server socketServerSocket serverSocket = new ServerSocket(port);//wait for a client to connectSocket socket = serverSocket.accept();//now we have a connection to the client.
![Page 6: cosc 4730](https://reader033.vdocument.in/reader033/viewer/2022051219/568164a1550346895dd6948e/html5/thumbnails/6.jpg)
Reading and writing.• This works for both client and server.• Once we have the socket connection, we need to get the
read and write part of the socket.//Write sidePrintWriter out = new PrintWriter( new BufferedWriter( new OutputStreamWriter( socket.getOutputStream())),true);
– Note the true, turns on autoflush.
//Read side.BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
![Page 7: cosc 4730](https://reader033.vdocument.in/reader033/viewer/2022051219/568164a1550346895dd6948e/html5/thumbnails/7.jpg)
PrintWriter
• Networking is normally a text based protocol.– So while there are many function to send int, long,
etc. I’m ignoring them.– out.print(String) and out.println(String)• They both do the same thing, send a line of text.
println will add an end of line marker.• This is important for the read side.
![Page 8: cosc 4730](https://reader033.vdocument.in/reader033/viewer/2022051219/568164a1550346895dd6948e/html5/thumbnails/8.jpg)
BufferedReader
• The read method reads a single character and returns it as a int.– Second version uses a length and char[].
• readLine() returns line of text as a string. It stops at the end of line marker.– Back to the print and println methods for the writer.
• There is a ready() methods that return true or false. True if there is a data to be read, false other. Using the read() and ready() allows to prevent blocking reads. – Example: if (in.read()) { read() } else { do something else}
![Page 9: cosc 4730](https://reader033.vdocument.in/reader033/viewer/2022051219/568164a1550346895dd6948e/html5/thumbnails/9.jpg)
Lastly.
• Don’t forget to close everything when you are done with the network.
in.close(); out.close();socket.close();
![Page 10: cosc 4730](https://reader033.vdocument.in/reader033/viewer/2022051219/568164a1550346895dd6948e/html5/thumbnails/10.jpg)
Android example code
• There is a TCPclient and TCPServ examples for the android– For the sever code you will need to tell the
emulator to accept the port number– In android-sdk-windows\tools directory, run the
following dos command• adb forward tcp:3012 tcp:3012
– assuming you are using port 3012
![Page 11: cosc 4730](https://reader033.vdocument.in/reader033/viewer/2022051219/568164a1550346895dd6948e/html5/thumbnails/11.jpg)
Android notes
• You will need to put – <uses-permission android:name=
"android.permission.INTERNET" /> – In the AndroidManifest.xml file
• At this point you should be able to use it in both the simulator and on the phone.
![Page 12: cosc 4730](https://reader033.vdocument.in/reader033/viewer/2022051219/568164a1550346895dd6948e/html5/thumbnails/12.jpg)
Last Note.
• You must connect your phone to UW’s UWyo wireless network to talk to a local cosc machine.– See http://
www.uwyo.edu/askit/displaydoc.asp?askitdocid=1769&parentid=1 for help.
![Page 13: cosc 4730](https://reader033.vdocument.in/reader033/viewer/2022051219/568164a1550346895dd6948e/html5/thumbnails/13.jpg)
AndroidManifest.xml<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.cosc4730.TCPclient" android:versionCode="1" android:versionName="1.0"> <uses-permission android:name="android.permission.INTERNET" /> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".TCPclient" android:label="@string/app_name">
<intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
</application> <uses-sdk android:minSdkVersion="10" android:targetSdkVersion="20"/></manifest>
![Page 14: cosc 4730](https://reader033.vdocument.in/reader033/viewer/2022051219/568164a1550346895dd6948e/html5/thumbnails/14.jpg)
Networking
• Android networking is built on standard Java SE – So use the same network code you learned earlier.
– See the source code example, Android TCPclient and TCPserv for examples that run on the Android platform.
![Page 15: cosc 4730](https://reader033.vdocument.in/reader033/viewer/2022051219/568164a1550346895dd6948e/html5/thumbnails/15.jpg)
simulator
• For server code, you need to tell the simulator to accept the port number
• In android-sdk-windows\tools directory, run the following dos command– adb forward tcp:3012 tcp:3012• assuming you are using port 3012
![Page 16: cosc 4730](https://reader033.vdocument.in/reader033/viewer/2022051219/568164a1550346895dd6948e/html5/thumbnails/16.jpg)
References
• Android dev site of course – http://developer.android.com/intl/zh-CN/
reference/android/net/package-summary.html• Socket programming tutorial.
http://www.anddev.org/socket_programming-t325-s30.html
![Page 17: cosc 4730](https://reader033.vdocument.in/reader033/viewer/2022051219/568164a1550346895dd6948e/html5/thumbnails/17.jpg)
Main thread and network.
• Networking can take some time and should not be done on the main thread– Ie it can lock up the drawing.
• As of v11 (honeycomb)– It will force close if you attempt networking on the
main thread.• It must be done in a thread
– Or a AsyncTask
![Page 18: cosc 4730](https://reader033.vdocument.in/reader033/viewer/2022051219/568164a1550346895dd6948e/html5/thumbnails/18.jpg)
HTTPURLCONNECTION
![Page 19: cosc 4730](https://reader033.vdocument.in/reader033/viewer/2022051219/568164a1550346895dd6948e/html5/thumbnails/19.jpg)
HttpURLConnection
• An URLConnection for HTTP (RFC 2616) used to send and receive data over the web. – Data may be of any type and length. This class may
be used to send and receive streaming data whose length is not known in advance.
– Requests can be setup to include credentials, content types, and session cookies.
![Page 20: cosc 4730](https://reader033.vdocument.in/reader033/viewer/2022051219/568164a1550346895dd6948e/html5/thumbnails/20.jpg)
Use• Obtain a new HttpURLConnection by calling URL.openConnection() and casting
the result to HttpURLConnection.– Prepare the request. The primary property of a request is its URI. Request headers may
also include metadata such as credentials, preferred content types, and session cookies.– Optionally upload a request body. Instances must be configured with setDoOutput(true)
if they include a request body. Transmit data by writing to the stream returned by getOutputStream().
• Read the response. – Response headers typically include metadata such as the response body's content type
and length, modified dates and session cookies. • The response body may be read from the stream returned by getInputStream().
– If the response has no body, that method returns an empty stream.• disconnect().
– Disconnecting releases the resources held by a connection so they may be closed or reused.
![Page 21: cosc 4730](https://reader033.vdocument.in/reader033/viewer/2022051219/568164a1550346895dd6948e/html5/thumbnails/21.jpg)
Example get• HttpURLConnection con = (HttpURLConnection)
url.openConnection();• page = readStream(con.getInputStream());• con.disconnect();• Where readStream is method to read the InputStream. It may look
something like this:• StringBuilder sb = new StringBuilder("");• reader = new BufferedReader(new InputStreamReader(in));• while ((line = reader.readLine()) != null) {• sb.append(line + “\n”);• }• Return sb.tostring();
![Page 22: cosc 4730](https://reader033.vdocument.in/reader033/viewer/2022051219/568164a1550346895dd6948e/html5/thumbnails/22.jpg)
Authentication• If the website uses basic authentication (instead of
username/password login system of it’s own)• Setup the authenticator before the connection and you have
login for you.Authenticator.setDefault(new Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(username, password.toCharArray()); });• Where both username and password are Strings.
![Page 23: cosc 4730](https://reader033.vdocument.in/reader033/viewer/2022051219/568164a1550346895dd6948e/html5/thumbnails/23.jpg)
Authentication login systems
• Where the website uses logins and cookies, setup the and use the cookie manager.– Normally use a login page, which will set a cookie
on the “browser”, in our case we use the CookieManager.
• CookieManager cookieManager = new CookieManager();
• CookieHandler.setDefault(cookieManager);
![Page 24: cosc 4730](https://reader033.vdocument.in/reader033/viewer/2022051219/568164a1550346895dd6948e/html5/thumbnails/24.jpg)
Post methods.• While get is easy, post methods are harder.conn = … url.openConnection();conn.setDoOutput(true); //there is outputcon.setChunkedStreamingMode(0); //write as we goOutputStream out = new BufferedOutputStream(urlConnection.getOutputStream());• Write out the parameters correctly for a post method.
– This is shown in the ReST API code.out.flush();//ensure all the data is written out.out.close();//close this side, we are done here.• Now read as before.
![Page 25: cosc 4730](https://reader033.vdocument.in/reader033/viewer/2022051219/568164a1550346895dd6948e/html5/thumbnails/25.jpg)
ASYNCTASKA second look.
![Page 26: cosc 4730](https://reader033.vdocument.in/reader033/viewer/2022051219/568164a1550346895dd6948e/html5/thumbnails/26.jpg)
AsyncTask
• Networking can’t be used on the main thread, so an AsyncTask can be ideal for short networking tasks, say file downloads or other things.– otherwise you should use threads and handlers.
![Page 27: cosc 4730](https://reader033.vdocument.in/reader033/viewer/2022051219/568164a1550346895dd6948e/html5/thumbnails/27.jpg)
AsyncTask download Example private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> { protected Long doInBackground(URL... urls) { int count = urls.length; long totalSize = 0; for (int i = 0; i < count; i++) { totalSize += Downloader.downloadFile(urls[i]); publishProgress((int) ((i / (float) count) * 100)); // Escape early if cancel() is called if (isCancelled()) break; } return totalSize; } //background thread
protected void onProgressUpdate(Integer... progress) { setProgressPercent(progress[0]); } //UI thread
protected void onPostExecute(Long result) { showDialog("Downloaded " + result + " bytes"); } //UI thread }• Once created, a task is executed very simply:new DownloadFilesTask().execute(url1, url2, url3);
URL is pamaters to doInBackground
Integer is the value for publishProgress and onProgressUpdate
And Long is the return value and parameter to onPostExecute
The call, uses URL to create the “list” used in doInBackground
![Page 28: cosc 4730](https://reader033.vdocument.in/reader033/viewer/2022051219/568164a1550346895dd6948e/html5/thumbnails/28.jpg)
more examples
• See the GitHub page pages for the rest of the source code for the examples.
• Both examples do the same thing except– HttpURLConDemoThread uses threads– HttpURLConDemoAysnc uses AsyncTask
![Page 29: cosc 4730](https://reader033.vdocument.in/reader033/viewer/2022051219/568164a1550346895dd6948e/html5/thumbnails/29.jpg)
DOWNLOADMANGER (API 9+)
![Page 30: cosc 4730](https://reader033.vdocument.in/reader033/viewer/2022051219/568164a1550346895dd6948e/html5/thumbnails/30.jpg)
DownloadManager
• The download manager is a system service that handles long-running HTTP downloads.– Clients may request that a URI be downloaded to a
particular destination file. • The download manager will conduct the download
in the background, taking care of HTTP interactions and retrying downloads after failures or across connectivity changes and system reboots.
• Note that the application must have the INTERNET permission to use this class.
![Page 31: cosc 4730](https://reader033.vdocument.in/reader033/viewer/2022051219/568164a1550346895dd6948e/html5/thumbnails/31.jpg)
How it works• Get the service via getSystemServiceDownloadManager downloadManager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);• Make a request via the request methodsDownloadManager.Request request = new DownloadManager.Request(URI)long download_id = downloadManager.enqueue(request);• Setup a broadcastReciever to receive an broadcast when it’s done.
– The downloadmanager uses the download_id number, so you need to store it for use in the receiver.• The intent will contain the id number for the file downloaded, so you know
which one (when downloading more then one at a time.)
![Page 32: cosc 4730](https://reader033.vdocument.in/reader033/viewer/2022051219/568164a1550346895dd6948e/html5/thumbnails/32.jpg)
DownloadManager.Request(URI)• Request has a lot of parameters you can set
– .setAllowedNetworkTypes( DownloadManager.Request.NETWORK_WIFI | DownloadManager.Request.NETWORK_MOBILE)• All networks by default
– setDescription( String)– setTitle (CharSequence title)
• Sets the title and description for the notification line if enabled– setShowRunningNotification (boolean)
• Show notification, true. Deprecated for api 11+• setNotificationVisibility (int visibility)
– VISIBILITY_HIDDEN, VISIBILITY_VISIBLE, VISIBILITY_VISIBLE_NOTIFY_COMPLETED.– If hidden, this requires the permission
android.permission.DOWNLOAD_WITHOUT_NOTIFICATION.
A note, setShowRunningNotification(false) didn’t work on 4.1.x
![Page 33: cosc 4730](https://reader033.vdocument.in/reader033/viewer/2022051219/568164a1550346895dd6948e/html5/thumbnails/33.jpg)
DownloadManager.Request(URI) (2)
• setDestinationInExternalFilesDir (String dirType, String subPath)– dirType is the directory type to pass to
getExternalStoragePublicDirectory(String)– subPath is the path within the external directory, including the
destination filename– Example:– .setDestinationInExternalPublicDir(Environment.DIRECTORY_DO
WNLOADS, "nasapic.jpg");• allowScanningByMediaScanner ()
– If setting above, add this so the media scanner is called as well.
![Page 34: cosc 4730](https://reader033.vdocument.in/reader033/viewer/2022051219/568164a1550346895dd6948e/html5/thumbnails/34.jpg)
Receiver• Set to receive DownloadManager.ACTION_DOWNLOAD_COMPLETE
• Since we don’t allows want to get download notifications, we set this on up dyanamically in onResume/OnPause
IntentFilter intentFilter = new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE);registerReceiver(downloadReceiver, intentFilter);
• Where downloadReceiver is our methodunregisterReceiver(downloadReceiver);
![Page 35: cosc 4730](https://reader033.vdocument.in/reader033/viewer/2022051219/568164a1550346895dd6948e/html5/thumbnails/35.jpg)
DownloaderManager.Query
• In the receiver, we deal with the query methods to find out the status of the download– Successful or failure– Based on the download_id (which we can get from
the intent or keep from the enqueue method)– We filter and get a Cursor with the information
![Page 36: cosc 4730](https://reader033.vdocument.in/reader033/viewer/2022051219/568164a1550346895dd6948e/html5/thumbnails/36.jpg)
DownloaderManager.Query (2)
DownloadManager.Query query = new DownloadManager.Query();query.setFilterById(intentdownloadId);Cursor cursor = downloadManager.query(query);• The example code shows you how to get the
columns and information out of the cursor, including a file, so you can read the downloaded file.
![Page 37: cosc 4730](https://reader033.vdocument.in/reader033/viewer/2022051219/568164a1550346895dd6948e/html5/thumbnails/37.jpg)
Example code
• DownloadDemo– MainActivity has two buttons. One downloads
and shows the notification, the second doesn’t– MainActivityORG stores the download_id in
preferences, instead of a variable.
![Page 38: cosc 4730](https://reader033.vdocument.in/reader033/viewer/2022051219/568164a1550346895dd6948e/html5/thumbnails/38.jpg)
References• http://
developer.android.com/reference/java/net/HttpURLConnection.html– And sub pages, click the links to find them.
• Download Manager– http://
developer.android.com/reference/android/app/DownloadManager.html
– http://stackoverflow.com/questions/7239996/android-downloadmanager-api-opening-file-after-download
– http://blog.vogella.com/2011/06/14/android-downloadmanager-example/
![Page 39: cosc 4730](https://reader033.vdocument.in/reader033/viewer/2022051219/568164a1550346895dd6948e/html5/thumbnails/39.jpg)
QA&