-1

I want my app to download a video from an url. For now I want to write download the file to my sd card.

I tried some different scripts, I don't receive an android.os.NetworkOnMainThreadException exception. But my application crashes. Download a file programatically on Android What is best way to download files from net programatically in android?

Does anyone know how to create a working method? To solve this exception it has to be an async task.

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);
          } 
    }

Logs:

03-14 12:09:46.535: E/theple(6987): android.os.NetworkOnMainThreadException
Community
  • 1
  • 1
Jasper Fioole
  • 449
  • 1
  • 5
  • 25

2 Answers2

0

I made it working, thx for the help anyway.

My code:

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;
    }
}
Jasper Fioole
  • 449
  • 1
  • 5
  • 25
0

There are many ways you can perform downloading,in-spite of creating a method for it you should use "thread,Async class or service",That error "Network on Main thread comes due to the process is taking time".

I am showing example of Using Async Task and with Service

*

*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);
        }
    }

Hope this will be helpful for you.

Aman Systematix
  • 347
  • 2
  • 10