安卓手机在下载视频(mp4)文件时崩溃



我想让我的应用程序从一个url下载视频。现在我想把文件下载到sd卡上。

我尝试了一些不同的脚本,我没有收到android.os.NetworkOnMainThreadException异常。但是我的应用程序崩溃了。在Android上通过编程方式下载文件什么是最好的方式下载文件从网络编程在android?

有人知道如何创建一个工作方法吗?要解决这个异常,它必须是一个异步任务。

public static void downloadFile(String url, File outputFile) {
        try {
              URL u = new URL(url);
              URLConnection conn = u.openConnection();
              int contentLength = conn.getContentLength();
              DataInputStream stream = new DataInputStream(u.openStream());
                byte[] buffer = new byte[contentLength];
                stream.readFully(buffer);
                stream.close();
                DataOutputStream fos = new DataOutputStream(new FileOutputStream(outputFile));
                fos.write(buffer);
                fos.flush();
                fos.close();
          } catch(Exception e) {
              Log.e("theple", "" + e);
          } 
    }

日志:

03-14 12:09:46.535: E/theple(6987): android.os.NetworkOnMainThreadException

我成功了,谢谢你的帮助。

我代码:

public class FileDownloader extends AsyncTask<String, Integer, String>
{
    @Override
    protected String doInBackground(String... params)
    {
        try {
              URL u = new URL(params[0]);
              URLConnection conn = u.openConnection();
              int contentLength = conn.getContentLength();
              DataInputStream stream = new DataInputStream(u.openStream());
                byte[] buffer = new byte[contentLength];
                stream.readFully(buffer);
                stream.close();
                DataOutputStream fos = new DataOutputStream(new FileOutputStream(new File(params[1])));
                fos.write(buffer);
                fos.flush();
                fos.close();
          } catch(Exception e) {
              Log.e("theple", "" + e);
          } 
        return null;
    }
}

有很多方法可以执行下载,尽管为它创建了一个方法,你应该使用"线程,异步类或服务",错误"主线程网络是由于进程正在花费时间"。

我正在展示使用异步任务服务的示例*

*class DownloadFile extends AsyncTask<String, Integer, String> {
    @Override
    protected String doInBackground(String... sUrl) {
        try {
            URL url = new URL(sUrl[0]);
            URLConnection connection = url.openConnection();
            connection.connect();
            // this will be useful so that you can show a typical 0-100% progress bar
            int fileLength = connection.getContentLength();
            // download the file
            InputStream input = new BufferedInputStream(url.openStream());
            OutputStream output = new FileOutputStream("/sdcard/file_name.extension");
            byte data[] = new byte[1024];
            long total = 0;
            int count;

            while ((count = input.read(data)) != -1) {
                total += count;
                // publishing the progress....
                publishProgress((int) (total * 100 / fileLength));
                output.write(data, 0, count);
            }
            output.flush();
            output.close();
            input.close();
        } catch (Exception e) {
        }
        return null;
    }** 

And With Service 
you can use : 

   class DownloadService extends IntentService {
        public static final int UPDATE_PROGRESS = 8344;
        public DownloadService() {
            super("DownloadService");
        }
        @Override
        protected void onHandleIntent(Intent intent) {
            String urlToDownload = intent.getStringExtra("url");
            ResultReceiver receiver = (ResultReceiver) intent.getParcelableExtra("receiver");
            try {
                URL url = new URL(urlToDownload);
                URLConnection connection = url.openConnection();
                connection.connect();
                // this will be useful so that you can show a typical 0-100% progress bar
                int fileLength = connection.getContentLength();
                // download the file
                InputStream input = new BufferedInputStream(url.openStream());
                OutputStream output = new FileOutputStream("/sdcard/BarcodeScanner-debug.apk");
                byte data[] = new byte[1024];
                long total = 0;
                int count;
                while ((count = input.read(data)) != -1) {
                    total += count;
                    // publishing the progress....
                    Bundle resultData = new Bundle();
                    resultData.putInt("progress" ,(int) (total * 100 / fileLength));
                    receiver.send(UPDATE_PROGRESS, resultData);
                    output.write(data, 0, count);
                }
                output.flush();
                output.close();
                input.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            Bundle resultData = new Bundle();
            resultData.putInt("progress" ,100);
            receiver.send(UPDATE_PROGRESS, resultData);
        }
    }

最新更新