googleのブラウザChromでの設定が必要ですが、普段使っているプリンタが利用できるのでいい。
Chromeでの設定を書いてみる。
SDカードに保存されているHTMLファイルを出力してみる。
import android.app.Activity; import android.content.Intent; import android.net.Uri; import android.os.Bundle; public class Anprint2Activity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // setContentView(R.layout.main); Intent printIntent = new Intent(this, PrintDialogActivity.class); printIntent.setDataAndType(Uri.parse("file:///mnt/sdcard/index.html"), "text/plain"); printIntent.putExtra("title", "docTitle"); startActivity(printIntent); } }
PrintDialogActivity は下記アドレスの丸写しです。
https://developers.google.com/cloud-print/docs/android
マニフェストファイルにもアクティビティーを設定する
ついでに下記の許可も与えておく
<uses-permission android:name="android.permission.INTERNET"/>
import android.app.Activity; import android.content.ActivityNotFoundException; import android.content.ContentResolver; import android.content.Intent; import android.os.Bundle; import android.util.Base64; import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebViewClient; import java.io.ByteArrayOutputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; public class PrintDialogActivity extends Activity { private static final String PRINT_DIALOG_URL = "https://www.google.com/cloudprint/dialog.html"; private static final String JS_INTERFACE = "AndroidPrintDialog"; private static final String CONTENT_TRANSFER_ENCODING = "base64"; private static final String ZXING_URL = "http://zxing.appspot.com"; private static final int ZXING_SCAN_REQUEST = 65743; /** * Post message that is sent by Print Dialog web page when the printing dialog * needs to be closed. */ private static final String CLOSE_POST_MESSAGE_NAME = "cp-dialog-on-close"; /** * Web view element to show the printing dialog in. */ private WebView dialogWebView; /** * Intent that started the action. */ Intent cloudPrintIntent; @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); setContentView(R.layout.print_dialog); dialogWebView = (WebView) findViewById(R.id.webview); cloudPrintIntent = this.getIntent(); WebSettings settings = dialogWebView.getSettings(); settings.setJavaScriptEnabled(true); dialogWebView.setWebViewClient(new PrintDialogWebClient()); dialogWebView.addJavascriptInterface( new PrintDialogJavaScriptInterface(), JS_INTERFACE); dialogWebView.loadUrl(PRINT_DIALOG_URL); } @Override public void onActivityResult(int requestCode, int resultCode, Intent intent) { if (requestCode == ZXING_SCAN_REQUEST && resultCode == RESULT_OK) { dialogWebView.loadUrl(intent.getStringExtra("SCAN_RESULT")); } } final class PrintDialogJavaScriptInterface { public String getType() { return cloudPrintIntent.getType(); } public String getTitle() { return cloudPrintIntent.getExtras().getString("title"); } public String getContent() { try { ContentResolver contentResolver = getContentResolver(); InputStream is = contentResolver.openInputStream(cloudPrintIntent.getData()); ByteArrayOutputStream baos = new ByteArrayOutputStream(); byte[] buffer = new byte[4096]; int n = is.read(buffer); while (n >= 0) { baos.write(buffer, 0, n); n = is.read(buffer); } is.close(); baos.flush(); return Base64.encodeToString(baos.toByteArray(), Base64.DEFAULT); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return ""; } public String getEncoding() { return CONTENT_TRANSFER_ENCODING; } public void onPostMessage(String message) { if (message.startsWith(CLOSE_POST_MESSAGE_NAME)) { finish(); } } } private final class PrintDialogWebClient extends WebViewClient { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { if (url.startsWith(ZXING_URL)) { Intent intentScan = new Intent("com.google.zxing.client.android.SCAN"); intentScan.putExtra("SCAN_MODE", "QR_CODE_MODE"); try { startActivityForResult(intentScan, ZXING_SCAN_REQUEST); } catch (ActivityNotFoundException error) { view.loadUrl(url); } } else { view.loadUrl(url); } return false; } @Override public void onPageFinished(WebView view, String url) { if (PRINT_DIALOG_URL.equals(url)) { // Submit print document. view.loadUrl("javascript:printDialog.setPrintDocument(printDialog.createPrintDocument(" + "window." + JS_INTERFACE + ".getType(),window." + JS_INTERFACE + ".getTitle()," + "window." + JS_INTERFACE + ".getContent(),window." + JS_INTERFACE + ".getEncoding()))"); // Add post messages listener. view.loadUrl("javascript:window.addEventListener('message'," + "function(evt){window." + JS_INTERFACE + ".onPostMessage(evt.data)}, false)"); } } } }
プログラムを実行すると、
サインアップ画面が表示される。
プリンタを選択する。
Print を選択する
うまく送られているようですが、何が悪いのか、このタイミングで5010エラーが出て、
プリンタが壊れた模様。
0 件のコメント:
コメントを投稿