【问题标题】:Document Missing for android google cloud printandroid 谷歌云打印的文档丢失
【发布时间】:2013-10-29 08:14:51
【问题描述】:

我在 android 中有一个简单的应用程序。其中有两个活动。一个是 Document.Activity,布局 xml 是 butt.xml。另一个是带有 print_dialog.xml 的 PrintDialogActivity。我共享我的打印机,一切正常。但是当我选择我的共享打印机并单击谷歌云打印中的打印按钮时,会出现一个带有“缺少文档”的黑色标题栏。现在我能做什么?请帮帮我..

这是我的文档活动:

public class Document extends Activity{

Button btnprt;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.butt);

    btnprt = (Button) findViewById(R.id.button1);
    btnprt.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
                Intent printIntent = new Intent(Document.this, PrintDialogActivity.class);
                //File file = new File("/sdcard/StudentLatePass.txt");
                //printIntent.setDataAndType(Uri.fromFile(file), "text/*");
                Uri docUri = Uri.parse("http://www.google.com");
                //String ur = docUri.toString();
                printIntent.setDataAndType(docUri, "application/pdf");
                printIntent.putExtra("title", "StudentLatePass");
                startActivity(printIntent);
        }
    });
}

}

这是我的 butt.xml:

<?xml version="1.0" encoding="utf-8"?>
 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="match_parent"
 android:layout_height="match_parent" >

 <Button
    android:id="@+id/button1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="114dp"
    android:text="Print" />

  </RelativeLayout>

这是我的 PrintDialogActivity:

 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_dialog.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"> 
 <WebView android:id="@+id/webview"
       android:layout_width="fill_parent" 
       android:layout_height="fill_parent"/> 

【问题讨论】:

  • 有没有人能帮帮我????????????
  • 请帮帮我......
  • 我正在解决同样的问题。如果我弄明白了,我会告诉你的。
  • 我无法直接从存储在资产中的内容或从变成 Uri 的 Web URL 打印。
  • 查看日志,由于某种原因,云打印服务没有解析 Uri。我通过将文件从资产复制到缓存目录,然后从那里使用基于文件的 Uri 来修复我的问题。

标签: android printing google-cloud-print


【解决方案1】:

如果要打印网站内容,请将图像形式的位图流复制到pdf中。您可以使用开源库在 android 中创建 pdf。有许多库可用于创建 pdf。现在你可以打印这个 pdf -

Uri docUri = Uri.parse(yourPDFFilePath); //给你pdf文件的路径 printIntent.setDataAndType(docUri, "application/pdf");

Google 云打印服务提供商推荐使用 pdf 格式打印文档,这很好 - “我们目前为 PDF 文档提供最好的支持,因此我们鼓励您使用这种格式而不是其他格式”。

我尝试了这种方式并成功打印了网页内容。希望能帮助到你 !!!

【讨论】:

  • 嗨,你尝试过同样的方式还是其他方式?我很好奇我遵循的方法使用了 addJavascriptInterface() 并且我正在寻找其他方法来避免使用这种方法。 (其实我想为这个打印功能做原生android方法调用,但是避免使用addJavascriptInterface()。)
  • 实际上是我第一次截取该 webview 的屏幕截图并将其保存到外部存储中,然后我将其添加到 pdf 文档(itext 库)中,最后使用谷歌云打印打印该文档。但我有一个问题,截图不能给出完整的 webview,所以我使用了 webview.capturePicture()。你来自哪里?
  • 只是 webView.capturePicture() 不适用于某些图像网址。因为它显示没有内容的深黑色背景。尝试使用 droidText 库从位图创建 pdf 文档。它工作得很好。我来自印度。
  • 非常感谢。实际上,如果您不使用画布,那么它会显示没有内容的深黑色背景。你知道exif数据吗?我怎样才能从图像中得到它?我来自孟加拉国。
  • 抱歉不知道exif数据!
猜你喜欢
  • 2013-04-24
  • 2013-08-29
  • 1970-01-01
  • 2021-06-17
  • 2012-09-23
  • 2016-04-15
  • 2014-07-21
  • 2015-04-23
  • 1970-01-01
相关资源
最近更新 更多