我需要支持在KitKat設備上打印,但我的目標SDK是13(更改不是選項)。如何通過反射使用KitKat 4.4打印API打印WebView?
具體而言,我需要打印一個web視圖。
這是打印網頁視圖的API: http://developer.android.com/training/printing/html-docs.html
我需要支持在KitKat設備上打印,但我的目標SDK是13(更改不是選項)。如何通過反射使用KitKat 4.4打印API打印WebView?
具體而言,我需要打印一個web視圖。
這是打印網頁視圖的API: http://developer.android.com/training/printing/html-docs.html
這是一箇舊的,但打印是有用的,所以這可能是很好的正確工作。 (沒有反射;))
更好的方式來使用設備版本。不需要嘗試捕捉,只需要在返回之前添加一些消息,或者只需隱藏按鈕/菜單/ ...,具體取決於相同的條件。
@TargetApi(Build.VERSION_CODES.KITKAT)
private void createWebPrintJob(WebView webView) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT)
return;
// Get a PrintManager instance
PrintManager printManager = (PrintManager) getSystemService(Context.PRINT_SERVICE);
// Get a print adapter instance
PrintDocumentAdapter printAdapter = webView.createPrintDocumentAdapter();
// Create a print job with name and adapter instance
String jobName = getString(R.string.app_name) + " Document";
printManager.print(jobName, printAdapter,
new PrintAttributes.Builder().build());
}
將打印作業將只與SDK 19及以上
這裏是我的解決方案:
public void print(WebView webView) {
//PrintManager
String PRINT_SERVICE = (String) Context.class.getDeclaredField("PRINT_SERVICE").get(null);
Object printManager = mActivity.getSystemService(PRINT_SERVICE);
//PrintDocumentAdapter
Class<?> printDocumentAdapterClass = Class.forName("android.print.PrintDocumentAdapter");
Method createPrintDocumentAdapterMethod = webview.getClass().getMethod("createPrintDocumentAdapter");
Object printAdapter = createPrintDocumentAdapterMethod.invoke(webview);
//PrintAttributes
Class<?> printAttributesBuilderClass = Class.forName("android.print.PrintAttributes$Builder");
Constructor<?> ctor = printAttributesBuilderClass.getConstructor();
Object printAttributes = ctor.newInstance(new Object[] {});
Method buildMethod = printAttributes.getClass().getMethod("build");
Object printAttributesBuild = buildMethod.invoke(printAttributes);
//PrintJob
String jobName = "My Document";
Method printMethod = printManager.getClass().getMethod("print", String.class, printDocumentAdapterClass, printAttributesBuild.getClass());
Object printJob = printMethod.invoke(printManager, jobName, printAdapter, printAttributesBuild);
// Save the job object for later status checking
mPrintJobs.add(printJob);
}
只要確保這就是所謂的主線程上。 另請注意:您需要使用try catch。如果您沒有運行4.4+以上的設備,則會崩潰。
使用try catch來處理android版本並不是最好的解決方案,而應該檢查Build版本。 http://developer.android.com/training/basics/supporting-devices/platforms.html – animaonline
@Randy你能幫我嗎https://stackoverflow.com/questions/49124930/pdf-printing-view-issue –
爲什麼你需要的目標SDK留在13中執行呢?這會使WebView進入兼容模式,這可能會帶來一些意想不到的結果。 –