I have a video file on a website in .MP4 format and I want to allow the user to be able to download the video to their SD card by clicking a link. Is there an easy way to do this. I currently have this code but its not working...not sure what I am doing wrong. THanks for any help!
我在.MP4格式的网站上有一个视频文件,我希望用户能够通过点击链接将视频下载到他们的SD卡。是否有捷径可寻。我目前有这个代码,但它不起作用......不确定我做错了什么。谢谢你的帮助!
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import org.apache.http.util.ByteArrayBuffer;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
public class VideoManager extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);}
private final String PATH = "/sdcard/download/"; //put the downloaded file here
public void DownloadFromUrl(String VideoURL, String fileName) { //this is the downloader method
try {
URL url = new URL("http://www.ericmoyer.com/episode1.mp4"); //you can write here any link
File file = new File(fileName);
long startTime = System.currentTimeMillis();
Log.d("VideoManager", "download begining");
Log.d("VideoManager", "download url:" + url);
Log.d("VideoManager", "downloaded file name:" + fileName);
/* 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(PATH+file);
fos.write(baf.toByteArray());
fos.close();
Log.d("VideoManager", "download ready in"
+ ((System.currentTimeMillis() - startTime) / 1000)
+ " sec");
} catch (IOException e) {
Log.d("VideoManager", "Error: " + e);
}
}
}
2 个解决方案
#1
36
aren't running out of memory ? I imagine a video file is very large - which you are buffering before writing to file.
没有内存耗尽?我想一个视频文件非常大 - 你在写入文件之前要缓冲它。
I know your example code is all over the internet - but it's BAD for downloading ! Use this:
我知道你的示例代码遍布互联网 - 但下载很糟糕!用这个:
private final int TIMEOUT_CONNECTION = 5000;//5sec
private final int TIMEOUT_SOCKET = 30000;//30sec
URL url = new URL(imageURL);
long startTime = System.currentTimeMillis();
Log.i(TAG, "image download beginning: "+imageURL);
//Open a connection to that URL.
URLConnection ucon = url.openConnection();
//this timeout affects how long it takes for the app to realize there's a connection problem
ucon.setReadTimeout(TIMEOUT_CONNECTION);
ucon.setConnectTimeout(TIMEOUT_SOCKET);
//Define InputStreams to read from the URLConnection.
// uses 3KB download buffer
InputStream is = ucon.getInputStream();
BufferedInputStream inStream = new BufferedInputStream(is, 1024 * 5);
FileOutputStream outStream = new FileOutputStream(file);
byte[] buff = new byte[5 * 1024];
//Read bytes (and store them) until there is nothing more to read(-1)
int len;
while ((len = inStream.read(buff)) != -1)
{
outStream.write(buff,0,len);
}
//clean up
outStream.flush();
outStream.close();
inStream.close();
Log.i(TAG, "download completed in "
+ ((System.currentTimeMillis() - startTime) / 1000)
+ " sec");5
#2
24
Never hardwire a path, particularly to external storage. Your path is wrong on many devices. Use Environment.getExternalStoragePath()
to get the root of external storage (which may be /sdcard
or /mnt/sdcard
or something else).
永远不要硬连接路径,尤其是外部存储。您的路径在许多设备上都是错误的。使用Environment.getExternalStoragePath()获取外部存储的根目录(可能是/ sdcard或/ mnt / sdcard或其他东西)。
Be sure to create your subdirectory, using the File
object you get back from Environment.getExternalStoragePath()
.
确保使用从Environment.getExternalStoragePath()返回的File对象创建子目录。
And, finally, don't just say "but its not working". We have no idea what "but its not working" means in your case. Without that information, it is very difficult to help you.
而且,最后,不要只说“但它不起作用”。在你的情况下,我们不知道“但它不起作用”意味着什么。没有这些信息,很难帮助你。
#1
36
aren't running out of memory ? I imagine a video file is very large - which you are buffering before writing to file.
没有内存耗尽?我想一个视频文件非常大 - 你在写入文件之前要缓冲它。
I know your example code is all over the internet - but it's BAD for downloading ! Use this:
我知道你的示例代码遍布互联网 - 但下载很糟糕!用这个:
private final int TIMEOUT_CONNECTION = 5000;//5sec
private final int TIMEOUT_SOCKET = 30000;//30sec
URL url = new URL(imageURL);
long startTime = System.currentTimeMillis();
Log.i(TAG, "image download beginning: "+imageURL);
//Open a connection to that URL.
URLConnection ucon = url.openConnection();
//this timeout affects how long it takes for the app to realize there's a connection problem
ucon.setReadTimeout(TIMEOUT_CONNECTION);
ucon.setConnectTimeout(TIMEOUT_SOCKET);
//Define InputStreams to read from the URLConnection.
// uses 3KB download buffer
InputStream is = ucon.getInputStream();
BufferedInputStream inStream = new BufferedInputStream(is, 1024 * 5);
FileOutputStream outStream = new FileOutputStream(file);
byte[] buff = new byte[5 * 1024];
//Read bytes (and store them) until there is nothing more to read(-1)
int len;
while ((len = inStream.read(buff)) != -1)
{
outStream.write(buff,0,len);
}
//clean up
outStream.flush();
outStream.close();
inStream.close();
Log.i(TAG, "download completed in "
+ ((System.currentTimeMillis() - startTime) / 1000)
+ " sec");5
#2
24
Never hardwire a path, particularly to external storage. Your path is wrong on many devices. Use Environment.getExternalStoragePath()
to get the root of external storage (which may be /sdcard
or /mnt/sdcard
or something else).
永远不要硬连接路径,尤其是外部存储。您的路径在许多设备上都是错误的。使用Environment.getExternalStoragePath()获取外部存储的根目录(可能是/ sdcard或/ mnt / sdcard或其他东西)。
Be sure to create your subdirectory, using the File
object you get back from Environment.getExternalStoragePath()
.
确保使用从Environment.getExternalStoragePath()返回的File对象创建子目录。
And, finally, don't just say "but its not working". We have no idea what "but its not working" means in your case. Without that information, it is very difficult to help you.
而且,最后,不要只说“但它不起作用”。在你的情况下,我们不知道“但它不起作用”意味着什么。没有这些信息,很难帮助你。