Quyền ghi vào thẻ SD


80

Tôi muốn ứng dụng của mình lưu trữ DB ứng dụng vào thẻ SD. Trong mã của tôi, tôi kiểm tra xem thư mục canWrite()có tồn tại không, và nếu không, hãy ném một IOException. Trong trường hợp cụ thể này, tôi đang cố gắng sao chép tệp db vào thư mục gốc trên thẻ SD, nhưng nó bị lỗi IOException. Làm cách nào để thay đổi quyền trên một thư mục / tệp để có thể ghi vào nó?

Câu trả lời:


209

Bạn nói đúng là thư mục Thẻ SD /sdcardnhưng bạn không nên khó mã hóa nó. Thay vào đó, hãy thực hiện cuộc gọi tới Environment.getExternalStorageDirectory()để lấy danh bạ:

File sdDir = Environment.getExternalStorageDirectory();

Nếu bạn chưa làm như vậy, bạn sẽ cần cấp cho ứng dụng của mình quyền chính xác để ghi vào Thẻ SD bằng cách thêm dòng bên dưới vào Tệp kê khai của bạn:

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

Cảm ơn ... Tôi sẽ thay đổi mã của mình theo đề xuất của bạn. Tuy nhiên hiện tại tôi có nó được mã hóa cứng và không có quyền được đặt trong tệp kê khai nhưng dù sao nó vẫn cho phép tôi lưu nó vào thẻ sd. tại sao tôi có thể lưu nó mà không cần đặt quyền?
bugzy

4
@ user244190 - tôi đoán rằng điện thoại của bạn đang chạy Android 1.5. WRITE_EXTERNAL_STORAGEđã được giới thiệu trong phiên bản 1.6, vì vậy bạn sẽ cần đưa nó vào ứng dụng của mình nếu bạn muốn nó tương thích về sau.
Dave Webb

@DaveWebb: vui lòng xem câu hỏi của tôi tại đây: stackoverflow.com/questions/9351904/…
Saher Ahwal

Không ai phản hồi và tôi không biết tại sao nó không hoạt động.
Saher Ahwal

@DaveWebb - ý kiến ​​đúng, nhưng có lẽ không phải điện thoại đang chạy 1.5 mà là do ứng dụng chỉ định nó được xây dựng dựa trên 1.5 hoặc (phổ biến hơn) hoàn toàn không chỉ định phiên bản và khi điện thoại mới hơn thấy rằng nó sẽ thêm quyền tương thích ngược.
Chris Stratton

1

Kỹ thuật được đề xuất ở trên trong câu trả lời của Dave chắc chắn là một phương pháp thiết kế tốt và có, cuối cùng quyền bắt buộc phải được đặt trong tệp AndroidManifest.xml để truy cập bộ nhớ ngoài.

Tuy nhiên, cách Mono-esque để thêm hầu hết (nếu không phải tất cả, không chắc chắn) "tùy chọn tệp kê khai" là thông qua các thuộc tính của lớp triển khai hoạt động (hoặc dịch vụ).

Plugin Visual Studio Mono tự động tạo tệp kê khai, vì vậy tốt nhất bạn không nên giả mạo nó theo cách thủ công (tôi chắc chắn rằng có những trường hợp không có tùy chọn nào khác).

Ví dụ:

[Activity(Label="MonoDroid App", MainLauncher=true, Permission="android.permission.WRITE_EXTERNAL_STORAGE")]
public class MonoActivity : Activity
{
  protected override void OnCreate(Bundle bindle)
  {
    base.OnCreate(bindle);
  }
}

Trên thực tế, bây giờ tôi thấy rằng cài đặt WRITE_EXTERNAL_STORAGE này là quyền của người dùng và nếu được đặt theo cách trên, sẽ xuất hiện dưới dạng cài đặt hoạt động (android: allow) chứ không phải là quyền của người dùng trong tệp kê khai. Ồ, tôi mới nhớ, bạn đặt cho người dùng quyền của người dùng thuộc tính dự án trong VS (danh sách hộp kiểm của tất cả các quyền).
samis

1
Chúng thực sự là thẻ "quyền sử dụng", không phải "quyền của người dùng", nhưng ngoài ra mọi thứ khác đều đúng.
samis

Một điều hoàn toàn cần thiết là gọi if (Build.VERSION.SDK_INT> = 19) {MainActivity.get (). GetExternalFilesDirs (null); } // Để có quyền truy cập vào SD / Android / data / your.package.name // Đừng cố tự tạo gói dir. Không thực hiện cuộc gọi này dẫn đến mkdir hoặc mkdirs không hoạt động.
pstorli
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.