Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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?

like image 428
Riyas PK Avatar asked Jun 02 '16 06:06

Riyas PK


2 Answers

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.

like image 60
Chirag Savsani Avatar answered Sep 30 '22 13:09

Chirag Savsani


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);
like image 29
VIISHRUT MAVANII Avatar answered Sep 30 '22 13:09

VIISHRUT MAVANII