26

I've a question about Download Manager. I'm going to download a file from a site. When I set the default directory for download (Environment.DIRECTORY_DOWNLOAD) all works fine and my download is started. But if I try to change the directory, my app doesn't download the file. In particular, I want my file to go into a folder inside a Download, for example /storage/sdcard/Download/myFolder. How can I fix that?

File mydownload = new File (Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)+ "/myFolder");

if (!mydownload.exists()){
    mydownload.mkdir();
}

String url = sUrl[0];
DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
    request.allowScanningByMediaScanner();
    request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
}

request.setDestinationInExternalPublicDir(mydownload.getAbsolutePath(),"Myfile.extension");


DownloadManager manager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
manager.enqueue(request);
tjpaul
  • 343
  • 3
  • 16
bott91
  • 263
  • 1
  • 3
  • 5

4 Answers4

94

check below code: its save file in "sdcard/dhaval_files/". just replace your folder name and give permission write_external_storage in android manifest file.

public void file_download(String uRl) {
        File direct = new File(Environment.getExternalStorageDirectory()
                + "/dhaval_files");

        if (!direct.exists()) {
            direct.mkdirs();
        }

        DownloadManager mgr = (DownloadManager) this.getSystemService(Context.DOWNLOAD_SERVICE);

        Uri downloadUri = Uri.parse(uRl);
        DownloadManager.Request request = new DownloadManager.Request(
                downloadUri);

        request.setAllowedNetworkTypes(
                DownloadManager.Request.NETWORK_WIFI
                        | DownloadManager.Request.NETWORK_MOBILE)
                .setAllowedOverRoaming(false).setTitle("Demo")
                .setDescription("Something useful. No, really.")
                .setDestinationInExternalPublicDir("/dhaval_files", "test.jpg");

        mgr.enqueue(request);

    }
Dhaval Parmar
  • 18,812
  • 8
  • 82
  • 177
  • Illegalstate exeception unable to create directory – Cyph3rCod3r May 22 '14 at 10:29
  • 3
    @Dr.aNdRO: here is your answer : http://stackoverflow.com/a/17112536/1168654 and http://stackoverflow.com/a/13056375/1168654 – Dhaval Parmar Jun 13 '14 at 10:26
  • its really helpful for me i solute your effort – Najaf Ali Jul 31 '17 at 08:21
  • @DhavalParmar 's answer is bit confusing,because I tried it as a accepted answer but getting `Illegalstate exeception unable to create directory ` .This is because to creating a directory users need to give a runtime permission.To take runtime permission you can follow this post [https://stackoverflow.com/questions/33162152/storage-permission-error-in-marshmallow] – Saddan Dec 08 '19 at 07:43
  • Whoever use this code, make sure, the files will get deleted once the user uninstall your app. – Bhavik Mehta May 13 '20 at 18:47
14

There are two options available for you to use.

1) first setDestinationInExternalPublicDir this will let you download in any of the androids standard download folder based on media type eg DIRECTORY_DOWNLOADS, DIRECTORY_MUSIC. these files will remain after uninstall.

request.setDestinationInExternalPublicDir(DIRECTORY_DOWNLOADS,
        File.separator + folderName + File.separator + fileName);

The first argument should be a standard downloads directory for this to work properly and cannot be anything else.

2) second is setDestinationInExternalFilesDir this is same as the previous method with the difference that these files will be deleted after app uninstall.

request.setDestinationInExternalFilesDir(context, DIRECTORY_DOWNLOADS, 
        File.separator + folderName + File.separator + fileName);

here the second argument can be null or any of the android download directories.

zaphod100.10
  • 3,331
  • 24
  • 38
1

Try Below Code:.

    String storagePath = Environment.getExternalStorageDirectory()
                        .getPath()
                        + "/Directory_name/";
                //Log.d("Strorgae in view",""+storagePath);
                File f = new File(storagePath);
                if (!f.exists()) {
                    f.mkdirs();
                }
                //storagePath.mkdirs();
                String pathname = f.toString();
                if (!f.exists()) {
                    f.mkdirs();
                }
//                Log.d("Storage ",""+pathname);
                dm = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
                Uri uri = Uri.parse(image);
                checkImage(uri.getLastPathSegment());
                if (!downloaded) {
                    DownloadManager.Request request = new DownloadManager.Request(uri);
                    request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);

                    request.setDestinationInExternalPublicDir("/Directory_name", uri.getLastPathSegment());
                    Long referese = dm.enqueue(request);

                    Toast.makeText(getApplicationContext(), "Downloading...", Toast.LENGTH_SHORT).show();
                }
Vinesh Chauhan
  • 1,288
  • 11
  • 27
0

For Set Your Path For Download File Use: Work For me (Android 11).

 File file = new File(Environment.getExternalStorageDirectory().getPath() + "/YOUR FOLDER/", "YOUR FILE.(mp3|mp4|pdf|...)");

        request.setDestinationUri(Uri.fromFile(file));

Complete Code:

First Check Directory

  private boolean CreateDirectory() {
    boolean ret = false;
    File filepath = Environment.getExternalStorageDirectory();
    File dir = new File(filepath.getPath() + "/YOUR FOLDER/");
    if (!dir.exists()) {
        try {
            dir.mkdirs();
            ret = true;

        } catch (Exception e) {
            ret = false;
            e.printStackTrace();
        }
    }
    return ret;
}

Then:

        String URL = " YOUR URL ";

        DownloadManager.Request request = new DownloadManager.Request(Uri.parse(URL));
        request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI | DownloadManager.Request.NETWORK_MOBILE);
        request.setTitle("YOUR TITLE");
        request.setDescription("YOUR DESCRIPTION");
        request.allowScanningByMediaScanner();
   request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);

        File file = new File(Environment.getExternalStorageDirectory().getPath() + "/YOUR FOLDER/", "YOUR FILE.(mp3|mp4|pdf|...)");

        request.setDestinationUri(Uri.fromFile(file));
        DownloadManager manager= (DownloadManager) 
        getSystemService(Context.DOWNLOAD_SERVICE);
        Long downloadId= manager.enqueue(request);

ok,Finish

peyman
  • 121
  • 4