2011-01-20 47 views
9

Tôi đang cố gắng lưu một số dữ liệu từ ứng dụng của mình trong một tệp văn bản đơn giản trên vùng lưu trữ riêng bên trong (tùy chọn người dùng ứng dụng). Tôi đã đọc qua nhiều câu hỏi ở đây (StackOverflow) và đã thử các giải pháp được đề xuất không thành công. Giải pháp đơn giản nhất, có vẻ như, sẽ là giải pháp được đề xuất ở đây:

http://developer.android.com/guide/topics/data/data-storage.html#filesInternal

nhưng tôi không thể làm việc này trên thiết bị thử nghiệm của mình. Tôi cũng đã cố gắng để tạo ra các tập tin bằng cách sử dụng các phương pháp có sẵn trong java.io.File với các phương pháp thích hợp. Tôi cũng đã cố gắng tạo tệp trên SDCard với cùng một kết quả, không thành công. Tôi đã thử nhiều giải pháp được liệt kê trong các câu trả lời khác, theo mã và hướng dẫn được đề xuất chính xác và tìm cùng một kết quả. Tôi bắt đầu cảm thấy rằng tôi đang thiếu một số bit quan trọng của mã, hoặc một lá cờ thiết lập ở đâu đó, tôi đã đặt cho phép trong file manifest:

Ghi vào bộ nhớ riêng trong Android

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


Để được rõ ràng, Tôi đang cố gắng ghi vào bộ nhớ riêng, nội bộ của thiết bị. Đây là một tệp nhỏ chứa tên, số điện thoại và một vài loại cờ int. Tôi sử dụng phương pháp nào, tôi hoặc thấy rằng tệp không tạo (hoặc thay đổi nếu tôi đặt tệp theo cách thủ công trên thẻ SDCard) hoặc tôi nhận được NullPointerException khi cố gắng tham khảo tệp hoặc vị trí tệp:

private    File fILE = new File("Mydata", main.FILENAME); 

hoặc

private    File fILE = getDir("Mydata", 0); 


tôi đang chạy mã trên HTC hero, cập nhật với việc phát hành dịch vụ mới nhất từ ​​Sprint. Bất kỳ trợ giúp sẽ được đánh giá cao, cảm ơn trước!

-Steve

Cập nhật (2/2/11): Sử dụng một EVO (API 8) Tôi vẫn nhận được một NullPointerException. Mã tạo ra ngoại lệ là dưới đây, bất kỳ suy nghĩ về lý do tại sao ứng dụng của tôi không thể truy cập bộ nhớ trong? Tôi có vấn đề này trên ba thiết bị vật lý khác nhau bằng cách sử dụng hai cấp API (API 7 và 8).

File newfile = new File(this.getFilesDir() + "/data/files/", "sample.txt"); 

CẬP NHẬT 2: 2/4/11 - Tôi thấy rằng tôi không thể xem cấu trúc tệp trên thiết bị thực (trong bất kỳ trường hợp nào). Có ai có suy nghĩ nào về vấn đề này nữa ko? Thiết bị được cấu hình đúng và có thể chạy ứng dụng từ nhật thực hoặc adb.

CẬP NHẬT 3: (2/9/11) - Tôi nghĩ rằng tôi có thể đã tìm thấy vấn đề ở đây, nhưng tôi không chắc chắn về cách giải quyết vấn đề. Tôi đã tìm ra rằng các điều khoản trên thư mục/data/trên các thiết bị vật lý là: drwxrwx--x. Tôi không chắc tại sao nó theo cách này, có thể là một cái gì đó với Sprint? Tôi đã tìm thấy thiết lập này theo cách này trên một HTC Hero, Samsung Epic (Galaxy S), và HTC EVO tất cả trên Sprint. Vấn đề dường như là DDMS và ứng dụng của tôi không có quyền truy cập r/w vào thư mục. Tôi cần phải tìm ra 2 thứ ở đây, tại sao nó giống như thế này và làm thế nào để vượt qua vấn đề này trong tự nhiên. Một lần nữa, bất kỳ sự giúp đỡ nào ở đây sẽ rất tuyệt vời !!

CẬP NHẬT 4: Tôi nghĩ rằng tháng 2 năm ngoái là tổng thời điểm tóc vàng dành cho tôi (xem CẬP NHẬT 3). Các thiết bị thử nghiệm mà tôi có không bị ROOT và do đó không có quyền truy cập (DUH!). Sau khi tất cả các bản cập nhật mà ông SGS và EVO 4G đã trải qua, kết quả vẫn như cũ. Tôi vẫn đang làm việc vấn đề này và sẽ cố gắng và lấy lại ở đây với một bản cập nhật sớm (hy vọng ít hơn một năm tiếp theo thời gian).

+0

Bạn có nhận được thông báo lỗi khi bạn thử các phương pháp khác nhau này hoặc chỉ là âm thầm không? –

+0

Tôi đang tập trung vào cách 'openFileOutput()' ngay bây giờ và tôi nhận được một NullPointerException. Dường như thư mục dữ liệu cá nhân trên điện thoại bị khóa vì một số lý do, tôi thậm chí không thể nhìn vào thư mục; giống như không có gì tạo ra ở đó. Các quyền trên thư mục 'dữ liệu' trên điện thoại là: "drwxrwx - x".Tôi bắt đầu tự hỏi liệu có cài đặt không hợp lệ trên điện thoại hay gì đó không. Đó là yêu cầu của ứng dụng mà tệp dữ liệu ghi vào bộ nhớ trong, để tương thích. – Kingsolmn

+0

bạn sẽ không thể truy cập thư mục/dữ liệu trên thiết bị thực với DDMS trừ khi bạn có quyền truy cập root nhưng bạn vẫn có thể ghi vào tệp từ ứng dụng của mình. điều gì xảy ra trên trình mô phỏng? bạn có thể viết một tập tin được không? – techiServices

Trả lời

3

Không phải là câu trả lời trực tiếp cho câu hỏi của bạn, tuy nhiên: tôi nhận thấy rằng bạn không muốn lưu trữ nhiều dữ liệu trong tệp của mình. Thay vào đó, nó có phải là một thay thế đủ để sử dụng Tùy chọn được chia sẻ không?

Và có lẽ còn thú vị hơn nữa: sự cố có xảy ra ngay cả khi bạn ghi vào tệp Tùy chọn được chia sẻ thay thế không?

http://developer.android.com/guide/topics/data/data-storage.html#pref

+0

Tôi không thể xem/lập trình truy cập thư mục/data/trên bất kỳ thiết bị vật lý nào. Tôi đã không chạy ứng dụng của tôi trên một thiết bị vật lý kể từ khi thay đổi sang SharedPreferences, nhưng tôi biết rằng tôi vẫn không thể xem thư mục. Tôi đang sử dụng Eclipse 3.5 classic, trình điều khiển USB HTC, tất cả được cập nhật lên phiên bản mới nhất. – Kingsolmn

+0

Sử dụng 'SharedPreferences' hoạt động trên thiết bị vật lý. Xem câu trả lời của tôi dưới đây để suy đoán nhàn rỗi như những gì đã xảy ra ở đây. @dbm – Kingsolmn

+0

Yeay! :-) Có vẻ như vấn đề trước mắt của bạn được giải quyết ít nhất. Vui vì tôi có thể giúp (nhờ dấu kiểm màu xanh lá cây) :-) – dbm

4

thư mục /data/ Một thiết bị vật lý là chỉ có sẵn cho người dùng root. Vì cách thực tế duy nhất để có được quyền truy cập này trên một thiết bị vật lý là root thiết bị, DDMS file explorer không thể vào nhánh cây thư mục này.

Tại sao ứng dụng sẽ không viết ở đó, có thể sự cố là tôi đã ký ứng dụng với các phím gỡ lỗi (không phải chuyên gia NIX * lớn, nhưng dường như là trường hợp này từ nghiên cứu cá nhân của tôi).

4

Hãy thử thay đổi dòng sau:

File newfile = new File(this.getFilesDir() + "/data/files/", "sample.txt"); 

tới:

File newfile = new File(this.getFilesDir() + "/","sample.txt"); 
+0

Thers không cần đến '+"/"'. –

4

tôi đã đối phó với vấn đề tương tự. Cuối cùng, tôi thấy rằng bạn thực sự không phải cung cấp tất cả đường dẫn tệp để tạo tệp mới trong bộ nhớ trong. Chỉ cần đề cập đến tên tệp và tên tệp sẽ được tạo trong thư mục gói của ứng dụng của bạn tại thiết bị. Tôi đã đề cập chính xác here

Và nó hoạt động hoàn hảo. Tôi sẽ nói tránh đề cập đến đường dẫn tệp đầy đủ như:/data/... để tạo tệp (bạn cần quyền phù hợp để tạo tệp theo cách như vậy). Hãy để khung làm việc của Android thực hiện công việc để tạo tệp riêng tư cho ứng dụng của bạn.

2

Khu vực lưu trữ nội bộ là loại riêng tư cho ứng dụng để người dùng phải có quyền truy cập gốc (thiết bị gốc) để tạo và tải tệp. Nếu bạn đã bắt nguồn từ thiết bị này là làm thế nào để viết một tập tin vào bộ nhớ trong:

// Create a file in the Internal Storage 

String fileName = "MyFile"; 
String content = "hello world"; 

FileOutputStream outputStream = null; 
try { 
outputStream = openFileOutput(fileName, Context.MODE_APPEND); 
outputStream.write(content.getBytes()); 
outputStream.close(); 
} catch (Exception e) { 
    e.printStackTrace(); 
} 

này ngay lập tức tạo nên một tập tin gọi MyFile với nội dung hello world. Thư mục lưu trữ nội bộ thường được tìm thấy ở một vị trí đặc biệt được chỉ định theo tên gói của ứng dụng của chúng tôi. Trong trường hợp của tôi, dữ liệu/dữ liệu/[tên gói] và các tệp được tạo sẽ được lưu trữ trong một thư mục có tên tệp trong thư mục đó.

0

Như @bianca nói, bạn không nên sử dụng đường dẫn tệp. Nhưng thay vào đó, chỉ sử dụng tên tệp để tạo Tệp. Một cái gì đó như thế này:

public static void saveTextToFile(Context context, String filename, String content) { 
    try { 
    FileOutputStream fos = openFileOutput(filename, Context.MODE_PRIVATE); 
    fos.write(content.getBytes()); 
    fos.close(); 
    } catch (Exception e) { 
    e.printStackTrace(); 
    } 
} 

Và để có được các tập tin, bạn có thể sử dụng:

File file = new File(context.getFilesDir(), filename); 

Read more: Saving Files.

Các vấn đề liên quan