问题描述
||
我能够解析一个xml文件,并且我想通过xml下载给定其URL的文件。我有以下代码:
try{
/* Create a URL we want to load some xml-data from. */
URL url = new URL(\"http://dev2.eacomm.com/tabletcms/tablets/sync_login/jayem30/jayem\");
url.openConnection();
/* Get a SAXParser from the SAXPArserFactory. */
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser sp = spf.newSAXParser();
/* Get the XMLReader of the SAXParser we created. */
XMLReader xr = sp.getXMLReader();
/* Create a new ContentHandler and apply it to the XML-Reader*/
ExampleHandler myExampleHandler = new ExampleHandler();
xr.setContentHandler(myExampleHandler);
/* Parse the xml-data from our URL. */
xr.parse(new InputSource(url.openStream()));
/* Parsing has finished. */
/* Our ExampleHandler now provides the parsed data to us. */
List<ParsedExampleDataSet> parsedExampleDataSet = myExampleHandler.getParsedData();
Iterator i;
i = parsedExampleDataSet.iterator();
ParsedExampleDataSet dataItem;
while(i.hasNext()){
dataItem = (ParsedExampleDataSet) i.next();
String folder = dataItem.getParentTag();
if( folder == \"Videos\" ){
String [] videoName = dataItem.getName().split(\"/\");
String currentFile = videoName[0] + \".\" + videoName[1];
String currentFileURL = dataItem.getUrl() + videoName[0] + \".\" + videoName[1];
tv.append(\"\\nURL: \" + currentFileURL);
new DownloadFileAsync().execute(currentFile,currentFileURL,\"Videos\");
this.videoCount++;
tv.append(\"\\nVideo Count: \" + this.videoCount );
}
if( folder == \"Slideshows\" ){
//processSlideshows(dataItem,folder);
}
}
}catch(Exception e){
Toast.makeText(getBaseContext(),e.getMessage(),Toast.LENGTH_SHORT).show();
}
下载代码位于异步任务上。但是,当我运行此文件时,我应该下载的两个文件(分别为126kb和98kb)被下载,这些文件在那里,但它们的大小都仅为1kb。该文件无法播放。
当我换线时
**new DownloadFileAsync().execute(currentFile,\"Videos\");**
to
**new DownloadFileAsync().execute(\"hehe.flv\",\"http://dev2.eacomm.com/tabletcms/app/webroot/files/000002/videos/27.flv\",\"Videos\");**
文件大小不错,但仅返回一个文件。
编辑:
//---------------------------- START DownloadFileAsync -----------------------//
class DownloadFileAsync extends AsyncTask<String,String,String>{
@Override
protected void onPreExecute() {
super.onPreExecute();
showDialog(DIALOG_DOWNLOAD_PROGRESS);
}
@Override
protected String doInBackground(String... strings) {
try {
String currentFile = strings[0];
String currentFileURL = strings[1];
String folder = strings[2];
File root = Environment.getExternalStorageDirectory();
URL u = new URL(currentFileURL);
HttpURLConnection c = (HttpURLConnection) u.openConnection();
c.setRequestMethod(\"GET\");
c.setDoOutput(true);
c.connect();
int lenghtOfFile = c.getContentLength();
FileOutputStream f = new FileOutputStream(new File(root + \"/Engagia/Downloads/\" + folder,currentFile));
InputStream in = c.getInputStream();
byte[] buffer = new byte[1024];
int len1 = 0;
long total = 0;
while ((len1 = in.read(buffer)) > 0) {
total += len1; //total = total + len1
publishProgress(\"\" + (int)((total*100)/lenghtOfFile));
f.write(buffer,len1);
}
f.close();
}catch (Exception e){
Log.d(\"Downloader\",e.getMessage());
}
return null;
}
protected void onProgressUpdate(String... progress) {
Log.d(\"ANDRO_ASYNC\",progress[0]);
mProgressDialog.setProgress(Integer.parseInt(progress[0]));
}
@Override
protected void onPostExecute(String unused) {
dismissDialog(DIALOG_DOWNLOAD_PROGRESS);
}
}
//---------------------------- END DownloadFileAsync -----------------------//
@Override
protected Dialog onCreateDialog(int id) {
switch (id) {
case DIALOG_DOWNLOAD_PROGRESS:
mProgressDialog = new ProgressDialog(this);
mProgressDialog.setMessage(\"Downloading files...\");
mProgressDialog.setIndeterminate(false);
mProgressDialog.setMax(100);
mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
mProgressDialog.setCancelable(true);
mProgressDialog.show();
return mProgressDialog;
default:
return null;
}
}
编辑:(由于Haphazard)
不好,我重新检查了URL,发现我的XML流没有返回正确的URL以供下载,因此我不得不重建URL以供下载。我做了类似的事情:
tv.append(\"\\nCurrent File URL: \" + currentFileURL);
String downloadFileURL = currentFileURL.replace( \"tablets/tablet_content\",\"app/webroot/files\" );
解决方法
确保您的网址格式正确。您确认confirmed4ѭ和
currentFileURL
都正确吗?
,您可以发布异步任务中的代码吗?我觉得问题出在从URL下载文件。
请参阅以下网址以获取如何下载文件。
ANDROID:如何将视频文件下载到SD卡?
谢谢
迪帕克
,请尝试以下代码。
package com.endeavour.sampleprograms;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import org.apache.http.util.ByteArrayBuffer;
import android.os.AsyncTask;
import android.os.Environment;
class DownloadFileAsync extends AsyncTask<String,String,String>{
private static final String DIALOG_DOWNLOAD_PROGRESS = null;
@Override
protected void onPreExecute() {
super.onPreExecute();
// showDialog(DIALOG_DOWNLOAD_PROGRESS);
}
@Override
protected String doInBackground(String... strings) {
try {
String currentFile = strings[0];
String currentFileURL = strings[1];
String folder = strings[2];
*emphasized text*
String fileName = Environment.getExternalStorageDirectory() + \"/Engagia/Downloads/\" + folder+\"/\";
File wallpaperDirectory = new File(fileName);
if (!wallpaperDirectory.exists())
wallpaperDirectory.mkdirs();
fileName = fileName+currentFile;
downloadFromUrl(currentFileURL,fileName);
// FileOutputStream f = new FileOutputStream(new File(root + \"/Engagia/Downloads/\" + folder,currentFile));
}catch (Exception e){
}
return null;
}
public void downloadFromUrl(String VideoURL,String fileName) { //this is the downloader method
try {
System.out.println(\"....Url.....\"+VideoURL);
URL url = new URL(VideoURL); //you can write here any link
File file = new File(fileName);
long startTime = System.currentTimeMillis();
/* Open a connection to that URL. */
URLConnection ucon = url.openConnection();
/*
* Define InputStreams to read from the URLConnection.
*/
InputStream is = ucon.getInputStream();
BufferedInputStream bis = new BufferedInputStream(is);
/*
* Read bytes to the Buffer until there is nothing more to read(-1).
*/
ByteArrayBuffer baf = new ByteArrayBuffer(50);
int current = 0;
while ((current = bis.read()) != -1) {
baf.append((byte) current);
}
/* Convert the Bytes read to a String. */
FileOutputStream fos = new FileOutputStream(file);
fos.write(baf.toByteArray());
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
谢谢Deepak