简体   繁体   中英

Document Missing - Google Cloud Print

I am trying to use google cloud print with my project on android studio to print out a pdf file. I am storing the file in the assets folder of the project and when I go to print it say "Document Missing". this is my java code:

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();
    }
}
}

and Here is Android Code for Google Cloud Print with some modification on class PrintDialogJavaScriptInterface...ie. applying annotations @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)");
        }
    }
}
}

I see two things that might be wrong.

  • In the getContent method you have return "";
  • when you send the PDF in the onPrintClick method, you are not converting the PDF to base64.

I hope I spotted something interesting :)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM