how to access downloads folder in android?

JavaAndroidKotlinAndroid ProgressbarAndroid Storage

Java Problem Overview


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>

Java Solutions


Solution 1 - Java

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.

Solution 2 - Java

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.

Solution 3 - Java

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

android.permission.WRITE_EXTERNAL_STORAGE

Solution 4 - Java

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.

Solution 5 - Java

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

/storage/emulated/0/Download

Solution 6 - Java

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)

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionDhruvView Question on Stackoverflow
Solution 1 - JavaslkorolevView Answer on Stackoverflow
Solution 2 - JavaYogesh Umesh VaityView Answer on Stackoverflow
Solution 3 - JavamacView Answer on Stackoverflow
Solution 4 - JavaMark LuView Answer on Stackoverflow
Solution 5 - JavaBoris VerkhovskiyView Answer on Stackoverflow
Solution 6 - JavaYvgenView Answer on Stackoverflow