2014-05-13 13 views
15

Tôi muốn lưu trong ứng dụng của tôi một imageFile`/ lưu trữ/mô phỏng/di sản /` vs `/ lưu trữ/mô phỏng/0 /` vs `data/data/MyApp'

Tôi muốn "Google+ giống chim bồ câu ứng dụng" để dùng nó.

Nhưng sau đó mở một hình ảnh khác.

Tôi đoán đó là vấn đề về quyền.

Trong mã của tôi, tôi lưu tại đây:

Đây có phải là bộ nhớ ngoài không? Environment.getExternalStorageDirectory().getAbsolutePath() trả về: /storage/emulated/0/myApp/file1.tmp

sử dụng adb shell là thấy tập tin thực sự được lưu trong: /storage/emulated/legacy/myApp/file1.tmp

tại sao là sự khác biệt?

tôi có nên sử dụng địa điểm này thay thế không? Đây có phải là bộ nhớ ngoài không?

getAppContext().getFilesDir().getParent() trả về: `data/data/MyApp'

Trả lời

26

Về mặt lịch sử sự khác biệt giữa lưu trữ nội bộ và bên ngoài là như sau ...

nội bộ: Các nội bộ nhớ flash của thiết bị Android sử dụng để phân bổ dung lượng lưu trữ riêng cho từng ứng dụng. Bộ nhớ được cấp phát được bảo vệ để ngăn chặn truy cập của bất kỳ ứng dụng nào khác (ngoại trừ trên các thiết bị gốc).

Bên ngoài: Trong nhiều trường hợp thẻ SD không có giới hạn bảo mật, tức là tất cả ứng dụng có thể truy cập tất cả các vùng lưu trữ "bên ngoài".

Khi các phiên bản mới của Android đã đi kèm và các thiết bị mới có bộ nhớ flash nội bộ ngày càng tăng, sự khác biệt giữa nội bộ và bên ngoài đang trở nên mờ. Ví dụ: Nexus 7 của tôi không có khe cắm thẻ SD.

Trong trường hợp thiết bị không có bộ nhớ ngoài thực sự, Android vẫn cần thiết để cung cấp bộ nhớ ngoài được mô phỏng để duy trì tương thích với các ứng dụng cũ hơn. Nói cách khác RAM là vật lý bên trong (không thể tháo rời) nhưng một phần của nó được phân đoạn và API hệ thống tệp Android xử lý phân vùng đó là "bên ngoài" và có thể đọc được trên thế giới.

Đối với các đường dẫn mà bạn nhìn thấy cho việc lưu trữ bên ngoài như ...

/storage/emulated/0/myApp/file1.tmp 
/storage/emulated/legacy/myApp/file1.tmp 

... một hay khác của những người (có thể cả hai) là một chuyển hướng hoặc đường dẫn "ảo" để cùng một phần thư mục và tệp bên ngoài được mô phỏng. Đây là lý do tại sao việc sử dụng đúng lệnh gọi API để truy cập vào các tệp và thư mục thay vì giả sử một đường dẫn mã hóa cứng vì nó cũng có thể khác nhau tùy theo thiết bị.

Nếu bạn sử dụng Environment.getExternalStorageDirectory(), bạn có thể tự tin rằng bất kỳ ứng dụng nào khác làm như vậy sẽ có thể truy cập vào bất kỳ tệp nào bạn tạo ở đó.

Nếu bạn sử dụng getFilesDir() thì bạn đang truy cập thư mục gốc của bộ nhớ trong được cấp riêng cho ứng dụng của bạn và chỉ truy cập được vào ứng dụng của bạn (mặc dù, như tôi đã đề cập đến một điện thoại gốc có thể truy cập bộ nhớ riêng/bộ nhớ trong).

+0

cảm ơn. Vì vậy, làm thế nào đến chỉ có cropper Google+ không thể truy cập hình ảnh đã chụp của tôi trong '/ storage/emulated/0/myApp/file1.tmp'. Photo Gallery cropper tìm và có thể truy cập vào ảnh này –

+0

@EladBenda: Không thể nói mà không biết làm thế nào họ đã viết mã của họ. Bạn có thể thử theo dõi logcat khi cố gắng sử dụng nó và xem liệu nó có ném lên bất kỳ lỗi/ngoại lệ nào như tệp không tìm thấy hoặc truy cập bị từ chối hay không. – Squonk

+5

Một điều nữa cần lưu ý: Bắt đầu với KitKat (4.4) Android không cho phép các ứng dụng đã tải xuống ghi vào đường dẫn tùy ý trên thẻ SD. Họ chỉ có thể ghi vào '/ Android/data/* appname */files', nếu thư mục đó tồn tại (nếu không, ứng dụng sẽ không thể tạo nó). Ứng dụng hệ thống vẫn có thể truy cập thẻ SD như bình thường. Tham chiếu: [\ * 1 \ *] (https://metactrl.com/docs/sdcard-on-kitkat/), [2] (http://www.androidcentral.com/kitkat-sdcard-changes), [ 3] (http://forum.xda-developers.com/xposed/modules/app-handleexternalstorage-t2693521) – LogicDaemon

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