5

使用 android 4.4 打印 API时出现错误“ java.lang.IllegalStateException:只能从活动打印”。

它适用于4.4以上的所有android吗?

我的代码

public class MainActivity extends Activity {

    Context cotext;
    WebView mWebView;

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

        cotext = getApplicationContext();
    }

    public void printData(View view){
        doWebViewPrint();
    }

    private void doWebViewPrint() {
        // Create a WebView object specifically for printing
        WebView webView = new WebView(cotext);
        webView.setWebViewClient(new WebViewClient() {

            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                return false;
            }

            @Override
            public void onPageFinished(WebView view, String url) {
                Log.i("TAG", "page finished loading " + url);
                createWebPrintJob(view);
                mWebView = null;
            }
        });

        // Generate an HTML document on the fly:
        String htmlDocument = "<html><body><h1>Test Content</h1><p>Testing, " +
                "testing, testing...</p></body></html>";
        webView.loadDataWithBaseURL(null, htmlDocument, "text/HTML", "UTF-8", null);

        // Keep a reference to WebView object until you pass the PrintDocumentAdapter
        // to the PrintManager
        mWebView = webView;
    }

    private void createWebPrintJob(WebView webView) {

        // Get a PrintManager instance
        PrintManager printManager = (PrintManager) cotext
                .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());

        // Save the job object for later status checking
        //mPrintJobs.add(printJob);
    }
}

请帮我。

有没有android wifi打印的例子?

4

3 回答 3

12

我知道这是迟到的答案。

你必须使用YourCurrentActivity.this而不是getApplicationContext()

因为 getApplicationContext() 引用整个应用程序context,而YourCurrentActivity.this仅引用当前活动context

于 2016-11-04T04:55:12.197 回答
10

我的应用程序正在使用 PDF 打印PrintManager。我在实现多语言支持后遇到了这个问题。

Android 创建一个新的contextvia createConfigurationContext()。这会使PrintManager实例使用的引用无效,从而导致上述IllegalStateException.

解决方案

attachBaseContext() 我的解决方案是存储我的活动成员传递的原始上下文的引用。然后通过调用原始引用而不是非活动引用来检索PrintManager实例。getSystemService()contextcontext

private Context originalContext;

@Override
protected void attachBaseContext(Context newBase) {
    this.originalContext = newBase;

    super.attachBaseContext(LocaleHelper.onAttach(newBase,appLocale));
}

//  Starting printing (PDF generation):

PrintManager printManager = (PrintManager) originalContext.getSystemService(Context.PRINT_SERVICE);
于 2019-11-16T06:53:51.853 回答
1

如果您要打印 HTML 内容,此 Android培训会更快、更轻松。

现在对于异常,我认为您因为这条线而得到了这个异常:

PrintManager printManager = (PrintManager) cotext
            .getSystemService(Context.PRINT_SERVICE);

您正在使用的上下文是一个应用程序上下文,尽管您在一个活动中并且可以/应该只将该活动用作上下文。我不确定为什么cotext在这段代码中你需要一个单独的。

于 2016-06-14T18:41:50.487 回答