2010-09-11 5 views
16

У меня есть видеофайл на сайте в формате .MP4, и я хочу разрешить пользователю загружать видео на свою SD-карту, щелкнув ссылку. Есть простой способ сделать это. У меня есть этот код, но он не работает ... не уверен, что я делаю неправильно. Спасибо за помощь!ANDROID: Как загрузить видеофайл на 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); 
       } 

     } 
} 
+0

Вы уверены, что путь/sdcard/download/exists? Вы можете создать его через оболочку adb –

ответ

35

не исчерпывает память? Я предполагаю, что видеофайл очень большой - вы буферизуете перед записью в файл.

Я знаю, что ваш пример кода находится по всему Интернету - но это БЕСПЛАТНО для скачивания! Используйте это:

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

добавлен 'outStream.flush();' это решает проблему 0 байтовых файлов –

+1

Возможно ли воспроизводить видео, которое в настоящее время загружается? Это означает, что можно сказать, что one.mp4 в настоящее время загружается, так что можно играть одинаково во время загрузки с помощью MediaPlayer? – Scorpion

+0

@Someone Где-то у меня есть видео в формате .swf? Будет ли она загружаться с использованием вашего кода? – Dhasneem

23

Никогда не прокладывайте путь по пути, особенно к внешнему хранилищу. На многих устройствах ваш путь неверен. Используйте Environment.getExternalStoragePath(), чтобы получить корень внешнего хранилища (который может быть /sdcard или /mnt/sdcard или что-то еще).

Не забудьте создать свой подкаталог, используя объект File, с которого вы можете связаться с Environment.getExternalStoragePath().

И, наконец, не просто сказать «но не работает». Мы понятия не имеем, что означает «но не работает» в вашем случае. Без этой информации вам очень сложно помочь.

+0

Большое вам спасибо. Я запомню это в следующий раз. –

Смежные вопросы