【问题标题】:Document Missing - Google Cloud Print缺少文档 - Google 云打印
【发布时间】:2016-04-15 02:58:54
【问题描述】:

我正在尝试在我的 android studio 项目中使用 google cloud print 来打印 pdf 文件。我将文件存储在项目的资产文件夹中,当我去打印它时说“文档丢失”。这是我的java代码:

public class MainActivity extends Activity {

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

}

public void onPrintClick(View v) {


    String path = Environment.getExternalStorageDirectory().getAbsolutePath()
            + "/monsoon.pdf";
    File file = new File(path);

    if (file.exists()) {
        Uri uri = Uri.fromFile(file);
        Intent printIntent = new Intent(this, PrintDialogActivity.class);
        printIntent.setDataAndType(uri, "application/pdf");
        printIntent.putExtra("title", "Gaurang");
        startActivity(printIntent);
    } else {
        Toast.makeText(getApplicationContext(), "No file",
                Toast.LENGTH_SHORT).show();
    }
}
}

这是用于 Google 云打印的 Android 代码,对 PrintDialogJavaScriptInterface 类进行了一些修改...即。应用注解@JavascriptInterface

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.activity_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 {

    @JavascriptInterface
    public String getType() {
        return cloudPrintIntent.getType();
    }

    @JavascriptInterface
    public String getTitle() {
        return cloudPrintIntent.getExtras().getString("title");
    }

    @JavascriptInterface
    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 "";
    }

    @JavascriptInterface
    public String getEncoding() {
        return CONTENT_TRANSFER_ENCODING;
    }

    @JavascriptInterface
    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)");
        }
    }
}
}

【问题讨论】:

    标签: android eclipse android-studio google-cloud-print


    【解决方案1】:

    我看到两件事可能是错误的。

    • getContent 方法中你有return "";
    • 当您以onPrintClick 方法发送 PDF 时,您并未将 PDF 转换为 base64。

    我希望我发现了一些有趣的东西:)

    【讨论】:

      猜你喜欢
      • 2013-02-09
      • 2013-04-24
      • 2012-04-07
      • 2015-08-14
      • 2012-04-12
      • 1970-01-01
      • 2012-01-26
      • 2013-08-29
      • 1970-01-01
      相关资源
      最近更新 更多