Мне нужно поддерживать печать на устройствах KitKat, но мой целевой SDK — 13 (изменение невозможно).
В частности, мне нужно распечатать веб-просмотр.
Это API для печати веб-просмотра: http://developer.android.com/training/printing/html-docs.html
Мне нужно поддерживать печать на устройствах KitKat, но мой целевой SDK — 13 (изменение невозможно).
В частности, мне нужно распечатать веб-просмотр.
Это API для печати веб-просмотра: http://developer.android.com/training/printing/html-docs.html
Это старый, но печать полезна, так что это может быть полезно для правильной работы. (без отражения ;))
Улучшенный способ работы с устройствами версии. Не нужно пытаться поймать, просто нужно добавить несколько сообщений перед возвратом или просто скрыть кнопку/меню/... в зависимости от того же условия.
@TargetApi(Build.VERSION_CODES.KITKAT)
private void createWebPrintJob(WebView webView) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT)
return;
// Get a PrintManager instance
PrintManager printManager = (PrintManager) 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());
}
PrintJob будет выполняться только с SDK 19 и выше.
target SDK is 13
это причина, по которой я использовал отражение. Очевидно, я не хотел использовать отражение, но у меня не было возможности изменить цель.
- person Randy; 26.02.2015
Вот мое решение:
public void print(WebView webView) {
//PrintManager
String PRINT_SERVICE = (String) Context.class.getDeclaredField("PRINT_SERVICE").get(null);
Object printManager = mActivity.getSystemService(PRINT_SERVICE);
//PrintDocumentAdapter
Class<?> printDocumentAdapterClass = Class.forName("android.print.PrintDocumentAdapter");
Method createPrintDocumentAdapterMethod = webview.getClass().getMethod("createPrintDocumentAdapter");
Object printAdapter = createPrintDocumentAdapterMethod.invoke(webview);
//PrintAttributes
Class<?> printAttributesBuilderClass = Class.forName("android.print.PrintAttributes$Builder");
Constructor<?> ctor = printAttributesBuilderClass.getConstructor();
Object printAttributes = ctor.newInstance(new Object[] {});
Method buildMethod = printAttributes.getClass().getMethod("build");
Object printAttributesBuild = buildMethod.invoke(printAttributes);
//PrintJob
String jobName = "My Document";
Method printMethod = printManager.getClass().getMethod("print", String.class, printDocumentAdapterClass, printAttributesBuild.getClass());
Object printJob = printMethod.invoke(printManager, jobName, printAdapter, printAttributesBuild);
// Save the job object for later status checking
mPrintJobs.add(printJob);
}
Просто убедитесь, что это вызывается в основном потоке. Также обратите внимание: вам нужно использовать try catch. Устройства, на которых не установлена версия 4.4+, будут аварийно завершать работу, если вы этого не сделаете.