2015-10-15 52 views
0

我正嘗試使用google雲打印與我的android studio上的項目打印出一個pdf文件。我將文件存儲在項目的資產文件夾中,當我打印時會說「文件丟失」。這是我的Java代碼:文檔丟失 - Google雲打印

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

,這裏是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)"); 
     } 
    } 
} 
} 

回答

0

我看到兩件事情可能是錯誤的。

  • getContent方法你有return "";
  • 當你在onPrintClick方法發送PDF,你是不是在PDF轉換爲base64。

我希望我發現一些有趣的東西:)