2009-02-18 38 views
44

Tôi đang cố gắng lấy đối tượng FileInputStream trên hình ảnh mà người dùng chọn từ thư viện ảnh. Đây là android URI trả về bởi android.provider.MediaStore.Images.Media.INTERNAL_CONTENT_URIAndroid- làm thế nào tôi có thể chuyển đối tượng android.net.Uri thành đối tượng java.net.URI?

nội dung: // media/bên ngoài/images/media/3

Khi tôi cố gắng xây dựng một java URI đối tượng từ đối tượng này, tôi nhận được một IllegalArgumentException với mô tả ngoại lệ chương trình tập tin Dự kiến ​​trong URI: Nội dung: // media/bên ngoài/images/media/3 trong khi android URI cho thấy các chương trình như nội dung

Không bao giờ tìm thấy một giải pháp cho câu hỏi ban đầu. Nhưng nếu bạn muốn dòng byte của một hình ảnh trong thư viện hình ảnh, đoạn mã này sẽ làm điều đó.

Bitmap bitmap = Media.getBitmap(getContentResolver(), imageUri); 
ByteArrayOutputStream bytes = new ByteArrayOutputStream(); 
bitmap.compress(Bitmap.CompressFormat.JPEG, 40, bytes); 
ByteArrayInputStream fileInputStream = new ByteArrayInputStream(bytes.toByteArray()); 

Trả lời

40

Bạn có thể sử dụng phương pháp toString của android Uri kết hợp của String dựa constructor của Java URI.

android.net.Uri auri = new android.net.Uri(what ever); 
java.net.URI juri = new java.net.URI(auri.toString()); 

Android URI | Java URI

+3

Cảm ơn. Đã thử điều đó. Nó đưa ra một ngoại lệ (java.net.URI nên có một lược đồ hợp lệ) – lostInTransit

+8

điều này là sai và sẽ thất bại nếu URI có các ký tự cần mã hóa (như khoảng trắng). android.net.Uri.toString() giải mã các ký tự được mã hóa và java.net.URI sẽ ném một ngoại lệ nếu bạn cố gắng xây dựng nó trên một chuỗi không được mã hóa. giải pháp đúng 'huri = new java.net.URI (URLEncoder.encode (auri.toString()," UTF-8 "));' –

+0

@Jeffrey: Uri.toString() trả về các ký tự được mã hóa trên Android 4.1.2 của tôi thiết bị –

0

Vì việc xây dựng chuỗi không hoạt động nên bạn đã thử tự xây dựng bản thân?

android.net.URI auri = new android.net.URI(what ever); 
java.net.URI juri = new java.net.URI(auri.getSchema(), 
            auri.getSchemaSpecificPart(), 
            auri.getFragment()); 

Bạn cũng có thể muốn kiểm tra kỹ xem dữ liệu hợp lệ của bạn có thuộc lớp Android URI hay không. Các tài liệu như được liệt kê trong câu trả lời khác của tôi thảo luận về nó như thế nào không có nhiều kiểm tra lỗi. Nếu có infact một lỗi, các lớp học chỉ spits ra rác anyway và không ném bất kỳ trường hợp ngoại lệ. Điều này rất có thể là lý do tại sao lớp java thực hiện xác thực là ném một ngoại lệ.

+0

Cảm ơn Brian. Các uri được trả lại bởi android chính nó. nó chứa đường dẫn của một hình ảnh trong thư viện ảnh của điện thoại. vì vậy không thể làm bất cứ điều gì về hình ảnh. Tôi sẽ cố gắng và đăng các uri trong các câu hỏi – lostInTransit

+0

Tôi nghĩ rằng bạn có nghĩa là getScheme và getSchemeSpecificPart, phải không? – Piotr

38

Tìm thấy cách chính xác để mở InputStream từ nội dung URI:

InputStream fileInputStream=yourContext.getContentResolver().openInputStream(uri); 

Đó là tất cả!

+2

Cảm ơn bạn !!! thật đơn giản, tôi biết nó ở đâu đó. Câu trả lời được chấp nhận có thể hoạt động trong một số trường hợp, nhưng dường như không an toàn/chức năng trong mọi trường hợp. – plainjimbo

+0

Cảm ơn rất nhiều !!!! Hoạt động như một sự quyến rũ khi bạn cần lấy byte [] từ một hình ảnh được chọn trong thư viện tích hợp! –

+0

Lực này đóng ứng dụng của tôi và mở Binder.class mà không có nguồn kèm theo. Tôi đang gửi Contacts.CONTENT_VCF_URI – tasomaniac

1

Tôi đã bỏ phiếu cho câu trả lời của jgilrincon.Tôi không thể bình luận do danh tiếng thấp, và ở đây có thêm thông tin - bạn có thể sử dụng FileHelper.java từ dự án Apache Cordova, nó có các chức năng mà bạn cần để xử lý tệp từ chuỗi Uri, xem xét mediastore (và thư mục nội dung ứng dụng)

Riêng phương pháp này cung cấp InputStream từ Uri:

public static InputStream getInputStreamFromUriString(String uriString, Activity cordova) 
Các vấn đề liên quan