Search code examples
androiddownloadandroid-recyclerviewin-app

How to implement inapp download mp3 file


In my app, I have list of mp3 files in RecylerView There's download button for each mp3 file.

What I want:

How to implement in-app download functionality on click of download button.


Solution

  • Create a button on your list_item.xml.. on that button click implement this code..

    btn.setOnclickListner(new View.OnClickListner(){ 
          new DownloadFileAsync().execute("your mp3 url from api");
    });
    

    Create a Async task class that download the file..

    class DownloadFileAsync extends AsyncTask <String, String, String> {
    ProgressDialog mProgressDialog;
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            mProgressDialog = new ProgressDialog(this);
            mProgressDialog.setMessage("Downloading file..");
            mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
            mProgressDialog.setCancelable(false);
            mProgressDialog.show();
        }
    
        @Override
        protected String doInBackground(String... aurl) {
            int count;
            try {
                URL url = new URL(aurl[0]);
                URLConnection conexion = url.openConnection();
                conexion.connect();
                int lenghtOfFile = conexion.getContentLength();
                Log.d("ANDRO_ASYNC", "Lenght of file: " + lenghtOfFile);
                InputStream input = new BufferedInputStream(url.openStream());
                OutputStream output = new FileOutputStream("/sdcard/some_file.jpg");
                byte data[] = new byte[1024];
                long total = 0;
                while ((count = input.read(data)) != -1) {
                total += count;
                publishProgress(""+(int)((total*100)/lenghtOfFile));
                output.write(data, 0, count);
            }
    
            output.flush();
            output.close();
            input.close();
        } catch (Exception e) {}
            return null;
        }
    
        protected void onProgressUpdate(String... progress) {
            Log.d("ANDRO_ASYNC",progress[0]);
            mProgressDialog.setProgress(Integer.parseInt(progress[0]));
        }
    
        @Override
        protected void onPostExecute(String progress) {
            mProgressDialog.dismiss();
        }
    }