làm thế nào để truy cập thư mục tải xuống trong android?


82

Tôi là Android mới, tôi đang tạo một ứng dụng trong đó người ta có thể tải tệp xuống thư mục tải xuống (sử dụng Trình quản lý tải xuống). Tôi có thể xem ảnh nếu tôi truy cập thư mục tải xuống trong trình mô phỏng. Vì vậy, nếu tôi muốn hiển thị trình chiếu của các tệp đã tải xuống, làm thế nào tôi có thể truy cập vào thư mục đó? Thứ hai, cách thêm thanh tiến trình vào mã này: -

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

Tôi muốn thêm một nút thực hiện chức năng lấy ảnh từ thư mục tải xuống và sau đó hiển thị như trình chiếu.

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

Câu trả lời:


226

Đối với câu hỏi đầu tiên của bạn, hãy thử

Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS); 

(có sẵn từ API 8)

Để truy cập các tệp riêng lẻ trong thư mục này, hãy sử dụng File.list () hoặc File.listFiles () . Có vẻ như chỉ có thể báo cáo tiến độ tải xuống trong thông báo, xem tại đây .


@ slkorolev- này, cảm ơn, tôi có thể thêm thanh tiến trình vào mã này bằng cách nào, bạn có thể giúp tôi không
Dhruv 26/10/11

3
và một điều nữa, đó là khi chúng tôi có quyền truy cập vào externa_downloads bởi Environment.getExternalStoragePublicDirectory (Environment.DIRECTORY_DOWNLOADS); làm thế nào để truy cập thêm vào từng tệp trong thư mục đó?
Dhruv

1
Việc viết thư tới DIRECTORY_DOWNLOADS có cần sự cho phép của WRITE_EXTERNAL_STORAGE không? Nếu vậy, có một giải pháp thay thế?
nhà phát triển android

@androiddeveloper - Có, bạn cần quyền đó. Giải pháp thay thế duy nhất là dựa vào một số ứng dụng khác (như trình quản lý tệp) để hiển thị hành động "lưu tệp" mà bạn có thể truy cập thông qua một ý định. Tuy nhiên, không có ý định tiêu chuẩn nào để làm điều đó.
Ted Hopp

3
getExternalStoragePublicDirectorykhông được dùng nữa. Tham khảo tại đây
Ashish Emmanuel

26

Bạn cần đặt quyền này trong tệp manifest.xml của mình

android.permission.WRITE_EXTERNAL_STORAGE

7
Kể từ API cấp 23 (Marshmallow), bạn cũng cần yêu cầu quyền tại thời điểm chạy. Xem Làm việc với Quyền Hệ thống để biết thêm thông tin.
Ted Hopp

Cũng bắt đầu từ API cấp 19, quyền này không cần thiết để đọc / ghi tệp trong các thư mục dành riêng cho ứng dụng của bạn được trả về bởi Context.getExternalFilesDir (String) và Context.getExternalCacheDir (). developer.android.com/reference/android/… , developer.android.com/reference/android/… . Nhưng tôi phải đối mặt với java.io.FileNotFoundException (Quyền bị từ chối) khi cố gắng FileOutputStream (File mới (getExternalStoragePublicDirectory (DIRECTORY_DOWNLOADS), lfile))
Andrew Glukhoff

20

Đã cập nhật

getExternalStoragePublicDirectory()đang bị phản đối .

Để có được thư mục tải về từ một Fragment,

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

Từ một Activity,

val downloadFolder = getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS)

downloadFolder.listFiles()sẽ liệt kê các Files.

downloadFolder?.path sẽ cung cấp cho bạn đường dẫn Chuỗi của thư mục tải xuống.


7
context.getExternalFilesDir (Environment.DIRECTORY_DOWNLOADS) cung cấp cho tôi thư mục /emulated/0/Android/data/{package}/files/Downloadnhưng tôi muốn có thư mục tải xuống công khai /emulated/0/Download. là nó có thể? Cảm ơn.
YunhaoLIU

1
@YunhaoLIU, quyền truy cập hệ thống tệp trực tiếp vào bộ nhớ đã bị hạn chế trong các phiên bản Android gần đây. Xem xét Khung truy cập bộ nhớ của Tài liệu Android.
Yogesh Umesh Vaity

9

Nếu bạn đang sử dụng Marshmallow, bạn phải:

  1. Yêu cầu quyền trong thời gian chạy (người dùng sẽ được phép hoặc từ chối yêu cầu) hoặc:
  2. Người dùng phải đi tới Cài đặt -> Ứng dụng -> {Ứng dụng của bạn} -> Quyềncấp quyền truy cập bộ nhớ .

Điều này là do trong Marshmallow, Google đã cải tiến hoàn toàn cách thức hoạt động của quyền.


1

Bạn nên thêm quyền tiếp theo:

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

Và đây là cách sử dụng trong mã:

val externalFilesDir = context.getExternalFilesDir(DIRECTORY_DOWNLOADS)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.