2012-08-24 15 views
11

ułożyła małą test web app który konwertuje płótnie HTML do obrazu (przy użyciu Nihilogic za canvas2image JavaScript Library), a następnie zastępuje płótna generowanego obrazu i wyświetla komunikat powiadamiając użytkownik dotknął (długo) ten obraz, aby zapisać go na swoim telefonie.renderowanie obrazu jako strumień danych w Android przeglądarce

Problem, który napotkam, polega na tym, że domyślna przeglądarka internetowa Androida ("Internet") nie renderuje zakodowanego strumienia danych, który reprezentuje obraz, ale wyświetla znak zapytania. Czy istnieje sposób, aby rozwiązać ten problem? Jeśli tak, to w jaki sposób?

+0

Jaka wersja Androida są uruchomione? Działa w Jelly Bean (4.1.1). Mogę wygenerować obraz z płótna i mogę go zapisać bez problemów. – alex

+0

możesz spróbować zobaczyć, czy tworzenie elementu div w stylu css 'background-image: url (data: image/png; base64datahere ....);' działa zamiast tworzyć img z src? – Prasanth

Odpowiedz

4

Użyj niestandardowego obiektu ContentProvider i zastąp plik openFile(), aby zwrócić strumień jako plik temp.

Możesz użyć URI jako src w znaczniku HTML.

<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

Bardzo ładne rozwiązanie. Tego rodzaju rozwiązanie zawsze zapewnia zespołowi projektu pełny model rozwoju kontroli, umożliwiając potraktowanie wyjątku w celu naprawienia go i zachowania domyślnego sposobu, gdy wyjątek nie jest potrzebny do leczenia. Ale myślę, że to wydaje się być dobrym podejściem, jeśli i tylko wtedy, gdy w centrum uwagi jest również kompatybilność wsteczna. – Miere

+0

@Ty S. W jakim języku to jest dokładnie? Nie mogę powiedzieć. –

+0

Java na platformie Android. – tsmith

1

podstawie komentarzem @goldenparrot obrazie widać z

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

(a także z sugerowanym CSS background-image) gdy dane base64 jest już obecny, gdy strona jest ładowana . Jednak nie działa to z jakiegoś powodu, gdy dokładnie ten sam ciąg danych jest wprowadzany dynamicznie. Nawet statycznie załadowany obraz z danymi base64 ma problemy: nie reaguje na długie kliknięcia w żaden sposób, więc nie można go pobrać. Używam Androida 2.3.6.

Edit: Można również spróbować dodanie dodatkowych odnośnik Pobierz

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

ale to nie działa dla mnie. Android pokazał właśnie zawartość tego pliku jako tekst. Normalna przeglądarka internetowa na komputerze otworzyła okno dialogowe "pobierz plik", ale nie sugerowała rozszerzenia tego pliku, więc użytkownik musi dodać je ręcznie.

Zobacz także Browser/HTML Force download of image from src="data:image/jpeg;base64..."

Moja próba strona html jest http://kuitsi.bitbucket.org/stackoverflow12113616.html

Powiązane problemy