Ngoại lệ 'mở không thành công: EACCES (Quyền bị từ chối)' trên Android


297

Tôi đang nhận được

mở thất bại: EACCES (Permission denied)

trên đường dây OutputStream myOutput = new FileOutputStream(outFileName);

Tôi đã kiểm tra root, và tôi đã thử android.permission.WRITE_EXTERNAL_STORAGE.

Làm thế nào tôi có thể khắc phục vấn đề này?

try {
    InputStream myInput;

    myInput = getAssets().open("XXX.db");

    // Path to the just created empty db
    String outFileName = "/data/data/XX/databases/"
            + "XXX.db";

    // Open the empty db as the output stream
    OutputStream myOutput = new FileOutputStream(outFileName);

    // Transfer bytes from the inputfile to the outputfile
    byte[] buffer = new byte[1024];
    int length;
    while ((length = myInput.read(buffer)) > 0) {
        myOutput.write(buffer, 0, length);
    }

    // Close the streams
    myOutput.flush();
    myOutput.close();
    myInput.close();
    buffer = null;
    outFileName = null;
}
catch (IOException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
}

Tôi gặp vấn đề tương tự trên máy tính bảng Android, nhưng tình huống của tôi có thể là duy nhất, vì vậy tôi báo cáo giải pháp của mình ở đây trong một bình luận. Đã xảy ra lỗi khi ứng dụng cố gắng truy cập thư mục / data / data / myapp / foo có hơn 50 tệp xml. Ứng dụng không làm sạch thư mục do lỗi. Sau khi một số tập tin cũ bị xóa, lỗi biến mất. Tôi không biết tại sao. Nó có thể là một vấn đề của thiết bị Android chung.
Hồng

Điều này đã giải quyết cho tôi: stackoverflow.com/questions/33666071/ từ
partho

Câu trả lời:


236

Tôi đã có cùng một vấn đề ... <uses-permissionĐã ở sai chỗ. Đúng rồi đó:

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

Các uses-permissionthẻ cần phải được bên ngoài applicationthẻ.


2
đó là quyền sử dụng cần phải nằm ngoài ứng dụng
user462990 28/03

3
Tôi nhận được một cảnh báo: " <uses-permission>thẻ xuất hiện sau <application>thẻ"
mr5

11
CẢNH BÁO Trong Android 4.4.4 không sử dụng tham số android:maxSdkVersion="18". Nó đã tạo ra ngoại lệ này
guisantogui

1
Quyền này được thi hành bắt đầu từ API cấp 19. Trước API cấp 19, quyền này không được thi hành và tất cả các ứng dụng vẫn có quyền truy cập để đọc từ bộ nhớ ngoài.
Zar E Ahmer

1
Tôi đang sử dụng API lv 15, tôi gặp lỗi trong khi cố gắng di chuyển tệp sang OTG USB Stick
Ravi Mehta

330

Đối với API 23+, bạn cần yêu cầu quyền đọc / ghi ngay cả khi chúng đã có trong bảng kê khai của bạn.

// Storage Permissions
private static final int REQUEST_EXTERNAL_STORAGE = 1;
private static String[] PERMISSIONS_STORAGE = {
        Manifest.permission.READ_EXTERNAL_STORAGE,
        Manifest.permission.WRITE_EXTERNAL_STORAGE
};

/**
 * Checks if the app has permission to write to device storage
 *
 * If the app does not has permission then the user will be prompted to grant permissions
 *
 * @param activity
 */
public static void verifyStoragePermissions(Activity activity) {
    // Check if we have write permission
    int permission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE);

    if (permission != PackageManager.PERMISSION_GRANTED) {
        // We don't have permission so prompt the user
        ActivityCompat.requestPermissions(
                activity,
                PERMISSIONS_STORAGE,
                REQUEST_EXTERNAL_STORAGE
        );
    }
}

AndroidManifest.xml

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

Để có tài liệu chính thức về việc yêu cầu quyền cho API 23+, hãy kiểm tra https://developer.android.com/training/permissions/requesting.html


13
Chỉ cần làm rõ, để làm việc này, hoạt động phải xử lý phản hồi yêu cầu quyền hoạt động. Xem developer.android.com/training/permissions/ trên để biết thêm chi tiết.
kldavis4

Liên kết tiện dụng với lời giải thích và ví dụ ở đây inthecheesefactory.com/blog/ từ
Paul Alexander

1
Đây không phải là một điều xấu? đối với trải nghiệm người dùng.
M. Usman Khan

5
Nhưng tôi sử dụng nó ở đâu? ví dụ: nếu tôi muốn chụp ảnh, tôi có phải chạy verifyStoragePermissions trước startActivityForResult hoặc tại onActivityResult không? nó thực sự làm tôi bối rối
Kiwi Lee

3
Cảm ơn điều này giải quyết vấn đề của tôi. chỉ cần một lưu ý: nếu ai đó không thể giải quyết "Manifest-01", bạn chỉ cần nhập "nhập android.Manifest".
Oubaida AlQuraan

167

Google có một tính năng mới trên Android Q : chế độ xem được lọc cho bộ nhớ ngoài. Cách khắc phục nhanh đó là thêm mã này vào tệp AndroidManifest.xml:

<manifest ... >
    <!-- This attribute is "false" by default on apps targeting Android Q. -->
    <application android:requestLegacyExternalStorage="true" ... >
     ...
    </application>
</manifest>

Bạn có thể đọc thêm về nó ở đây: https://developer.android.com/training/data-st Storage / compabilities


@Billy tôi nhận thấy nó chỉ xảy ra trên các thiết bị có api 29. Vì vậy, tôi đã tìm kiếm các thay đổi trong nhà cung cấp tệp
Uriel Frankel

Cuối cùng, có cloudtestingsc Muffter_lib.aar để làm việc với dòng này được thêm vào bảng kê khai androidTest, cảm ơn bạn rất nhiều vì phát hiện này.
bko

6
Thưa ngài, đã tiết kiệm cho tôi rất nhiều thời gian. Rất nhiều điều đã trở thành một nỗi đau cho một nhà phát triển trong Q. Tôi nghĩ rằng câu trả lời này nên được đăng dưới dạng một câu hỏi riêng biệt và xứng đáng nhận được nhiều sự ủng hộ hơn.
sanjeev

Tôi muốn đọc thêm về thủ thuật ma thuật đen nhỏ xinh này, nhưng tiếc là liên kết trả về lỗi 404 ... Dù sao cũng cảm ơn
SadSido

Nó đưa ra một cảnh báo android:requestLegacyExternalStorage="true"này sẽ không phá vỡ phiên bản thấp hơn ryt? @UrielFrankel
Santanu Sur

58

Tôi đã quan sát điều này một lần khi chạy ứng dụng bên trong trình giả lập. Trong cài đặt trình giả lập, bạn cần chỉ định đúng kích thước của bộ nhớ ngoài ("Thẻ SD"). Theo mặc định, trường "bộ nhớ ngoài" trống và điều đó có thể có nghĩa là không có thiết bị nào như vậy và EACCES bị ném ngay cả khi quyền được cấp trong tệp kê khai.


51

Ngoài tất cả các câu trả lời, hãy đảm bảo bạn không sử dụng điện thoại làm bộ lưu trữ USB.

Tôi gặp vấn đề tương tự trên HTC Sensation trên chế độ lưu trữ USB được bật. Tôi vẫn có thể gỡ lỗi / chạy ứng dụng, nhưng tôi không thể lưu vào bộ nhớ ngoài.


Cảm ơn người đàn ông, mặc dù tôi đã yêu cầu quyền từ người dùng trong thời gian chạy. Lỗi này xảy ra trên trình giả lập.
Sharp Edge

1
Khi tôi kết nối thiết bị Samsung Galaxy S6, trước tiên, nó cung cấp tùy chọn "Cho phép truy cập dữ liệu thiết bị" bằng "DENY" hoặc "ALLOW" và từ thanh thông báo Tôi nhận được tùy chọn Sử dụng USB cho 1. MTP 2. PTP 3. MIDI Thiết bị 4. Sạc. Chọn cái nào?
testsingh

34

Thêm android: requestLegacyExternalStorage = "true" cho Android Manifest Nó đã làm việc với Android 10 (Q) tại SDK 29+
hay Sau khi di cư Android X .

 <application
    android:name=".MyApplication"
    android:allowBackup="true"
    android:hardwareAccelerated="true"
    android:icon=""
    android:label=""
    android:largeHeap="true"
    android:supportsRtl=""
    android:theme=""
    android:requestLegacyExternalStorage="true">

Wow hoạt động hoàn hảo, đó là câu trả lời tôi đang tìm kiếm, thật tuyệt, cảm ơn bạn @rhaldar, bạn đã cứu ngày của tôi
Ayush Katuwal

29

Vấn đề của tôi là với "TargetApi (23)" cần thiết nếu minSdkVersion của bạn dưới 23.

Vì vậy, tôi có quyền yêu cầu với đoạn trích sau

protected boolean shouldAskPermissions() {
    return (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP_MR1);
}

@TargetApi(23)
protected void askPermissions() {
    String[] permissions = {
            "android.permission.READ_EXTERNAL_STORAGE",
            "android.permission.WRITE_EXTERNAL_STORAGE"
    };
    int requestCode = 200;
    requestPermissions(permissions, requestCode);
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
// ...
    if (shouldAskPermissions()) {
        askPermissions();
    }
}

28

Giải pháp cho Android Q :

<application ...
    android:requestLegacyExternalStorage="true" ... >

Bạn đã cứu ngày của tôi. Quyền được cấp nhưng Glide không thể đọc hình ảnh cho đến khi tôi thiết lập điều này.
leegor

Thận trọng: Android 11 sẽ xóa hoàn toàn quyền truy cập cũ vào tháng 8 năm 2020, vì vậy, nâng cấp quyền truy cập tệp tốt hơn để sử dụng Storage Access Framework (SAF) cho các ứng dụng của bạn
dimib

16

Tôi cũng đang trải nghiệm như vậy. Những gì tôi tìm thấy là nếu bạn đi tới Cài đặt -> Trình quản lý ứng dụng -> Ứng dụng của bạn -> Quyền -> Bật Lưu trữ , nó sẽ giải quyết vấn đề.


1
Tôi không thể tìm thấy phần này?
Evan Sevy

13

Hóa ra, đó là một sai lầm ngu ngốc vì điện thoại của tôi vẫn kết nối với máy tính để bàn và không nhận ra điều này.

Vì vậy, tôi đã phải tắt kết nối USB và mọi thứ đều hoạt động tốt.


Làm việc cho tôi là tốt. Nhưng tại sao nó hoạt động? có gì khác biệt khi không kết nối USB với PC.
dùng13107

Câu hỏi hay. Tôi không bao giờ điều tra thêm nữa. Tôi đoán có một khóa ghi từ hệ thống ngay khi bạn kết nối thiết bị (để nó có thể giả lập thiết bị usb trên máy tính của bạn). Có lẽ điều này là để tránh dữ liệu không nhất quán. Không chắc chắn mặc dù.
Tobias Reich

Tôi tìm thấy lý do ở đây stackoverflow.com/questions/7394757/ cũng thấy câu trả lời của tôi stackoverflow.com/a/43863548/1729501
user13107

13

Tôi gặp vấn đề tương tự trên Samsung Galaxy Note 3, chạy CM 12.1. Vấn đề đối với tôi là tôi đã có

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

và phải sử dụng nó để chụp và lưu trữ ảnh người dùng. Khi tôi cố tải những bức ảnh tương tự trong ImageLoader, tôi đã (Permission denied)gặp lỗi. Giải pháp là thêm rõ ràng

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

vì quyền trên chỉ giới hạn quyền ghi tối đa API phiên bản 18 và với quyền đọc.


Không giúp tôi! Đáng để thử tho! Cảm ơn.
Sakiboy

9

Ngoài tất cả các câu trả lời, nếu khách hàng đang sử dụng Android 6.0, Android đã thêm mô hình cấp phép mới cho (Marshmallow).

Thủ thuật: Nếu bạn đang nhắm mục tiêu phiên bản 22 trở xuống, ứng dụng của bạn sẽ yêu cầu tất cả các quyền tại thời điểm cài đặt giống như trên bất kỳ thiết bị nào chạy HĐH bên dưới Marshmallow. Nếu bạn đang thử trình giả lập thì từ Android 6.0 trở đi, bạn cần truy cập rõ ràng các cài đặt-> ứng dụng-> YOUAPP -> quyền và thay đổi quyền nếu bạn đã cấp.


2
Không thể tin được, tôi đã dành 2 ngày để cố gắng tìm ra điều này. Mỗi khi tôi cảm thấy mọi thứ đang chạy trơn tru trên Android, một cái gì đó như thế này xảy ra.
Jaime Ivan Cervantes

7

Thật kỳ lạ sau khi đặt dấu gạch chéo "/" trước newFile của tôi, vấn đề của tôi đã được giải quyết. Tôi đã thay đổi điều này:

File myFile= new File(Environment.getExternalStorageDirectory() + "newFile");

đến đây:

File myFile= new File(Environment.getExternalStorageDirectory() + "/newFile");

1
Không có gì lạ ở đây. Với dòng đầu tiên, bạn đang cố gắng tạo một tệp trong cùng thư mục với tệp chứa thư mục lưu trữ ngoài của bạn. tức là /storage/.../somethingnewfile thay vì /storage/.../something/newfile
Stéphane

@ Stéphane Bản thân lỗi là lạ nếu bạn nhìn vào phạm vi câu trả lời rộng.
Darush

3
Cách chính xác để thực hiện việc này là sử dụng cosntructor Tệp (dir, tệp)
Nick Cardoso

@NickCardoso Bạn cũng có thể sử dụng Tệp (Tên đường dẫn chuỗi). Có vẻ như bạn không nhận được điểm ở đây. Câu hỏi không phải là về cách sử dụng lớp File. Phạm vi câu trả lời trong chủ đề này cho thấy mức độ sai lệch của lỗi này và có bao nhiêu cách có thể giải quyết. Trong trường hợp của tôi, lỗi là dấu gạch chéo bị thiếu. Một số người đã tìm thấy nó hữu ích. Chắc chắn bạn có thể sử dụng phương pháp riêng của bạn để truy cập một tập tin. Đi trước và gửi câu trả lời của bạn. Nó có thể giải quyết vấn đề của ai đó.
Darush

Bạn không nhận được điểm. Nếu bạn sử dụng đúng hàm tạo, thì bạn không cần phải hack. Nhận xét của tôi đã được thêm vào để nó có thể giúp bất kỳ độc giả nào trong tương lai hiểu lầm về sai lầm của bạn. Đó không phải là một lời chỉ trích cá nhân và không cần trả lời
Nick Cardoso

6

Tôi đã có cùng một vấn đề và không có gợi ý nào giúp được. Nhưng tôi đã tìm thấy một lý do thú vị cho điều đó, trên một thiết bị vật lý, Galaxy Tab .

Khi lưu trữ USB được bật, bộ nhớ ngoài đọc và ghi quyền không có bất kỳ ảnh hưởng nào. Chỉ cần tắt bộ lưu trữ USB và với các quyền chính xác, bạn sẽ giải quyết được vấn đề.


2
Chết tiệt, tôi chỉ mất 3 giờ làm việc. Thông thường, tôi phải khởi động lại thiết bị và nó đã hoạt động. Cảm ơn bạn rất nhiều
crgarridos

5

Tôi hy vọng mọi thứ bên dưới /datasẽ thuộc về "bộ nhớ trong". Bạn nên, tuy nhiên, có thể viết thư cho /sdcard.


5
Tôi cũng đã thử <used-allow android: name = "ERIC.WRITE_INTERNAL_STORAGE" />. vẫn vậy
Mert

1
Phân vùng / dữ liệu thường được bảo vệ chống ghi đối với người dùng thông thường (không phải root) đang cố truy cập tệp thông thường. Đối với lưu trữ nội bộ, có các phương pháp chuyên dụng để làm như vậy, đặc biệt nếu bạn muốn truy cập cơ sở dữ liệu. Các trang nhà phát triển Android sẽ giúp bạn về vấn đề này.
lò nướng

5

Thay đổi thuộc tính cấp phép trong bạn /system/etc/permission/platform.xml
và nhóm cần được đề cập như dưới đây.

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE">
    <group android:gid="sdcard_rw" />
    <group android:gid="media_rw" />    
</uses-permission>

platform.xml bị khóa ngay lập tức, cố gắng điều này thông qua adb shell nhưng cần bất kỳ tập lệnh nào ADB sẽ cho phép tôi sử dụng cho mod.
John

Thất bại. Đặt thiết bị của tôi vào một vòng lặp khởi động.
Tobse

5

Tôi đã gặp lỗi tương tự khi cố gắng viết một hình ảnh trong thư mục DCIM / camera trên Galaxy S5 (android 6.0.1) và tôi nhận ra rằng chỉ có thư mục này bị hạn chế. Tôi chỉ đơn giản có thể ghi vào DCIM / bất kỳ thư mục nào nhưng không có trong máy ảnh. Điều này nên được hạn chế dựa trên thương hiệu / tùy biến.


4

Khi ứng dụng của bạn thuộc về ứng dụng hệ thống, nó không thể truy cập thẻ SD.


4

Hãy nhớ rằng ngay cả khi bạn đặt tất cả các quyền chính xác trong tệp kê khai: Nơi duy nhất các ứng dụng bên thứ 3 được phép ghi trên thẻ ngoài của bạn là "thư mục riêng của họ" (tức là / sdcard / Android / data /) đang cố gắng ghi vào bất cứ nơi nào khác: bạn sẽ nhận được ngoại lệ: EACCES (Quyền bị từ chối)


3

Có lẽ câu trả lời là đây:

trên API> = 23 thiết bị, nếu bạn cài đặt ứng dụng (ứng dụng không phải là ứng dụng hệ thống), bạn nên kiểm tra quyền lưu trữ trong "Cài đặt - ứng dụng", có danh sách quyền cho mọi ứng dụng, bạn nên kiểm tra trên! thử


3

Trong trường hợp của tôi, tôi đang sử dụng một thư viện bộ chọn tệp trả về đường dẫn đến bộ nhớ ngoài nhưng nó bắt đầu từ đó /root/. Và ngay cả với quyền WRITE_EXTERNAL_STORAGE được cấp trong thời gian chạy, tôi vẫn gặp lỗi EACCES (Quyền bị từ chối) .
Vì vậy, sử dụng Environment.getExternalStorageDirectory()để có được đường dẫn chính xác để lưu trữ bên ngoài.

Ví dụ:
Không thể viết: /root/storage/emulated/0/newfile.txt
Có thể viết: /storage/emulated/0/newfile.txt

boolean externalStorageWritable = isExternalStorageWritable();
File file = new File(filePath);
boolean canWrite = file.canWrite();
boolean isFile = file.isFile();
long usableSpace = file.getUsableSpace();

Log.d(TAG, "externalStorageWritable: " + externalStorageWritable);
Log.d(TAG, "filePath: " + filePath);
Log.d(TAG, "canWrite: " + canWrite);
Log.d(TAG, "isFile: " + isFile);
Log.d(TAG, "usableSpace: " + usableSpace);

/* Checks if external storage is available for read and write */
public boolean isExternalStorageWritable() {
    String state = Environment.getExternalStorageState();
    if (Environment.MEDIA_MOUNTED.equals(state)) {
        return true;
    }
    return false;
}

Đầu ra 1:

externalStorageWritable: true
filePath: /root/storage/emulated/0/newfile.txt
isFile: false
usableSpace: 0

Đầu ra 2:

externalStorageWritable: true
filePath: /storage/emulated/0/newfile.txt
isFile: true
usableSpace: 1331007488

Tôi đã có cùng một vấn đề chính xác. Loại bỏ rootmột phần từ đường dẫn giải quyết vấn đề của tôi.
xabush


3

Đối với bất kỳ ai đến đây từ kết quả tìm kiếm và đang nhắm mục tiêu Android 10: Android 10 (API 29) thay đổi một số quyền liên quan đến lưu trữ.

Tôi đã khắc phục sự cố khi tôi thay thế các phiên bản trước đó của mình Environment.getExternalStorageDirectory()(không dùng API 29) context.getExternalFilesDir(null).

Lưu ý rằng context.getExternalFilesDir(type)có thể trả về null nếu vị trí lưu trữ không khả dụng, do đó hãy chắc chắn kiểm tra xem bất cứ khi nào bạn kiểm tra nếu bạn có quyền bên ngoài.

Đọc thêm ở đây .


2

Tôi đang tạo một thư mục bên dưới / data / trong init.rc của tôi (tìm kiếm xung quanh với aosp trên Nexus 7) và đã có chính xác vấn đề này.

Hóa ra việc cấp quyền cho thư mục rw (666) là không đủ và nó phải là rwx (777) thì tất cả đều hoạt động!


2

Việc thực thi quyền lưu trữ bài 6.0 có thể được bỏ qua nếu bạn có thiết bị đã root thông qua các lệnh adb này:

root@msm8996:/ # getenforce
getenforce
Enforcing
root@msm8996:/ # setenforce 0
setenforce 0
root@msm8996:/ # getenforce
getenforce
Permissive

1

Thêm quyền trong bảng kê khai.

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

3
Không có sự cho phépandroid.permission.READ_INTERNAL_STORAGE
Ryan R

0

Tôi đã có cùng một vấn đề (API> = 23).

Giải pháp https://stackoverflow.com/a/13569364/1729501 làm việc cho tôi, nhưng việc ngắt kết nối ứng dụng để gỡ lỗi là không thực tế.

Giải pháp của tôi là cài đặt trình điều khiển thiết bị adb thích hợp trên Windows. Trình điều khiển google USB không hoạt động cho thiết bị của tôi.

BƯỚC 1: Tải xuống trình điều khiển adb cho nhãn hiệu thiết bị của bạn.

BƯỚC 2: Chuyển đến trình quản lý thiết bị -> các thiết bị khác -> tìm các mục có từ "adb" -> chọn Cập nhật trình điều khiển -> cung cấp vị trí trong bước 1


0

sau khi thêm quyền đã giải quyết vấn đề của tôi

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

0

Thêm phụ thuộc lớp

implementation 'com.karumi:dexter:4.2.0'

Thêm mã dưới đây trong hoạt động chính của bạn.

import com.karumi.dexter.Dexter;
import com.karumi.dexter.MultiplePermissionsReport;
import com.karumi.dexter.PermissionToken;
import com.karumi.dexter.listener.PermissionRequest;
import com.karumi.dexter.listener.multi.MultiplePermissionsListener;
    @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_splash);

    new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {


                checkMermission();
            }
        }, 4000);
    }

    private void checkMermission(){
        Dexter.withActivity(this)
                .withPermissions(
                        android.Manifest.permission.READ_EXTERNAL_STORAGE,
                        android.Manifest.permission.WRITE_EXTERNAL_STORAGE,
                        android.Manifest.permission.ACCESS_NETWORK_STATE,
                        Manifest.permission.INTERNET
                ).withListener(new MultiplePermissionsListener() {
            @Override
            public void onPermissionsChecked(MultiplePermissionsReport report) {
                if (report.isAnyPermissionPermanentlyDenied()){
                    checkMermission();
                } else if (report.areAllPermissionsGranted()){
                    // copy some things
                } else {
                    checkMermission();
                }

            }
            @Override
            public void onPermissionRationaleShouldBeShown(List<PermissionRequest> permissions, PermissionToken token) {
                token.continuePermissionRequest();
            }
        }).check();
    }

0

Trong trường hợp của tôi, lỗi đã xuất hiện trên dòng

      target.createNewFile();

vì tôi không thể tạo tệp mới trên thẻ sd, vì vậy tôi phải sử dụng phương pháp DocumentFile.

      documentFile.createFile(mime, target.getName());

Đối với câu hỏi trên, vấn đề có thể được giải quyết bằng phương pháp này,

    fos=context.getContentResolver().openOutputStream(documentFile.getUri());

Cũng xem chủ đề này, Làm cách nào để sử dụng API truy cập thẻ SD mới được trình bày cho Android 5.0 (Lollipop)?

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.