Wie greife ich auf den Download-Ordner in Android zu?

82

Ich bin neu Android, ich mache eine App, in der man Dateien in den Download-Ordner herunterladen kann (mit Download Manager). Ich kann Bilder sehen, wenn ich zum Download-Ordner im Emulator gehe. Wenn ich also eine Diashow mit heruntergeladenen Dateien anzeigen möchte, wie kann ich dann auf diesen Ordner zugreifen? Zweitens, wie man diesem Code einen Fortschrittsbalken hinzufügt: -

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

Ich möchte eine Schaltfläche hinzufügen, die die Funktion übernimmt, Bilder aus dem Download-Ordner aufzunehmen und dann wie eine Diashow anzuzeigen.

<?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>
Dhruv
quelle

Antworten:

227

Für Ihre erste Frage versuchen Sie es

Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS); 

(verfügbar seit API 8)

Um auf einzelne Dateien in diesem Verzeichnis zuzugreifen, verwenden Sie entweder File.list () oder File.listFiles () . Scheint, dass das Melden des Download-Fortschritts nur in Benachrichtigungen möglich ist, siehe hier .

slkorolev
quelle
@ slkorolev- hey danke, wie kann ich diesem Code einen Fortschrittsbalken hinzufügen, können Sie mir bitte helfen
Dhruv
3
und noch etwas: Wenn wir von Environment.getExternalStoragePublicDirectory (Environment.DIRECTORY_DOWNLOADS) Zugriff auf externa_downloads erhalten; Wie kann ich weiter auf jede Datei in diesem Ordner zugreifen?
Dhruv
1
Erfordert das Schreiben in DIRECTORY_DOWNLOADS die Erlaubnis von WRITE_EXTERNAL_STORAGE? Wenn ja, gibt es eine Alternative?
Android-Entwickler
@androiddeveloper - Ja, Sie benötigen diese Berechtigung. Die einzige Alternative wäre, sich auf eine andere App (wie einen Dateimanager) zu verlassen, die eine Aktion zum Speichern von Dateien verfügbar macht, auf die Sie über eine Absicht zugreifen können. Es gibt jedoch keine Standardabsichten dafür.
Ted Hopp
4
getExternalStoragePublicDirectoryist veraltet. Siehe hier
Ashish Emmanuel
26

Sie müssen diese Berechtigung in Ihrer Datei manifest.xml festlegen

android.permission.WRITE_EXTERNAL_STORAGE
Mac
quelle
7
Ab API-Level 23 (Marshmallow) müssen Sie die Berechtigung auch zur Laufzeit anfordern. Weitere Informationen finden Sie unter Arbeiten mit Systemberechtigungen.
Ted Hopp
Ab API-Ebene 19 ist diese Berechtigung nicht erforderlich, um Dateien in Ihren anwendungsspezifischen Verzeichnissen zu lesen / schreiben, die von Context.getExternalFilesDir (String) und Context.getExternalCacheDir () zurückgegeben werden. developer.android.com/reference/android/… , developer.android.com/reference/android/… . Beim Versuch FileOutputStream (neue Datei (getExternalStoragePublicDirectory (DIRECTORY_DOWNLOADS), lfile))
Andrew Glukhoff
21

Aktualisiert

getExternalStoragePublicDirectory()ist veraltet .

Um den Download-Ordner von einem zu erhalten Fragment,

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

Von einem Activity,

val downloadFolder = getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS)

downloadFolder.listFiles()wird die Files auflisten.

downloadFolder?.path gibt Ihnen den String-Pfad des Download-Ordners.

Yogesh Umesh Vaity
quelle
7
context.getExternalFilesDir (Environment.DIRECTORY_DOWNLOADS) gibt mir das Verzeichnis, /emulated/0/Android/data/{package}/files/Downloadaber ich möchte den öffentlichen Download-Ordner /emulated/0/Download. ist es möglich? Vielen Dank.
YunhaoLIU
1
@YunhaoLIU, der direkte Zugriff des Dateisystems auf den Speicher ist in neueren Versionen von Android eingeschränkt. Schauen Sie sich das Storage Access Framework der Android-Dokumentation an.
Yogesh Umesh Vaity
9

Wenn Sie Marshmallow verwenden, müssen Sie entweder:

  1. Anforderungsberechtigungen zur Laufzeit (der Benutzer kann die Anforderung zulassen oder ablehnen) oder:
  2. Der Benutzer muss zu Einstellungen -> Apps -> {Ihre App} -> Berechtigungen gehen und Speicherzugriff gewähren .

Dies liegt daran, dass Google in Marshmallow die Funktionsweise von Berechtigungen komplett überarbeitet hat.

Mark Lu
quelle
1

Wenn Sie eine Shell verwenden, lautet der Dateipfad zum Download-Ordner (kein "s")

/storage/emulated/0/Download
Boris
quelle
Wie bekomme ich das?
Nirazverma
Öffnen Sie Ihre bevorzugte Suchmaschine und geben Sie "So öffnen Sie eine Android-Shell" ein
Boris
1

Sie sollten die nächste Berechtigung hinzufügen:

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

Und dann ist hier Verwendungen im Code:

val externalFilesDir = context.getExternalFilesDir(DIRECTORY_DOWNLOADS)
Yvgen
quelle