Về mặt kỹ thuật, điều này là do việc ghi vào bộ nhớ trong không được hỗ trợ khi sử dụng ứng dụng Máy ảnh để chụp ảnh. Trong thực tế, bạn có thể nhận thấy một ngoại lệ được in trong logcat ghi rõ số Writing to internal storage is not supported
. Tuy nhiên, lý do thực sự không hiệu quả là vì mặc định bạn đang tạo một tệp riêng tư cho gói ứng dụng của mình và một ứng dụng khác (ví dụ ứng dụng Camera) không thể truy cập vị trí tệp đó vì nó không có quyền làm như vậy. Bộ nhớ ngoài là phần duy nhất có thể truy cập trên toàn cầu của hệ thống tệp.
Giải pháp thay thế dành cho bạn là tạo tệp có quyền toàn cầu (WORLD_WRITEABLE). Thông thường, điều này cho phép ứng dụng Máy ảnh truy cập tệp qua Uri đã qua. Không có thực sự phương pháp để làm điều này trực tiếp trên File
, vì vậy bạn phải tạo ra các tập tin bằng cách sử dụng phương pháp có sẵn trong Context
và sau đó lấy một tay cầm vào nó sau đó:
//Remove if exists, the file MUST be created using the lines below
File f = new File(getFilesDir(), "Captured.jpg");
f.delete();
//Create new file
FileOutputStream fos = openFileOutput("Captured.jpg", Context.MODE_WORLD_WRITEABLE);
fos.close();
//Get reference to the file
File f = new File(getFilesDir(), "Captured.jpg");
này cũng loại giới hạn nơi bạn có thể đặt tệp từ các phương thức Context
vốn đã tạo các tệp trong thư mục "tệp" gốc và bạn không thể chuyển hướng tệp đó vào thư mục bộ nhớ cache.
HTH
Tuyệt vời, tôi đã có một linh cảm đó là vấn đề . Tôi nghĩ rằng tôi sẽ chỉ di chuyển ảnh tạm thời vào thẻ SD một lần nữa, nhưng tôi sẽ thêm nó vào bộ công cụ của tôi :) – sgarman
Bất kỳ ý tưởng nào về cách giải quyết việc sử dụng Context.MODE_WORLD_WRITEABLE? – superbre
Từ [tại đây] (http://developer.android.com/reference/android/content/Context.html): ** MODE_WORLD_WRITEABLE Hằng số này không được chấp nhận ở cấp API 17. Tạo tệp có thể ghi trên thế giới rất nguy hiểm và có khả năng gây ra lỗ hổng bảo mật trong các ứng dụng.Thật không khuyến khích, ** – Atul