Truy cập bộ nhớ ngoài trong Android API 29

Sep 11 2020

Tôi đang cố gắng đạt được một số công cụ dọn dẹp. Ngày càng có nhiều nhà sản xuất cấm root thiết bị do "lý do bảo mật" nào đó, không được yêu cầu mở khóa.

Sau API 28, mã này sẽ mắc lỗi:


ActivityCompat.requestPermissions(this, new String[]{
  Manifest.permission.READ_EXTERNAL_STORAGE,
  Manifest.permission.WRITE_EXTERNAL_STORAGE
}, 1); // Request permission or not, Will got same result

File rootFolder = Environment.getExternalStorageDirectory(); // That is working fine
rootFolder.listFiles(); // That will return null

Chắc chắn, tôi có thể sử dụng cái này:

android:requestLegacyExternalStorage="true"

Nhưng tôi tin rằng nó sẽ bị giết trong tương lai.

Vì vậy, bất kỳ cách thanh lịch để quản lý thẻ SDCard?

Trả lời

4 blackapps Sep 11 2020 at 07:10

Trên Android 10 Environment.getExternalStorageDirectory()và Environment.getExternalStoragePublicDirectory()sẽ trả về đường dẫn lưu trữ nhưng đường dẫn không thể đọc hoặc ghi được.

  1. Đối với Android 10, bạn có thể tiếp tục sử dụng các đường dẫn được cung cấp bởi Environment.getExternalStorageDirectory () và Environment.getExternalStoragePublicDirectory () nếu bạn thêm android:requestLegacyExternalStorage="true"vào thẻ ứng dụng trong tệp kê khai. Trong thời gian chạy, ứng dụng của bạn có thể gọi Environment.isExternalStorageLegacy()để kiểm tra xem yêu cầu đã được thực hiện chưa.

  2. Một khả năng khác (không được biết đến) (chỉ dành cho Android 10) là thêm <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />vào tệp kê khai. Người dùng phải đi tới cài đặt nâng cao của ứng dụng và bật từ Advanced settings Install unknown apps | Allow from this source. Điều tốt đẹp với điều này là người dùng có thể chuyển đổi các quyền truy cập. Bạn có thể giúp người dùng dễ dàng hơn nếu bạn triển khai ý định cho Settings.ACTION_APPLICATION_DETAILS_SETTINGSnơi họ có thể thay đổi cài đặt. Một điều buồn cười là Environment.isExternalStorageLegacy () cũng trả về true.

  3. Biên dịch cho Android 11 cả hai tùy chọn không hoạt động trên thiết bị Android 11. (Nhưng chúng tiếp tục hoạt động cho các thiết bị Android 10). Các đường dẫn của Environment.getExternalStorageDirectory () và Environment.getExternalStoragePublicDirectory () là usable again in read mode and very often in write mode too. Và điều này thật tuyệt vì người ta có thể liệt kê lại nội dung của các thư mục như Tải xuống hoặc Ảnh hoặc DCIM / Máy ảnh bằng cách sử dụng lớp Tệp. Nhưng việc thêm <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />vào tệp kê khai và triển khai ý định Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSIONsẽ cấp cho ứng dụng của bạn quyền truy cập đọc / ghi cho tất cả các tệp ngay cả trên thẻ micro sd có thể tháo rời. (Cuối cùng, bạn có thể gỡ bỏ lệnh cấm của google không thể đọc / ghi thẻ micro sd của riêng bạn trên thiết bị Android của riêng bạn bằng ứng dụng của riêng bạn). Environment.isExternalStorageManager()có thể được sử dụng để kiểm tra xem quyền được bật / tắt. Miễn là bạn không cố tải ứng dụng của mình lên cửa hàng chơi, bạn vẫn ổn.