android'de indirilenler klasörüne nasıl erişilir?


82

Ben yeni androidim, dosyaları indirilenler klasörüne indirebileceğiniz bir uygulama yapıyorum (İndirme Yöneticisini kullanarak). Emülatörde indirilenler klasörüne gidersem resimleri görebilirim. Öyleyse, indirilen dosyaların slayt gösterisini göstermek istersem, bu klasöre nasıl erişebilirim? İkinci olarak, bu koda ilerleme çubuğu nasıl eklenir: -

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

İndirilenler klasöründen resim çekme işlevini gerçekleştiren ve ardından bir slayt gösterisi gibi görüntüleyen bir düğme eklemek istiyorum.

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

Yanıtlar:


227

İlk sorunuz için deneyin

Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS); 

(API 8'den beri mevcuttur)

Bu dizindeki tek tek dosyalara erişmek için File.list () veya File.listFiles () kullanın . İndirme ilerlemesini bildirmenin yalnızca bildirimde mümkün olduğu görülüyor, buraya bakın .


@ slkorolev- hey teşekkürler, bu koda nasıl ilerleme çubuğu ekleyebilirim, lütfen bana yardım edebilir misin
Dhruv

3
ve bir şey daha var, Environment.getExternalStoragePublicDirectory (Environment.DIRECTORY_DOWNLOADS) tarafından externa_downloads'e erişim elde ettiğimizde; o klasördeki her dosyaya daha fazla nasıl erişilir?
Semih

1
DIRECTORY_DOWNLOADS'a yazmak WRITE_EXTERNAL_STORAGE iznini gerektiriyor mu? Eğer öyleyse, bir alternatif var mı?
android geliştiricisi

@androiddeveloper - Evet, bu izne ihtiyacınız var. Tek alternatif, bir amaç aracılığıyla erişebileceğiniz bir "dosyayı kaydetme" eylemini ortaya çıkaran başka bir uygulamaya (bir dosya yöneticisi gibi) güvenmektir. Ancak bunu yapmak için standart bir niyet yok.
Ted Hopp

4
getExternalStoragePublicDirectorykullanımdan kaldırıldı. Buraya
Ashish Emmanuel

26

Bu izni manifest.xml dosyanızda ayarlamanız gerekiyor

android.permission.WRITE_EXTERNAL_STORAGE

7
API seviyesi 23'ten (Marshmallow) itibaren, çalışma zamanında da izin istemeniz gerekir. Daha fazla bilgi için bkz. Sistem İzinleriyle Çalışma .
Ted Hopp

Ayrıca API seviyesi 19'dan başlayarak, bu izin, Context.getExternalFilesDir (String) ve Context.getExternalCacheDir () tarafından döndürülen uygulamaya özel dizinlerinizdeki dosyaları okumak / yazmak için gerekli değildir. developer.android.com/reference/android/… , developer.android.com/reference/android/… . Ancak FileOutputStream (yeni Dosya (getExternalStoragePublicDirectory (DIRECTORY_DOWNLOADS), lfile)) girişiminde java.io.FileNotFoundException (İzin reddedildi) ile karşılaştım
Andrew Glukhoff

23

Güncellenmiş

getExternalStoragePublicDirectory()kullanımdan kaldırıldı .

İndirme klasörünü a Fragment,

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

Bir Activity,

val downloadFolder = getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS)

downloadFolder.listFiles()Files listeleyecektir .

downloadFolder?.path size indirme klasörünün Dize yolunu verecektir.


7
context.getExternalFilesDir (Environment.DIRECTORY_DOWNLOADS) bana dizini veriyor /emulated/0/Android/data/{package}/files/Downloadama ben genel indirme klasörünü istiyorum, yani /emulated/0/Download. mümkün mü? Teşekkürler.
YunhaoLIU

1
@YunhaoLIU, Android'in son sürümlerinde depolamaya doğrudan dosya sistemi erişimi sınırlı hale geldi. Android Belgelerinin Depolama Erişimi Çerçevesine bakın.
Yogesh Umesh Vaity

9

Marshmallow kullanıyorsanız, şunlardan birini yapmanız gerekir:

  1. Çalışma zamanında izin isteyin (kullanıcı isteğe izin verir veya reddeder) veya:
  2. Kullanıcı, Ayarlar -> Uygulamalar -> {Uygulamanız} -> İzinler'e gitmeli ve depolama erişimi vermelidir .

Bunun nedeni, Google'ın izinlerin çalışma şeklini tamamen yenilemesi Marshmallow'da olmasıdır.



1

Sonraki izni eklemelisiniz:

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

Ve sonra işte koddaki kullanımlar:

val externalFilesDir = context.getExternalFilesDir(DIRECTORY_DOWNLOADS)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.