2012-08-24 3 views
11

HTMLキャンバスを画像(Nihilogicのcanvas2image JavaScriptライブラリを使用して)に変換する小さなtest web appをまとめて、キャンバスを生成された画像に置き換え、ユーザーはその画像を電話に保存するためにその画像に触れる(長い)ことができます。画像をAndroidブラウザのデータストリームとしてレンダリングする

私が遭遇した問題は、AndroidのデフォルトのWebブラウザ(「インターネット」)が画像を表すbase64でエンコードされたデータストリームをレンダリングせず、代わりに疑問符の記号を表示することです。これを解決する方法はありますか?はいの場合は、どうですか?

+0

ですか?これはJelly Bean(4.1.1)で動作します。私はキャンバスからイメージを生成することができ、問題なく保存できます。 – alex

+0

srcでimgを作成するのではなく、CSSスタイル 'background-image:url(data:image/png; base64datahere ....);でdivを作成しようとしていますか? – Prasanth

答えて

4

カスタムContentProviderを使用して、ストリームをTempfileとして返すためにopenFile()をオーバーライドします。

このURIをhtmlタグのsrcとして使用できます。ページがロードされるとBASE64データが既に存在する場合@goldenparrot画像のコメントに基づいて

<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

非常に良い解決策。 この種のソリューションは、プロジェクトチームに常にフルコントロール開発モデルを提供します。これにより、例外を処理して例外を処理し、例外を処理する必要がない場合にはデフォルトの方法を維持できます。 しかし、後方互換性が重視されている場合に限り、これは良いアプローチと思われます。 – Miere

+0

@Ty S.これは正確にどの言語ですか?私は言うことができません。 –

+0

Androidプラットフォーム上のJava。 – tsmith

1

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

(とも提案CSSの背景画像を有する)で見ることができます。しかし、正確に同じデータ文字列が動的に入力された場合、何らかの理由で動作しません。 base64データを使って静的に読み込まれたイメージでさえ、問題があります。何らかの方法で長いクリックに反応しないため、ダウンロードできません。私はAndroid 2.3.6を使用しています。

編集:あなたはまた、追加のダウンロードリンクに

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

を追加してみてくださいすることができますが、それは私のために動作しませんでした。 Androidはそのファイルの内容をテキストとして表示していました。通常のデスクトップWebブラウザでは「ファイルのダウンロード」ダイアログが開きましたが、そのファイルの拡張子は示唆されていないため、手動で追加する必要があります。

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

私のテストhtmlページは、あなたが実行しているAndroidのバージョンは何http://kuitsi.bitbucket.org/stackoverflow12113616.html

関連する問題