Câu hỏi Quyền ghi vào thẻ SD


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() tồn tại, và nếu không, hãy ném 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ó đang ném IOException. Làm thế nào tôi có thể thay đổi sự cho phép trên một thư mục / tập tin để có thể ghi vào nó?


76
2018-01-23 02:29


gốc




Các câu trả lời:


Bạn nói đúng rằng thư mục Thẻ SD là /sdcard nhưng bạn không nên mã hóa nó. Thay vào đó, hãy gọi điện đến Environment.getExternalStorageDirectory() để lấy thư mục:

File sdDir = Environment.getExternalStorageDirectory();

Nếu bạn chưa làm như vậy, bạn cần phải cấp cho ứng dụng của mình quyền ghi chính xác 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" />

203
2018-01-23 05:56



Cảm ơn ... Tôi sẽ thay đổi mã của tôi theo đề xuất của bạn. Tuy nhiên hiện tại tôi có nó cứng mã hóa, và không có sự cho phép thiết lập trong tập tin manifest nhưng nó cho phép tôi lưu nó vào thẻ sd anyway. tại sao tôi có thể tiết kiệm nó wothout có sự cho phép thiết lập? - bugzy
@ user244190 - tôi đoán là đ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ề phía trước. - Dave Webb
Gotcha. cảm ơn... - bugzy
@ 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 trả lời và tôi không biết tại sao điều đó không hiệu quả. - Saher Ahwal


Kỹ thuật được đề xuất ở trên trong câu trả lời của Dave chắc chắn là một thực hành thiết kế tốt, và có cuối cùng sự cho phép 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 đơn thuần để thêm nhiều nhất (nếu không phải tất cả, không chắc chắn) "tùy chọn hiển thị" là thông qua các thuộc tính của lớp thực hiện 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 là không giả mạo bằng tay (tôi chắc chắn 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);
  }
}

1
2017-08-22 18:46



Trên thực tế, tôi thấy rằng cài đặt WRITE_EXTERNAL_STORAGE này là sự cho phép 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: permission) và không phải là sự cho phép của người dùng trong tệp kê khai. Oh, tôi chỉ cần nhớ, bạn đặt người dùng cho phép người dùng các thuộc tính dự án trong VS (một danh sách hộp kiểm của tất cả các quyền). - samsara
Chúng thực sự là các thẻ "cho phép sử dụng", không phải là "sự cho phép của người dùng", nhưng ngoài việc mọi thứ khác đều đúng. - samsara
Một điều hoàn toàn cần thiết là gọi nếu (Build.VERSION.SDK_INT> = 19) {MainActivity.get (). GetExternalFilesDirs (null); } // Để có quyền truy cập vào SD / Android / data / your.package.name // Đừng tự mình tạo thư mục gói. Không thực hiện kết quả cuộc gọi này bằng mkdir hoặc mkdir không hoạt động. - pstorli