request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI);
In this example of DownloadManager we will cover the following topics
- Start a JSON file download
- Ability to cancel the download
- Display all downloads
- Query the status of our download
- Attach a BroadcastReceiver to get notification when download completes
- Ability to restrict download under certain network conditions only
- Specify Title and Description for the download
- Download data into the External Directory and specify file name
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Android Manifest
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.as400samplecode"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="15"
android:targetSdkVersion="15" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".DownloadDataActivity"
android:label="@string/title_activity_download_data" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Screen Layout
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">>
<Button
android:id="@+id/startDownload"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Start Downloading my File" />
<Button
android:id="@+id/displayDownload"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Display all Downloads" />
<Button
android:id="@+id/checkStatus"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Check Status of Download" />
<Button
android:id="@+id/cancelDownload"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Cancel the current Download" />
<ScrollView
android:id="@+id/scrollView1"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<TextView
android:id="@+id/countryData"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium" />
</LinearLayout>
</ScrollView>
</LinearLayout>
Java Object for Country
package com.as400samplecode;
public class Country {
String code = null;
String name = null;
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
DownloadManager Activity
package com.as400samplecode;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import com.google.gson.Gson;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.os.ParcelFileDescriptor;
import android.app.Activity;
import android.app.DownloadManager;
import android.app.DownloadManager.Query;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.database.Cursor;
import android.view.Gravity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
public class DownloadDataActivity extends Activity implements OnClickListener{
private DownloadManager downloadManager;
private long downloadReference;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_download_data);
//start download button
Button startDownload = (Button) findViewById(R.id.startDownload);
startDownload.setOnClickListener(this);
//display all download button
Button displayDownload = (Button) findViewById(R.id.displayDownload);
displayDownload.setOnClickListener(this);
//check download status button
Button checkStatus = (Button) findViewById(R.id.checkStatus);
checkStatus.setOnClickListener(this);
checkStatus.setEnabled(false);
//cancel download button
Button cancelDownload = (Button) findViewById(R.id.cancelDownload);
cancelDownload.setOnClickListener(this);
cancelDownload.setEnabled(false);
//set filter to only when download is complete and register broadcast receiver
IntentFilter filter = new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE);
registerReceiver(downloadReceiver, filter);
}
public void onClick(View v) {
switch (v.getId()) {
//start the download process
case R.id.startDownload:
downloadManager = (DownloadManager)getSystemService(DOWNLOAD_SERVICE);
Uri Download_Uri = Uri.parse("http://demo.mysamplecode.com/Sencha_Touch/CountryServlet?start=0&limit=999");
DownloadManager.Request request = new DownloadManager.Request(Download_Uri);
//Restrict the types of networks over which this download may proceed.
request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI | DownloadManager.Request.NETWORK_MOBILE);
//Set whether this download may proceed over a roaming connection.
request.setAllowedOverRoaming(false);
//Set the title of this download, to be displayed in notifications (if enabled).
request.setTitle("My Data Download");
//Set a description of this download, to be displayed in notifications (if enabled)
request.setDescription("Android Data download using DownloadManager.");
//Set the local destination for the downloaded file to a path within the application's external files directory
request.setDestinationInExternalFilesDir(this,Environment.DIRECTORY_DOWNLOADS,"CountryList.json");
//Enqueue a new download and same the referenceId
downloadReference = downloadManager.enqueue(request);
TextView showCountries = (TextView) findViewById(R.id.countryData);
showCountries.setText("Getting data from Server, Please WAIT...");
Button checkStatus = (Button) findViewById(R.id.checkStatus);
checkStatus.setEnabled(true);
Button cancelDownload = (Button) findViewById(R.id.cancelDownload);
cancelDownload.setEnabled(true);
break;
//display all downloads
case R.id.displayDownload:
Intent intent = new Intent();
intent.setAction(DownloadManager.ACTION_VIEW_DOWNLOADS);
startActivity(intent);
break;
//check the status of a download
case R.id.checkStatus:
Query myDownloadQuery = new Query();
//set the query filter to our previously Enqueued download
myDownloadQuery.setFilterById(downloadReference);
//Query the download manager about downloads that have been requested.
Cursor cursor = downloadManager.query(myDownloadQuery);
if(cursor.moveToFirst()){
checkStatus(cursor);
}
break;
//cancel the ongoing download
case R.id.cancelDownload:
downloadManager.remove(downloadReference);
checkStatus = (Button) findViewById(R.id.checkStatus);
checkStatus.setEnabled(false);
showCountries = (TextView) findViewById(R.id.countryData);
showCountries.setText("Download of the file cancelled...");
break;
// More buttons go here (if any) ...
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_download_data, menu);
return true;
}
private void checkStatus(Cursor cursor){
//column for status
int columnIndex = cursor.getColumnIndex(DownloadManager.COLUMN_STATUS);
int status = cursor.getInt(columnIndex);
//column for reason code if the download failed or paused
int columnReason = cursor.getColumnIndex(DownloadManager.COLUMN_REASON);
int reason = cursor.getInt(columnReason);
//get the download filename
int filenameIndex = cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_FILENAME);
String filename = cursor.getString(filenameIndex);
String statusText = "";
String reasonText = "";
switch(status){
case DownloadManager.STATUS_FAILED:
statusText = "STATUS_FAILED";
switch(reason){
case DownloadManager.ERROR_CANNOT_RESUME:
reasonText = "ERROR_CANNOT_RESUME";
break;
case DownloadManager.ERROR_DEVICE_NOT_FOUND:
reasonText = "ERROR_DEVICE_NOT_FOUND";
break;
case DownloadManager.ERROR_FILE_ALREADY_EXISTS:
reasonText = "ERROR_FILE_ALREADY_EXISTS";
break;
case DownloadManager.ERROR_FILE_ERROR:
reasonText = "ERROR_FILE_ERROR";
break;
case DownloadManager.ERROR_HTTP_DATA_ERROR:
reasonText = "ERROR_HTTP_DATA_ERROR";
break;
case DownloadManager.ERROR_INSUFFICIENT_SPACE:
reasonText = "ERROR_INSUFFICIENT_SPACE";
break;
case DownloadManager.ERROR_TOO_MANY_REDIRECTS:
reasonText = "ERROR_TOO_MANY_REDIRECTS";
break;
case DownloadManager.ERROR_UNHANDLED_HTTP_CODE:
reasonText = "ERROR_UNHANDLED_HTTP_CODE";
break;
case DownloadManager.ERROR_UNKNOWN:
reasonText = "ERROR_UNKNOWN";
break;
}
break;
case DownloadManager.STATUS_PAUSED:
statusText = "STATUS_PAUSED";
switch(reason){
case DownloadManager.PAUSED_QUEUED_FOR_WIFI:
reasonText = "PAUSED_QUEUED_FOR_WIFI";
break;
case DownloadManager.PAUSED_UNKNOWN:
reasonText = "PAUSED_UNKNOWN";
break;
case DownloadManager.PAUSED_WAITING_FOR_NETWORK:
reasonText = "PAUSED_WAITING_FOR_NETWORK";
break;
case DownloadManager.PAUSED_WAITING_TO_RETRY:
reasonText = "PAUSED_WAITING_TO_RETRY";
break;
}
break;
case DownloadManager.STATUS_PENDING:
statusText = "STATUS_PENDING";
break;
case DownloadManager.STATUS_RUNNING:
statusText = "STATUS_RUNNING";
break;
case DownloadManager.STATUS_SUCCESSFUL:
statusText = "STATUS_SUCCESSFUL";
reasonText = "Filename:\n" + filename;
break;
}
Toast toast = Toast.makeText(DownloadDataActivity.this,
statusText + "\n" +
reasonText,
Toast.LENGTH_LONG);
toast.setGravity(Gravity.TOP, 25, 400);
toast.show();
}
private BroadcastReceiver downloadReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
//check if the broadcast message is for our Enqueued download
long referenceId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1);
if(downloadReference == referenceId){
Button cancelDownload = (Button) findViewById(R.id.cancelDownload);
cancelDownload.setEnabled(false);
int ch;
ParcelFileDescriptor file;
StringBuffer strContent = new StringBuffer("");
StringBuffer countryData = new StringBuffer("");
//parse the JSON data and display on the screen
try {
file = downloadManager.openDownloadedFile(downloadReference);
FileInputStream fileInputStream
= new ParcelFileDescriptor.AutoCloseInputStream(file);
while( (ch = fileInputStream.read()) != -1)
strContent.append((char)ch);
JSONObject responseObj = new JSONObject(strContent.toString());
JSONArray countriesObj = responseObj.getJSONArray("countries");
for (int i=0; i<countriesObj.length(); i++){
Gson gson = new Gson();
String countryInfo = countriesObj.getJSONObject(i).toString();
Country country = gson.fromJson(countryInfo, Country.class);
countryData.append(country.getCode() + ": " + country.getName() +"\n");
}
TextView showCountries = (TextView) findViewById(R.id.countryData);
showCountries.setText(countryData.toString());
Toast toast = Toast.makeText(DownloadDataActivity.this,
"Downloading of data just finished", Toast.LENGTH_LONG);
toast.setGravity(Gravity.TOP, 25, 400);
toast.show();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
}
}
}
};
}






No comments:
Post a Comment
NO JUNK, Please try to keep this clean and related to the topic at hand.
Comments are for users to ask questions, collaborate or improve on existing.