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 love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With