एंड्रॉइड में डाउनलोड फ़ोल्डर कैसे एक्सेस करें?


82

मैं नया एंड्रॉइड हूं, मैं एक ऐप बना रहा हूं जिसमें कोई भी फाइल को डाउनलोड करने वाले फ़ोल्डर में डाउनलोड कर सकता है (डाउनलोड मैनेजर का उपयोग करके)। अगर मैं एमुलेटर में डाउनलोड फोल्डर में जाता हूं तो मैं तस्वीरें देख सकता हूं। तो अगर मैं डाउनलोड की गई फ़ाइलों का स्लाइड शो दिखाना चाहता हूं, तो मुझे उस फ़ोल्डर तक पहुंच कैसे मिल सकती है? दूसरी बात यह है कि इस कोड में प्रगति पट्टी कैसे जोड़ें: -

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

मैं एक बटन जोड़ना चाहता हूं जो डाउनलोड फ़ोल्डर से चित्र लेने का कार्य करता है और फिर स्लाइड शो की तरह प्रदर्शित करता है।

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

जवाबों:


227

अपने पहले प्रश्न के लिए प्रयास करें

Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS); 

(एपीआई 8 से उपलब्ध)

इस निर्देशिका में अलग-अलग फ़ाइलों तक पहुँचने के लिए या तो File.list () या File.listFiles () का उपयोग करें । लगता है कि डाउनलोड प्रगति की रिपोर्टिंग केवल सूचना में संभव है, यहां देखें ।


@ slkorolev- अरे थैंक्स, मैं इस कोड में प्रगति बार कैसे जोड़ सकता हूं, क्या आप मेरी मदद कर सकते हैं
ध्रुव

3
और एक और बात, कि जब हम पर्यावरण के द्वारा externa_downloads तक पहुँच प्राप्त करते हैं। TheExternalStoragePublicDirectory (Environment.DIRECTORY_DOWNLOADS); कैसे उस फ़ोल्डर में प्रत्येक फ़ाइल का उपयोग करने के लिए?
ध्रुव

1
क्या DIRECTORY_DOWNLOADS को लिखने के लिए WRITE_EXTERNAL_STORAGE की अनुमति की आवश्यकता है? यदि हां, तो क्या कोई विकल्प है?
एंड्रॉयड डेवलपर

@androiddeveloper - हाँ, आपको उस अनुमति की आवश्यकता है। एकमात्र विकल्प कुछ अन्य ऐप (जैसे फ़ाइल प्रबंधक) पर भरोसा करना होगा जो एक "फ़ाइल को सहेजें" कार्रवाई को उजागर करता है जिसे आप एक इरादे से एक्सेस कर सकते हैं। हालांकि, ऐसा करने के लिए कोई मानक उद्देश्य नहीं हैं।
टेड होप

4
getExternalStoragePublicDirectoryपदावनत किया गया है। यहां
आशीष इमैनुएल

26

आपको अपनी अनुमति को अपनी मैनिफ़ेस्ट.xml फ़ाइल में सेट करना होगा

android.permission.WRITE_EXTERNAL_STORAGE

7
एपीआई स्तर 23 (मार्शमैलो) के रूप में आपको रन टाइम पर अनुमति का अनुरोध करना होगा। अधिक जानकारी के लिए सिस्टम अनुमतियों के साथ कार्य करना देखें ।
टेड होप

एपीआई स्तर 19 में शुरू होने के साथ, इस अनुमति को Context.getExternalFilesDir (String) और Context.getExternalCacheDir () द्वारा लौटाए गए आपके एप्लिकेशन-विशिष्ट निर्देशिकाओं में फ़ाइलों को पढ़ने / लिखने की आवश्यकता नहीं है। developer.android.com/reference/android/… , developer.android.com/reference/android/… । लेकिन मैं java.io.FileNotFoundException का सामना करना पड़ा (अनुमति अस्वीकृत) प्रयास FileOutputStream (नई फ़ाइल (getExternalStoragePublicDirectory (DIRECTORY_DOWNLOADS), lfile)) पर
एंड्रयू Glukhoff

23

अद्यतन

getExternalStoragePublicDirectory()है पदावनत

एक से डाउनलोड फ़ोल्डर प्राप्त करने के लिए Fragment,

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

एक से Activity,

val downloadFolder = getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS)

downloadFolder.listFiles()एस को सूचीबद्ध करेगा File

downloadFolder?.path आपको डाउनलोड फ़ोल्डर का स्ट्रिंग पथ देगा।


7
reference.getExternalFilesDir (Environment.IRECTORY_DOWNLOADS) मुझे निर्देशिका देता है, /emulated/0/Android/data/{package}/files/Downloadलेकिन मुझे सार्वजनिक डाउनलोड फ़ोल्डर चाहिए, जो है /emulated/0/Download। क्या यह संभव है? धन्यवाद।
युन्हैलोआई जुएल

1
@YunhaoLIU, स्टोरेज के लिए सीधे फाइलसिस्टम एक्सेस Android के हाल के संस्करणों में सीमित हो गया है। Android डॉक्यूमेंटेशन के स्टोरेज एक्सेस फ्रेमवर्क में देखें।
योगेश उमेश वैट

9

यदि आप मार्शमैलो का उपयोग कर रहे हैं, तो आपको या तो:

  1. रनटाइम पर अनुरोध की अनुमति (उपयोगकर्ता अनुरोध को अस्वीकार करने या अस्वीकार करने के लिए मिलेगा) या:
  2. उपयोगकर्ता को सेटिंग्स में जाना चाहिए -> ऐप्स -> {आपका ऐप} -> अनुमतियाँ और भंडारण पहुंच प्रदान करें

ऐसा इसलिए है क्योंकि मार्शमैलो में, Google ने पूरी तरह से सुधार किया कि कैसे अनुमतियाँ काम करती हैं।


1

यदि आप एक शेल का उपयोग कर रहे हैं, तो फ़ाइलपथ डाउनलोड (कोई "s") फ़ोल्डर में नहीं है

/storage/emulated/0/Download

इसको कैसे लें?
निरजवर्मा

आप पसंदीदा खोज इंजन खोलें और "एंड्रॉइड शेल कैसे खोलें" टाइप करें
बोरिस


1

आपको अगली अनुमति मिलनी चाहिए:

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

और फिर यहाँ कोड में usages है:

val externalFilesDir = context.getExternalFilesDir(DIRECTORY_DOWNLOADS)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.