how to access downloads folder in android?
Asked Answered
R

6

108

I am new android, i'm making an app in which one can download files to downloads folder (using Download Manager). I can see pictures if i go to downloads folder in emulator. So if i want to show a slideshow of downloaded files how can i get the access to that folder? Secondly how to add progress bar to this code:--

import java.util.Arrays;

import android.app.Activity;
import android.app.DownloadManager;
import android.app.DownloadManager.Query;
import android.app.DownloadManager.Request;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;

public class Download_managerActivity extends Activity {
     private long quueue_for_url;

     private DownloadManager dm;

        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);

            BroadcastReceiver receiver = new BroadcastReceiver() {
                @Override
                public void onReceive(Context context, Intent intent) {
                    String action = intent.getAction();

                    if (DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(action)) {
                        long downloadId = intent.getLongExtra(
                                DownloadManager.EXTRA_DOWNLOAD_ID, 0);
                        Query query = new Query();
                        query.setFilterById(quueue_for_url);
                        Cursor c = dm.query(query);
                        if (c.moveToFirst()) {
                            int columnIndex = c
                                    .getColumnIndex(DownloadManager.COLUMN_STATUS);
                            if (DownloadManager.STATUS_SUCCESSFUL == c
                                    .getInt(columnIndex)) {

                                ImageView view = (ImageView) findViewById(R.id.imageView1);
                                String uri_String_abcd = c
                                        .getString(c
                                                .getColumnIndex(DownloadManager.COLUMN_LOCAL_URI));
                                view.setImageURI(Uri.parse(uri_String_abcd));

                            }
                        }
                    }
                }
            };

            registerReceiver(receiver, new IntentFilter(
                    DownloadManager.ACTION_DOWNLOAD_COMPLETE));
        }

        public void onClick(View view) {
            dm = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);

            Request request_for_url = new Request(
                    Uri.parse("http://fc03.deviantart.net/fs14/i/2007/086/9/1/Steve_Jobs_portrait_by_tumb.jpg"));

            Request request_for_url1 = new Request(
                    Uri.parse("http://2.bp.blogspot.com/_q7Rxg4wqDyc/S5ZRVLxVYuI/AAAAAAAAAvU/fQAUZ2XFcp8/s400/katrina-kaif.jpg"));
            Request request_for_url2 = new Request(
                    Uri.parse("http://www.buzzreactor.com/sites/default/files/Bill-Gates1.jpg"));

            quueue_for_url = dm.enqueue(request_for_url);
            quueue_for_url = dm.enqueue(request_for_url1);
            quueue_for_url = dm.enqueue(request_for_url2);

        }

        public void showDownload(View view) {
            Intent i = new Intent();
            //try more options to show downloading , retrieving and complete
            i.setAction(DownloadManager.ACTION_VIEW_DOWNLOADS);
            startActivity(i);
        }
    }

I want to add a button which performs the function of taking the pictures from downloads folder and then display like a slideshow.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="cmpe235.lab1"
      android:versionCode="1"
      android:versionName="1.0">
    <uses-sdk android:minSdkVersion="9" />

<uses-permission android:name="android.permission.INTERNET"></uses-permission>

    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".Download_managerActivity"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    </application>
</manifest>

main.xml:-

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="fill_parent"
    android:layout_height="fill_parent">


    <Button android:text="Start Download" android:id="@+id/button1"
        android:layout_width="wrap_content" android:layout_height="wrap_content"
         android:layout_gravity="center_vertical|center_horizontal|center" android:textColor="#0000A0" 
         android:typeface="serif" android:onClick="onClick"></Button>

    <Button android:text="View Downloads" android:id="@+id/button2"
        android:layout_width="wrap_content" android:layout_height="wrap_content"
         android:layout_gravity="center_vertical|center_horizontal|center" android:textColor="#0000A0" 
         android:typeface="serif" android:onClick="showDownload"></Button>

    <ImageView android:layout_height="wrap_content" android:id="@+id/imageView1"
        android:src="@drawable/icon" android:layout_width="wrap_content"></ImageView>

</LinearLayout>
Retractor answered 26/10, 2011 at 20:2 Comment(0)
E
271

For your first question try

Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS); 

(available since API 8)

To access individual files in this directory use either File.list() or File.listFiles(). Seems that reporting download progress is only possible in notification, see here.

Exosmosis answered 26/10, 2011 at 20:24 Comment(7)
@slkorolev- hey thanks, how can i add progress bar to this code, can you please help meRetractor
and one more thing, that when we get access to externa_downloads by Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS); how to further access each file in that folder?Retractor
Does writing to DIRECTORY_DOWNLOADS require the permission of WRITE_EXTERNAL_STORAGE ? If so, is there an alternative?Intercellular
@androiddeveloper - Yes, you need that permission. The only alternative would be to rely on some other app (like a file manager) that exposes a "save file" action you could access via an intent. There are no standard intents for doing that, however.Jacobo
You can also see the answer for internal memory #21725206Rehabilitate
getExternalStoragePublicDirectory is deprecated. Refer hereCoppinger
@AshishEmmanuel you post it is deprecated, with a link to prove it, but how do you do it with MediaStore?Tradelast
C
40

Updated

getExternalStoragePublicDirectory() is deprecated.

To get the download folder from a Fragment,

val downloadFolder = requireContext().getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS)

From an Activity,

val downloadFolder = getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS)

downloadFolder.listFiles() will list the Files.

downloadFolder?.path will give you the String path of the download folder.

Update:

The Direct filesystem access to storage has become limited in recent versions of Android.

context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS) gives you the directory /emulated/0/Android/data/{package}/files/Download. If you want to have the public downloads folder, look into the Storage Access Framework of Android documentation.

Calton answered 26/10, 2019 at 21:55 Comment(1)
This actually gets a folder named "Download" under the extended files dir and not the public \Download folder. Any updates on how to get the true common download folder?Trudey
C
27

You need to set this permission in your manifest.xml file

android.permission.WRITE_EXTERNAL_STORAGE
Construe answered 11/2, 2012 at 13:20 Comment(2)
As of API level 23 (Marshmallow) you also need to request the permission at run time. See Working with System Permissions for more info.Jacobo
Also starting in API level 19, this permission is not required to read/write files in your application-specific directories returned by Context.getExternalFilesDir(String) and Context.getExternalCacheDir(). developer.android.com/reference/android/… , developer.android.com/reference/android/…. But I faced java.io.FileNotFoundException (Permission denied) on attempt FileOutputStream(new File(getExternalStoragePublicDirectory(DIRECTORY_DOWNLOADS), lfile))Tenerife
D
11

If you are using Marshmallow, you have to either:

  1. Request permissions at runtime (the user will get to allow or deny the request) or:
  2. The user must go into Settings -> Apps -> {Your App} -> Permissions and grant storage access.

This is because in Marshmallow, Google completely revamped how permissions work.

Darleen answered 25/7, 2016 at 22:4 Comment(0)
S
8

If you're using a shell, the filepath to the Download (no "s") folder is

/storage/emulated/0/Download
Schoenburg answered 26/10, 2011 at 20:2 Comment(1)
how to get this?Debbydebee
S
3

You should add next permission:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

And then here is usages in code:

val externalFilesDir = context.getExternalFilesDir(DIRECTORY_DOWNLOADS)
Spectator answered 29/5, 2020 at 13:32 Comment(2)
getExternalFilesDir() gives you the private directories for the app. And for that reason, you don't need any permission since Android 4.4Dewy
That permission has been deprecated since Android 13 developer.android.com/about/versions/13/…. Came here to find a right way to access shared Downloads folder on the latest Android version, but haven't found it yet.Gruber

© 2022 - 2024 — McMap. All rights reserved.