简体   繁体   中英

getting an error “java.lang.IllegalStateException: Can print only from an activity”?

I am getting an error " java.lang.IllegalStateException : Can print only from an activity" while using an android 4.4 printing API.

is it work on all android above 4.4?

my code

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

please help me.

is there any example of android wifi printing?

I know this is late answer.

You have to use YourCurrentActivity.this instead of getApplicationContext()

Because getApplicationContext() refers to an whole application context while YourCurrentActivity.this refers only current activity context .

My application is using PDF printing using PrintManager . I got this issue after I implemented Multi-language support.

Android create a new context via createConfigurationContext() . This invalidates the reference being used by the PrintManager instance, causing the above IllegalStateException .

Solution

My solution is to store a reference of the original context passed by attachBaseContext() a member of my activity. Then retrieve PrintManager instance by calling getSystemService() on the original context reference instead of the inactive context reference.

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

If you're printing HTML content, this Android training is faster and easier.

Now for the exception, I think you are getting this exception because of this line:

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

The context you're using is an application context although you're in an activity and can/should just use the activity as a context. I'm not sure why you would need a separate cotext at all in this code.

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