Helpex - Trao đổi & giúp đỡ Đăng nhập
44

Có một cảnh báo xơ trong AS liên quan đến android.permission.WRITE_EXTERNAL_STORAGE. Cảnh báo cho biết rằng quyền sẽ không còn cung cấp quyền truy cập ghi khi nhắm mục tiêu Android 10 trở lên. Việc xóa quyền đã nói vẫn có thể ghi trong thư mục lưu trữ nội bộ Pictures/MY_APP_NAMEđể lưu hình ảnh, nhưng nó chỉ hoạt động trên Android 10 (SDK 29) trở lên (chưa được thử nghiệm trên Android R). Khi tôi thử nghiệm lại trên phiên bản thấp hơn, chẳng hạn như Android M (SDK 23), việc lưu hình ảnh ngừng hoạt động nên tôi quyết định trả lạiandroid.permission.WRITE_EXTERNAL_STORAGEdo đó cảnh báo lại hiển thị. Có thể nào sợi vải chỉ là dương tính giả mà chẩn đoán không chính xác vấn đề trên các trường hợp khác nhau? Bởi vì hiện tại SDK hỗ trợ của tôi bắt đầu với 21, mới nhất là 30 nhưng lint chỉ chỉ ra rằng nó không còn cần thiết khi nhắm mục tiêu Android 10 (SDK 29) và đã không xem xét lại việc hỗ trợ SDK tối thiểu của dự án.

44 hữu ích 5 bình luận 24k xem chia sẻ
29

Một cách giải quyết là thực sự bỏ qua cảnh báo, vì nó chỉ là thông tin và do đó vô hại. Bằng cách đặt maxSdkVersion thành 28, bạn không cần phải lo lắng nữa.

<uses-permission
    android:name="android.permission.WRITE_EXTERNAL_STORAGE"
    android:maxSdkVersion="28"
    tools:ignore="ScopedStorage" />

Lưu ý rằng việc sử dụng cờ android: requestLegacyExternalStorage như đã nêu trong các câu trả lời khác không phải là giải pháp, chỉ là một bản vá tạm thời sẽ không còn hoạt động trong Android 11 và các phiên bản trong tương lai.

Cập nhật để làm rõ một số nghi ngờ được nêu ra trong các bình luận:

Nếu sử dụng cờ requestLegacyExternalStorage trong Android 10 thì hãy yêu cầu quyền WRITE_EXTERNAL_STORAGE như bình thường.

Flag requestLegacyExternalStorage không có tác dụng gì trong Android 11, nó hoàn toàn bị bỏ qua.

WRITE_EXTERNAL_STORAGE không cung cấp bất kỳ đặc quyền nào trong Android 11, nó không có tác dụng gì cả, do đó bạn cần đặt maxSdkVersion thành 29.

Nếu cũng không sử dụng requestLegacyExternalStorage trong Android 10, hãy đặt maxSdkVersion thành 28 thay vì 29.

Trong Android 11 (không phải 10), API tệp cũ hơn có thể được sử dụng lại nhưng "chỉ" khi truy cập các thư mục "bộ nhớ dùng chung" công khai (DCIM, Âm nhạc, v.v.) hoặc thư mục "riêng tư" của ứng dụng của bạn. Đối với các vị trí khác, API DocumentFile là bắt buộc.

Hãy xem xét rằng API Tệp ​​hiện chậm hơn nhiều trong API 30, vì đã được cấu trúc lại về cơ bản trở thành một trình bao bọc, điều này là để thực thi việc sử dụng nó chỉ ở những vị trí được phép. Vì vậy, không còn là một API tệp hệ thống nhanh, chỉ là một trình bao bọc ủy quyền nội bộ công việc cho MediaStore. Khi sử dụng File API trong Android 11 trở lên, bạn nên xem xét việc đánh lỗi hiệu suất.

29 hữu ích 5 bình luận chia sẻ
24

Cố gắng thêm điều này vào Tệp kê khai của bạn:

<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:requestLegacyExternalStorage="true" //Add this Line
android:label="@string/app_name">

 ---------<Activity, Sevices or Recivers>----------

</application>

và xóa READ_EXTERNAL_STORAGEquyền một lần nữa:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
24 hữu ích 5 bình luận chia sẻ
3

Như đã trả lời @PerracoLabs, cảnh báo chỉ là thông tin. Sẽ tốt hơn nếu lúc đầu bạn đọc được câu trả lời của anh ấy. https://stackoverflow.com/a/65477206/6055194

Tôi chỉ sử dụng WRITE_EXTERNAL_STORAGEquyền để tải xuống các tệp .pdf vào Downloadsvà các thư mục "riêng tư" của ứng dụng bằng cách sử dụng of DownloadManager(điều đó quan trọng và bạn có thể hiểu tại sao nếu bạn sẽ đọc thảo luận trong câu trả lời @PerracoLabs). Vì vậy, tôi vừa thêm cấp SDK tối đa cho quyền này và bỏ qua thẻ cho bộ nhớ trong phạm vi.

<uses-permission
    android:name="android.permission.WRITE_EXTERNAL_STORAGE"
    android:maxSdkVersion="28"
    tools:ignore="ScopedStorage" />

PS nếu toolsthẻ không được nhận dạng, bạn phải khai báo nó bằng cách thêm xmlns:tools="http://schemas.android.com/tools"vào AndroidManifest.xml của bạn như thế này.

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.app.my">

Nhưng bạn phải lưu ý rằng sau khi onRequestPermissionsResulthàm sẽ không được gọi Build.VERSION_CODES.Qvà cao hơn (API 29+). Vì vậy, bạn phải gọi quyền yêu cầu WRITE_EXTERNAL_STORAGEchỉ cho API thấp hơn 29.

Vì vậy, bạn có thể thêm chức năng kiểm tra ghi bộ nhớ ngoài như thế này (Kotlin).

   private fun hasWriteStoragePermission(): Boolean {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
            return true
        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            if (ActivityCompat.checkSelfPermission(activity!!, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
                requestPermissions(
                        arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE),
                        REQUEST_PERMISSIONS_CODE_WRITE_STORAGE
                )

                return false
            }
        }

        return true
    }
3 hữu ích 0 bình luận chia sẻ
loading
Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ android android-permissions , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm

loading