回答

4

這是一箇舊的,但打印是有用的,所以這可能是很好的正確工作。 (沒有反射;))

更好的方式來使用設備版本。不需要嘗試捕捉,只需要在返回之前添加一些消息,或者只需隱藏按鈕/菜單/ ...,具體取決於相同的條件。

@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及以上

+0

'目標SDK是13'是我用反射的原因。顯然,我不想使用反射,但我沒有改變目標的選項。 – Randy

+1

該代碼在每個sdk上工作,它將檢查sdk,如果它是之前的Kitkat,則停止打印方法。這意味着這個支持sdk 13,它將按照要求爲Kitkat提供打印功能。 (@targetApi他可以用一些不支持的函數來構建apk) – AxelH

1

這裏是我的解決方案:

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+以上的設備,則會崩潰。

+5

使用try catch來處理android版本並不是最好的解決方案,而應該檢查Build版本。 http://developer.android.com/training/basics/supporting-devices/platforms.html – animaonline

+0

@Randy你能幫我嗎https://stackoverflow.com/questions/49124930/pdf-printing-view-issue –