2013-03-29 38 views
33

dòng này:Đang cố gắng để tạo ra một tập tin trong Android: mở thất bại: EROFS (hệ thống tập tin Read-only)

final FileOutputStream outputStream = new FileOutputStream(name); 

kết quả trong một FileNotFoundException với thông điệp là /2ozjfFQzwv: open failed: EROFS (Read-only file system) nơi "2ozjfFQzwv" là những gì tôi trôi qua như tên của tập tin.

Tôi đã thử điều này có và không có sự cho phép của WRITE_INTERNAL_STORAGE. Làm cách nào để tạo tệp này để viết?

Ngoài ra, tôi chỉ muốn có thể đưa hình ảnh vào một hoạt động mới và quá lớn để sắp xếp nó thành một phần bổ sung. Có cách nào dễ dàng hơn là viết nó vào một tập tin sau đó đọc từ nó một lần nữa? Tất cả các câu hỏi trên đây dường như là viết về một thẻ SD, mà tôi không muốn làm vì nhiều người không có khe cắm thẻ SD.

Trả lời

65

Tôi đã thử điều này có và không có sự cho phép WRITE_INTERNAL_STORAGE.

Không có quyền số WRITE_INTERNAL_STORAGE trong Android.

Làm cách nào để tạo tệp này để viết?

Bạn không, ngoại trừ có lẽ trên thiết bị gốc, nếu ứng dụng của bạn đang chạy với đặc quyền siêu người dùng. Bạn đang cố ghi vào thư mục gốc của bộ nhớ trong, ứng dụng nào không có quyền truy cập.

Vui lòng sử dụng phiên bản của hàm tạo FileOutputStream có đối tượng File. Tạo rằng File đối tượng dựa tắt của một số vị trí mà bạn có thể viết thư cho, chẳng hạn như:

  • getFilesDir() (kêu gọi Activity hoặc Context khác)
  • getExternalFilesDir() (kêu gọi Activity hoặc Context khác)

Yêu cầu thứ hai sẽ yêu cầu WRITE_EXTERNAL_STORAGE làm quyền.

Có cách nào dễ dàng hơn là viết nó vào một tệp, sau đó đọc lại từ tệp không?

Bạn có thể tạm thời đặt nó vào thành viên dữ liệu tĩnh.

vì nhiều người không có khe cắm thẻ SD

"khe cắm thẻ SD" là không thích hợp, bởi và lớn. 99% người dùng thiết bị Android sẽ có bộ nhớ ngoài - ngoại lệ sẽ là thiết bị cũ hơn 4 năm mà người dùng đã xóa thẻ SD của họ. Các thiết bị được sản xuất kể từ giữa năm 2010 có bộ nhớ ngoài như một phần của flash trên bo mạch, không phải là phương tiện lưu động.

+5

+1 cho getFilesDir(), cảm ơn bạn 'BufferedWriter mới (FileWriter mới (getFilesDir() + FILENAME)); ' –

+0

thiết bị Old? Theo như tôi đã học được từ việc sử dụng Nexus 7 2013, nó không hỗ trợ thẻ SD ... tương tự với Nexus 10, có lẽ là Nexi khác. – PawelP

+12

@ PawełParadowski: Tất cả các thiết bị Nexus đều có bộ nhớ ngoài. Họ không có lưu trữ di động. Bộ nhớ ngoài không có nghĩa là lưu trữ di động. – CommonsWare

3

Đây là mẫu đơn giản từ android developer.

Về cơ bản, bạn có thể viết một tập tin trong bộ nhớ trong như thế này:

String FILENAME = "hello_file"; 
String string = "hello world!"; 

FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_PRIVATE); 
fos.write(string.getBytes()); 
fos.close(); 
2

Như những người khác đã đề cập, ứng dụng trên Android không thể viết một tập tin vào bất kỳ thư mục lưu trữ nội bộ nhưng lưu trữ riêng của họ (dưới/data/data/PACKAGE_NAME).

Bạn nên sử dụng API để nhận đường dẫn chính xác được phép cho ứng dụng của bạn.

đọc this.

13

thử sử dụng sự cho phép của WRITE_EXTERNAL_STORAGE Bạn nên sử dụng thẻ đó cho dù có thẻ bên ngoài hay không.

này hoạt động tốt đối với tôi:

path = Environment.getExternalStoragePublicDirectory(
       Environment.DIRECTORY_MOVIES); 
File file = new File(path, "/" + fname); 

và đặt các file trong thư mục thích hợp

+0

'Bắt đầu từ cấp độ 19, quyền này không bắt buộc phải đọc/ghi tệp trong thư mục ứng dụng cụ thể của bạn được trả về bởi getExternalFilesDir (String) và getExternalCacheDir(). 'https://developer.android.com/reference/android/Manifest.permission.html#WRITE_EXTERNAL_STORAGE – user3175580

5

Thêm

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

trong manifest và sử dụng giống như Martin:

path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES); 
File file = new File(path, "/" + fname); 

Nó đã làm việc.

+3

Từ dev.android: Tuy nhiên, nếu ứng dụng của bạn sử dụng quyền WRITE_EXTERNAL_STORAGE, thì nó hoàn toàn có quyền đọc bộ nhớ ngoài . – IlyaEremin

+0

@ilyaEremin - đủ chính xác – Martin