2012-08-24 8 views
11

Tôi đặt cùng một hình nhỏ test web app chuyển đổi canvas HTML thành hình ảnh (bằng cách sử dụng thư viện JavaScript canvas2image của Nihilogic), sau đó thay thế canvas bằng hình ảnh được tạo và hiển thị thông báo người dùng chạm vào (dài) hình ảnh đó để lưu nó vào điện thoại của họ.Hiển thị hình ảnh dưới dạng luồng dữ liệu trong trình duyệt Android

Vấn đề tôi gặp phải là trình duyệt web mặc định của Android ("Internet") không hiển thị luồng dữ liệu được mã hóa base64 đại diện cho hình ảnh, nhưng hiển thị dấu hỏi chấm thay thế. Có cách nào để giải quyết vấn đề này không? Nếu có, thì làm thế nào?

+0

gì phiên bản Android bạn đang chạy? Nó hoạt động trong Jelly Bean (4.1.1). Tôi có thể tạo hình ảnh từ canvas và có thể lưu hình ảnh mà không gặp sự cố. – alex

+0

bạn có thể thử và xem nếu tạo ra một div với phong cách css 'background-image: url (dữ liệu: image/png; base64datahere ....);' hoạt động thay vì tạo một img với src? – Prasanth

Trả lời

4

Sử dụng trình ContentProvider tùy chỉnh và ghi đè openFile() để trả về luồng dưới dạng Tempfile.

Bạn có thể sử dụng URI làm src trong thẻ html A.

<a src="Example://file"></a> 
public class ExampleProvider extends ContentProvider { 

    @Override 
    public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException {   
     //Get your bitmap 
     Bitmap bmp = BitmapFactory.decodeResource(getContext().getResources(), R.drawable.file_example); 
     File tempFile = null; 
     try { 
      //Create the tempfile form a stream 
      tempFile = File.createTempFile("tempfile", ".thumb", getContext().getCacheDir()); 
      BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(tempFile)); 
      bmp.compress(Bitmap.CompressFormat.JPEG, 100, out); 
      out.close(); 
      if(mode.equals("r")) { 
       return ParcelFileDescriptor.open(tempFile, ParcelFileDescriptor.MODE_READ_ONLY); 
      } 
     } 
     catch(IOException e) { 
      LOGGER.error("Couldn't generate temp file for thumb view, guid:" + guid, e); 
     } 
     finally { 
      if(tempFile != null { 
       //The unix filesystem automatically deletes the file once all handles are gone 
       tempFile.delete(); 
      } 
     } 
    } 
} 
+0

Giải pháp rất đẹp. Loại giải pháp này luôn cung cấp mô hình phát triển kiểm soát đầy đủ cho nhóm dự án, cho phép bạn xử lý ngoại lệ để khắc phục và giữ nguyên cách mặc định khi không cần xử lý ngoại lệ. Nhưng tôi nghĩ rằng đây có vẻ là một cách tiếp cận tốt nếu, và chỉ nếu, khả năng tương thích ngược là trọng tâm của bạn. – Miere

+0

@Ty S. Ngôn ngữ này chính xác là gì? Tôi không thể nói. –

+0

Java trên nền tảng Android. – tsmith

1

Dựa trên nhận xét của hình ảnh @goldenparrot có thể được nhìn thấy với

<img src="data:image/png;base64,BASE64_STRING_HERE" /> 

(và cũng với css gợi ý background-image) khi dữ liệu base64 đã có mặt khi trang được tải . Tuy nhiên, nó không hoạt động vì một số lý do khi chính xác cùng chuỗi dữ liệu được nhập động. Ngay cả hình ảnh được tải tĩnh với dữ liệu base64 có vấn đề: nó không phản ứng với cú nhấp chuột dài theo bất kỳ cách nào, vì vậy nó không thể được tải xuống. Tôi đang sử dụng Android 2.3.6.

Chỉnh sửa: Bạn cũng có thể thử thêm thêm link download

<a href="data:application/octet-stream;base64,BASE64_STRING_HERE">download file</a> 

nhưng nó đã không làm việc cho tôi. Android đã chỉ hiển thị nội dung của tệp đó dưới dạng văn bản. Trình duyệt web thông thường trên máy tính để bàn đã mở hộp thoại "tải xuống tệp" nhưng không đề xuất bất kỳ phần mở rộng nào cho tệp đó, vì vậy, người dùng phải thêm nó theo cách thủ công.

Xem thêm Browser/HTML Force download of image from src="data:image/jpeg;base64..."

trang html thử nghiệm của tôi là http://kuitsi.bitbucket.org/stackoverflow12113616.html