I have some code that takes an array of url’s and I have one for file names. The url’s get fed into an async download task and the file names is supposed to be how they are named and saved on the SD card. I believe that it attempts to download the files as they are selected from the spinner but they are not getting saved on the SD card at all. Also, it appears my progress bar doesn’t populate, it shows up but stays at zero. The only reason I am assuming it is attempting to download is because of the length of time it sits on the progress bar for the files, some long some short.
Here is the code:
public class SpinnerActivity extends Activity {
public static final int DIALOG_DOWNLOAD_PROGRESS = 0;
private ProgressDialog mProgressDialog;
Spinner spDownloadFrom;
private ArrayAdapter<CharSequence> spinnerArrayAdapter;
String url[] = {"http://www.becker.cl/bases.pdf",
"http://www.pitt.edu/documents/campusmap0607.pdf", "http://www.aara.ca/reg3317/web_page_doc.pdf",
"www.dataprotection.ie/documents/guidance/GuidanceFinance.pdf", "http://www.fmbb2012.com/JumpingQualifica1.pdf",
"http://www.consulatdumaroc.ca/coloniefh22012.pdf", "http://www.rgrdlaw.com/media/cases/140_Complaint.pdf" };
String name[] = {"bases.pdf", "campusmap0607.pdf", "web_page_doc.pdf", "GuidanceFinance.pdf",
"JumpingQualifica1.pdf", "coloniefh22012.pdf", "140_Complaint.pdf", };
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mProgressDialog = new ProgressDialog(SpinnerActivity.this);
mProgressDialog.setMessage("Please be patient, file downloading...");
mProgressDialog.setIndeterminate(false);
mProgressDialog.setMax(100);
mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
spDownloadFrom = (Spinner) findViewById(R.id.Spinner01);
spinnerArrayAdapter = new ArrayAdapter<CharSequence>(this,
android.R.layout.simple_spinner_item, name);
spinnerArrayAdapter
.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spDownloadFrom.setAdapter(spinnerArrayAdapter);
spDownloadFrom.setOnItemSelectedListener(new SpinnerListener(
spDownloadFrom));
}
public class SpinnerListener implements OnItemSelectedListener {
Spinner sp;
public SpinnerListener(View v) {
sp = (Spinner) findViewById(v.getId());
}
@Override
public void onItemSelected(AdapterView<?> parent, View v, int arg2,
long arg3) {
// Call to download class
startDownload(arg2);
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
// TODO Auto-generated method stub
}
}
private void startDownload(int position) {
DownloadFile downloadFile = new DownloadFile();
downloadFile.execute(url[position]);
}
class DownloadFile extends AsyncTask<String, Integer, String> { // put your
// download
// code
@Override
protected void onPreExecute() {
super.onPreExecute();
mProgressDialog.show();
}
@Override
protected void onProgressUpdate(Integer... progress) {
super.onProgressUpdate(progress);
mProgressDialog.setProgress(progress[0]);
}
@Override
protected String doInBackground(String... aurl) {
try {
URL url = new URL(aurl[0]);
URLConnection connection = url.openConnection();
connection.connect();
int fileLength = connection.getContentLength();
int tickSize = 2 * fileLength / 100;
int nextProgress = tickSize;
Log.d(
"ANDRO_ASYNC", "Lenght of file: " + fileLength);
InputStream input = new BufferedInputStream(url.openStream());
String path = Environment.getExternalStorageDirectory()
+ "/Android/Data/"
+ getApplicationContext().getPackageName() + "/files/" + name;
File file = new File(path);
file.mkdirs();
File outputFile = file;
OutputStream output = new FileOutputStream(outputFile);
byte data[] = new byte[1024 * 1024];
long total = 0;
int count;
while ((count = input.read(data)) != -1) {
total += count;
if (total >= nextProgress) {
nextProgress = (int) ((total / tickSize + 1) * tickSize);
this.publishProgress((int) (total * 100 / fileLength));
}
output.write(data, 0, count);
}
output.flush();
output.close();
input.close();
mProgressDialog.dismiss();
} catch (Exception e) {
}
return null;
}
protected void onProgressUpdate(String... progress) {
Log.d("Downloading", progress[0]);
}
@Override
protected void onPostExecute(String unused) {
mProgressDialog.dismiss();
File file = new File(Environment.getExternalStorageDirectory()
+ "/Android/Data/"
+ getApplicationContext().getPackageName()
+ "/files/" + name);
Intent testIntent = new Intent(Intent.ACTION_VIEW);
testIntent.setType("application/pdf");
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
Uri uri = Uri.fromFile(file);
intent.setDataAndType(uri, "application/pdf");
try {
startActivity(intent);
} catch (ActivityNotFoundException e) {
Toast.makeText(SpinnerActivity.this,
"No Application Available to View PDF",
Toast.LENGTH_LONG).show();
}
}
}
}
With the exceptions printing to LogCat here are the errors recieved:
05-06 00:23:39.087: E/Spinner(13841): exception
05-06 00:23:39.087: E/Spinner(13841): java.io.FileNotFoundException: /mnt/sdcard/Android/Data/com.hellospinner/files/[Ljava.lang.String;@40517468 (Is a directory)
05-06 00:23:39.087: E/Spinner(13841): at org.apache.harmony.luni.platform.OSFileSystem.open(Native Method)
05-06 00:23:39.087: E/Spinner(13841): at dalvik.system.BlockGuard$WrappedFileSystem.open(BlockGuard.java:232)
05-06 00:23:39.087: E/Spinner(13841): at java.io.FileOutputStream.<init> (FileOutputStream.java:94)
05-06 00:23:39.087: E/Spinner(13841): at java.io.FileOutputStream.<init> (FileOutputStream.java:66)
05-06 00:23:39.087: E/Spinner(13841): at com.hellospinner.SpinnerActivity$DownloadFile.doInBackground(SpinnerActivity.java: 131)
05-06 00:23:39.087: E/Spinner(13841): at com.hellospinner.SpinnerActivity$DownloadFile.doInBackground(SpinnerActivity.java: 1)
05-06 00:23:39.087: E/Spinner(13841): at android.os.AsyncTask$2.call(AsyncTask.java:185)
05-06 00:23:39.087: E/Spinner(13841): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
05-06 00:23:39.087: E/Spinner(13841): at java.util.concurrent.FutureTask.run(FutureTask.java:138)
05-06 00:23:39.087: E/Spinner(13841): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
05-06 00:23:39.087: E/Spinner(13841): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
05-06 00:23:39.087: E/Spinner(13841): at java.lang.Thread.run(Thread.java:1019)
The fixed code:
public class SpinnerActivity extends Activity {
public static final int DIALOG_DOWNLOAD_PROGRESS = 0;
private ProgressDialog mProgressDialog;
Spinner spDownloadFrom;
private ArrayAdapter<CharSequence> spinnerArrayAdapter;
String url[] = {
"http://www.becker.cl/bases.pdf",
"http://www.pitt.edu/documents/campusmap0607.pdf",
"http://www.aara.ca/reg3317/web_page_doc.pdf",
"http://www.dataprotection.ie/documents/guidance/GuidanceFinance.pdf",
"http://www.fmbb2012.com/JumpingQualifica1.pdf",
"http://www.consulatdumaroc.ca/coloniefh22012.pdf",
"http://www.rgrdlaw.com/media/cases/140_Complaint.pdf" };
String name[] = { "bases.pdf", "campusmap0607.pdf", "web_page_doc.pdf",
"GuidanceFinance.pdf", "JumpingQualifica1.pdf",
"coloniefh22012.pdf", "140_Complaint.pdf", };
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mProgressDialog = new ProgressDialog(SpinnerActivity.this);
mProgressDialog.setMessage("Please be patient, file downloading...");
mProgressDialog.setIndeterminate(false);
mProgressDialog.setMax(100);
mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
spDownloadFrom = (Spinner) findViewById(R.id.Spinner01);
spinnerArrayAdapter = new ArrayAdapter<CharSequence>(this,
android.R.layout.simple_spinner_item, name);
spinnerArrayAdapter
.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spDownloadFrom.setAdapter(spinnerArrayAdapter);
spDownloadFrom.setOnItemSelectedListener(new SpinnerListener(
spDownloadFrom));
}
public class SpinnerListener implements OnItemSelectedListener {
Spinner sp;
public SpinnerListener(View v) {
sp = (Spinner) findViewById(v.getId());
}
@Override
public void onItemSelected(AdapterView<?> parent, View v, int arg2,
long arg3) {
// Call to download class
startDownload(arg2);
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
// TODO Auto-generated method stub
}
}
private void startDownload(int position) {
DownloadFile downloadFile = new DownloadFile(position);
downloadFile.execute(url[position]);
}
class DownloadFile extends AsyncTask<String, Integer, String> { // put your
// download
// code
private int position;
public DownloadFile(int position) {
this.position = position;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
mProgressDialog.show();
}
@Override
protected void onProgressUpdate(Integer... progress) {
super.onProgressUpdate(progress);
mProgressDialog.setProgress(progress[0]);
}
@Override
protected String doInBackground(String... aurl) {
try {
URL url = new URL(aurl[0]);
URLConnection connection = url.openConnection();
connection.connect();
int fileLength = connection.getContentLength();
int tickSize = 2 * fileLength / 100;
int nextProgress = tickSize;
Log.d(
"ANDRO_ASYNC", "Lenght of file: " + fileLength);
InputStream input = new BufferedInputStream(url.openStream());
String path = Environment.getExternalStorageDirectory()
+ "/Android/Data/"
+ getApplicationContext().getPackageName() + "/files/";
File file = new File(path);
file.mkdirs();
File outputFile = new File(file, name[position]);
OutputStream output = new FileOutputStream(outputFile);
byte data[] = new byte[1024 * 1024];
long total = 0;
int count;
while ((count = input.read(data)) != -1) {
total += count;
if (total >= nextProgress) {
nextProgress = (int) ((total / tickSize + 1) * tickSize);
this.publishProgress((int) (total * 100 / fileLength));
}
output.write(data, 0, count);
}
output.flush();
output.close();
input.close();
mProgressDialog.dismiss();
} catch (Exception e) {
Log.e("Spinner", "exception", e);
}
return null;
}
protected void onProgressUpdate(String... progress) {
Log.d("Downloading", progress[0]);
}
@Override
protected void onPostExecute(String unused) {
mProgressDialog.dismiss();
File file = new File(Environment.getExternalStorageDirectory()
+ "/Android/Data/"
+ getApplicationContext().getPackageName() + "/files/"
+ name[position]);
Intent testIntent = new Intent(Intent.ACTION_VIEW);
testIntent.setType("application/pdf");
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
Uri uri = Uri.fromFile(file);
intent.setDataAndType(uri, "application/pdf");
try {
startActivity(intent);
} catch (ActivityNotFoundException e) {
Toast.makeText(SpinnerActivity.this,
"No Application Available to View PDF",
Toast.LENGTH_LONG).show();
}
}
}
}
The problem comes from this line:
nameis an array of file names, and what you want is single file name. What you need is to pass thepositionviaDownloadFileconstructor. Something like this: