38 private PrintJob printJob;
39 private final Handler handler =
new Handler(Looper.getMainLooper());
40 private final Runnable pollJob =
new Runnable() {
41 @Override
public void run()
43 if (printJob ==
null || printJob.isCompleted() || printJob.isFailed() ||
44 printJob.isCancelled())
49 handler.postDelayed(
this, 500);
53 @Override
protected void onCreate(Bundle savedInstanceState)
55 super.onCreate(savedInstanceState);
57 Uri uri = getIntent().getData();
64 PrintManager pm = (PrintManager)getSystemService(Context.PRINT_SERVICE);
65 printJob = pm.print(uri.getLastPathSegment(),
new PdfAdapter(
this, uri),
null);
66 handler.postDelayed(pollJob, 500);
69 @Override
protected void onDestroy()
71 handler.removeCallbacks(pollJob);
75 private static class PdfAdapter
extends PrintDocumentAdapter
77 private final Context ctx;
78 private final Uri uri;
80 PdfAdapter(Context ctx, Uri uri)
87 public void onLayout(PrintAttributes oldAttr, PrintAttributes newAttr,
88 android.os.CancellationSignal signal, LayoutResultCallback cb,
91 if (signal.isCanceled())
93 cb.onLayoutCancelled();
96 PrintDocumentInfo info =
new PrintDocumentInfo.Builder(uri.getLastPathSegment())
97 .setContentType(PrintDocumentInfo.CONTENT_TYPE_DOCUMENT)
98 .setPageCount(PrintDocumentInfo.PAGE_COUNT_UNKNOWN)
100 cb.onLayoutFinished(info, !newAttr.equals(oldAttr));
104 public void onWrite(PageRange[] pages, ParcelFileDescriptor dest,
105 android.os.CancellationSignal signal, WriteResultCallback cb)
107 try (InputStream in = ctx.getContentResolver().openInputStream(uri);
108 FileOutputStream out =
new FileOutputStream(dest.getFileDescriptor()))
112 cb.onWriteFailed(
"Cannot open PDF");
115 byte[] buf =
new byte[8192];
117 while ((n = in.read(buf)) != -1)
119 if (signal.isCanceled())
121 cb.onWriteCancelled();
124 out.write(buf, 0, n);
126 cb.onWriteFinished(
new PageRange[] { PageRange.ALL_PAGES });
128 catch (IOException e)
130 cb.onWriteFailed(e.getMessage());