Kiểm tra theo chương trình nếu trong Android 10+, quyền truy cập bộ nhớ ngoài cũ bị vô hiệu hóa


12

Có một lệnh gọi API đơn giản nào sẽ cho tôi biết nếu một ứng dụng chạy trên Android 10 trở lên phải sử dụng quyền truy cập Scoped Storage, nghĩa là, nếu quyền truy cập tệp thông thường, còn gọi là "Lưu trữ bên ngoài kế thừa" bị tắt? Lưu ý rằng ngay cả khi ứng dụng trong AndroidManifest.xml, phần đã khai báo:

  android:requestLegacyExternalStorage="true"

quyền truy cập tệp vẫn có thể bị từ chối do những thay đổi chính sách của Google trong tương lai, vì vậy việc kiểm tra giá trị này là vô ích. Cách duy nhất tôi tìm thấy là kiểm tra xem thư mục gốc của bộ lưu trữ bên ngoài có thể đọc được hay không, nhưng trước tiên, ứng dụng phải xin phép Lưu trữ, điều này vô dụng đối với mọi thứ khác, nếu lưu trữ kế thừa bị vô hiệu hóa.

public static boolean mustUseScopedStorage() {
    // Impractical must first ask for useless Storage permission...
    File exSD = Environment.getExternalStorageDirectory();
    return !exSD.canRead(); // this test works only if Storage permission was granted.
}

Tôi nghĩ rằng tôi đã từng thấy một API mới để phát hiện điều này, nhưng không thể tìm thấy bài viết đó nữa ...


an app running on Android 10 or later must use Scoped Storage access? Bạn có thể giải thích những gì bạn có ý nghĩa với điều đó? Những suy nghĩ nào bạn có trong tâm trí? Tôi biết rằng, ví dụ Khối lượng lưu trữ và Trình quản lý lưu trữ được mang cho N đã không được dùng cho Q.
blackapps

Ý tôi là truy cập tệp Java thường xuyên ngoài hộp cát được hệ thống gán cho ứng dụng hoặc ví dụ như trong mã JNI C / C ++ fopen ("filename.ext", mode); sẽ không hoạt động (truy cập bị từ chối) nếu đường dẫn tệp nằm ngoài thư mục ứng dụng được chỉ định bởi hệ thống. Chà, nó sẽ hoạt động trên Android 10 ngay bây giờ, nếu bạn sử dụng android: requestLegacyExternalStorage = "true" trong bảng kê khai, nhưng đó là một giải pháp tạm thời và có thể bị vô hiệu hóa hoàn toàn vào năm tới. Đọc thêm ví dụ androidcentral.com/what-scoped-storage-android-q
gregko

Ngay cả trong bài viết đó cũng không rõ lưu trữ trong phạm vi sẽ là gì.
blackapps

@blackapps, có lẽ bài viết này giải thích nó tốt hơn: developer.android.com/training/data-st
Storage / files / ám

Đồng ý. Hạn chế truy cập vào các thư mục riêng của ứng dụng.
blackapps

Câu trả lời:


8

Bạn có thể sử dụng hai phương pháp này từ android.os.Environment:

  • isExternalStorageLegacy(File path)

    Trả về việc phương tiện lưu trữ được chia sẻ / lưu trữ bên ngoài tại đường dẫn cụ thể có phải là chế độ xem kế thừa bao gồm các tệp không thuộc sở hữu của ứng dụng hay không.

  • isExternalStorageLegacy()

    Trả về liệu phương tiện lưu trữ chia sẻ / lưu trữ bên ngoài chính là chế độ xem cũ bao gồm các tệp không thuộc sở hữu của ứng dụng.

Giá trị này có thể khác với giá trị được yêu cầu requestLegacyExternalStoragetrong bảng kê khai của ứng dụng, vì một ứng dụng có thể kế thừa trạng thái kế thừa của nó dựa trên thời điểm nó được cài đặt lần đầu tiên.

Các ứng dụng không phải là di sản có thể tiếp tục khám phá và đọc phương tiện thuộc về các ứng dụng khác thông qua MediaStore.

Trong trường hợp bạn phát hiện ra rằng bạn có quyền truy cập vào bộ lưu trữ cũ, cá nhân tôi nghĩ rằng tốt hơn hết là chỉ di chuyển dữ liệu sang bộ lưu trữ trong phạm vi và sử dụng nó thay vì bộ lưu trữ cũ có thể ngừng hoạt động mà không có cảnh báo.


1
Cảm ơn bạn, @Zaffy, đây chính xác là câu trả lời tôi đang tìm kiếm. Nó hoạt động hoàn hảo và không cần phải yêu cầu "Truy cập bộ nhớ".
gregko
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.