2012-06-07 20 views
10

Ứng dụng của tôi đang kêu gọi các bộ sưu tập với một ý định trông như thế này:Truy xuất hình ảnh Picasa không được lưu trong bộ nhớ cache từ Thư viện. 3,0 và 4,0

Intent intent = new Intent(Intent.ACTION_PICK, 
     android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
startActivityForResult(intent, SELECT_IMAGE_FROM_GALLERY); 

Trong các phiên bản < 3,0 không có vấn đề.

Với 3.0 và cao hơn phiên bản, khi bạn có được một hình ảnh địa phương, mục đích trong phương pháp onActivityResult chứa một Uri như ...

content://media/external/images/media/XXX 

nhưng khi bạn chọn một hình ảnh picasa các uri là một cái gì đó như thế nào. ..

content://com.google.android.gallery3d.provider/picasa/item/XXXXXXXXXXXXXXXXXXXXX 

Tôi đọc nhiều về vấn đề đó và tôi đã thử nhiều cách giải quyết.

Tại thời điểm này, tôi có thể có được hình ảnh chỉ lưu trữ sử dụng:

getContentprovider().openInputStream(uri) 

Vấn đề là, khi hình ảnh không lưu trữ, các openInputStream (uri) phương pháp, ném một FileNotFoundException, và tôi không thể có được hình ảnh: _ (

Bất cứ ai cũng biết làm thế nào để có được các tập tin hoặc các url để tải về các tập tin hoặc một cái gì đó để có được những hình ảnh ??

T hanks !!

+0

Cuối cùng kết thúc với một giải pháp cổ điển ... Bằng cách sử dụng Document.util, trong đó bao gồm tất cả các quyền: - http://stackoverflow.com/a/30453641/1384010 –

Trả lời

2

Một cách khác để có được những bitstream cho bức tranh là thông qua các api picasa ....

áp dụng một số bản đồ để cung cấp nội dung uri ...

nội dung: //com.google.android. gallery3d.provider/picasa/item/5703943700733980450

người ta có thể lập bản đồ nó vào một api picasa như sau:

item => PHOTOID tên ?? albumid ??

picasaweb.google.com/data/entry/api/user/$NAME/albumid/nnnn/photoid/nnnn

Trên đây là một yêu cầu api cho entry ảnh - xem tài liệu picasa để biết chi tiết.

API đòi hỏi

Tên ALBUMID PHOTOID

Tên tôi nghĩ rằng u có thể nhận được từ các tài khoản trên điện thoại. AlbumID rất phức tạp vì giá trị/item/node trong nhà cung cấp nội dung không phải là GUID có thể sử dụng mối quan hệ để phỏng đoán album của nó. Tôi không nghĩ .. AFAIK trong picasa, bạn cần người dùng, album, ảnh tuple để có tham chiếu đến mục nhập ảnh và mục nhập ảnh có URL cho ảnh lớn trong phần tử API:

"phương tiện $ nhóm": { "phương tiện $ nội dung": [ {"url" :

Bạn có thể lấy giá trị văn bản của thuộc tính url và yêu cầu bằng cách sử dụng (các) http nếu mức độ hiển thị của album ở chế độ công khai.Phản hồi là luồng nhị phân của JPG.

php picasa api show large image

xem câu trả lời được chấp nhận trong các liên kết trên để biết thêm chi tiết về việc hình ảnh mà bạn muốn từ api picasa.

Sử dụng một trong những nội dung của riêng URI của tôi trong một ví dụ ...

nội dung: //com.google.android.gallery3d.provider/picasa/item/5703943700733980450

không có sẵn trong bộ nhớ cache để làm thế nào để có được hình ảnh?

cũng tên trên tài khoản là 'rowntreerob' và tôi biết rằng PHOTOID 5703943700733980450 thuộc về ALBUMID 5703943611411433905.

Vì vậy, tôi thực hiện một yêu cầu api cho mục

https://picasaweb.google.com//data/entry/api/user/rowntreerob/albumid/5682316071017984417/photoid/5682316083381958690?fields=media%3Agroup%2Fmedia%3Athumbnail%5B%40url%5D%2Cmedia%3Agroup%2Fmedia%3Acontent%5B%40url%5D&alt=json

và kiểm tra phản hồi cho giá trị văn bản của

"phương tiện truyền thông $ nhóm": { "phương tiện truyền thông $ nội dung": [{ "url":

value = https://lh3.googleusercontent.com/-_FFMNGPU1TQ/TtukXyN4eCI/AAAAAAAACso/EzPmut2iKVQ/DSC01612.JPG

tôi thực hiện một yêu cầu hình ảnh Hình sử dụng giá trị trên và tôi có hình ảnh.


ứng dụng The Gallery 3D cũng có mã bạn có thể ngã ba vì bất cứ nơi nào nó phát hiện một 'lạc' vào một trong các danh sách hình thu nhỏ, nó đại biểu cho giao diện contentProvider để 'get' BMP. Tôi tin rằng giao diện này gói gọn tất cả các phần thực hiện của gory được đề cập ở trên. Bằng cách yêu cầu ContentProvider sản xuất BMP, nhà phát triển không phải lo lắng về hương vị của việc triển khai? Trên thumbtouch, Gallery3d chỉ có thể yêu cầu nhà cung cấp trả lại BMP và cá thể của nhà cung cấp chịu trách nhiệm giải quyết các trạng thái khác nhau của bộ nhớ cache và liệu các cuộc gọi mạng sẽ được yêu cầu trả lại BMP hay không.

+0

yeah ... bc nó phải được công việc của chúng tôi như các nhà phát triển làm tất cả những điều đó. tôi nghĩ là không. đây là googles fck up, không devs – ChuckKelly

7

Giải pháp đúng là sử dụng ACTION_GET_CONTENT. Tên của nó có thể không có âm thanh trực quan như ACTION_PICK nhưng đó là tên bạn nên sử dụng cho những gì bạn đang cố gắng làm.

Lý do đằng sau sử dụng ACTION_GET_CONTENT để chọn một hình ảnh trong bộ sưu tập của bạn thay vì sử dụng ACTION_PICK và trỏ đến nhà cung cấp URI của ImageStore là ACTION_GET_CONTENT được cũng hỗ trợ, trong khi ACTION_PICKkhông. Đã được mentioned một vài lần bởi các kỹ sư của Android Framework.

Tôi đã học được điều đó một cách khó khăn. Trước khi tìm hiểu về điều này, tôi đã phải đối phó với những mâu thuẫn khác nhau.


Một lưu ý liên quan đến này

Bạn nên luôn luôn sử dụng openInputStream để có được các tập tin thông qua một ContentResolver với URI nhận thay vì cố gắng để có được những con đường thật trong đó các tập tin đang được lưu trữ. Nó cũng có thể là trường hợp triển khai ContentProvider được hỗ trợ bởi dịch vụ đám mây (đây là trường hợp với Picasa) hoặc chi tiết triển khai thay đổi theo thời gian.

Nhà cung cấp nội dung của Android cho phép bạn tóm tắt cách dữ liệu được truy cập. Đang cố gắng tìm ra nơi tập tin được đặt là một lỗi phổ biến tôi thấy. Thông thường, những gì được đề xuất là tìm vị trí bằng cách truy vấn cột DATA của URI nhất định. Tùy thuộc vào các ContentProvider sử dụng nó có thể trả lại những thứ khác nhau và thậm chí thay đổi theo thời gian với các phiên bản mới.

Bằng cách sử dụng openInputStream bạn không phải quan tâm đến vị trí của tệp, bạn chỉ nhận được luồng byte và thực hiện những gì bạn muốn với nó. Bằng cách này, bạn sẽ không gặp sự cố hỗ trợ nhà cung cấp nội dung từ các ứng dụng khác như Google Drive, Dropbox, v.v. cung cấp giao diện bộ chọn tương tự để chọn hình ảnh.

Tôi biết OP đang sử dụng openInputStream, nhưng các câu trả lời khác được đề xuất khác và đó là điều tôi thấy quá thường xuyên.