Riyas PK
Riyas PK

Reputation: 3217

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?

Upvotes: 7

Views: 6710

Answers (4)

Kirtan
Kirtan

Reputation: 81

You can use YourActivity.this instead of getApplicationContext()

getApplicationContext() is for the whole application, YourActivity.this will refers only current activity context.

PrintManager printManager = (PrintManager) YourActivity.this.getSystemService(Context.PRINT_SERVICE);

In some cases, using YourActivity.this.getSystemService(Context.PRINT_SERVICE) directly may not work as expected due to context-related issues. A reliable approach is to maintain a dedicated context variable and initialize it in the attachBaseContext() method of your Application or Activity class.

private Context primaryBaseActivity;
@Override
public void attachBaseContext(Context newBase)
{
    primaryBaseActivity = newBase;
}

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

Upvotes: 0

VIISHRUT MAVANII
VIISHRUT MAVANII

Reputation: 12640

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

Upvotes: 15

Chirag Savsani
Chirag Savsani

Reputation: 6140

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.

Upvotes: 13

Nonos
Nonos

Reputation: 2520

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.

Upvotes: 1

Related Questions