Skip to content

Commit 6ba3165

Browse files
committed
Add print capability.
1 parent 01db425 commit 6ba3165

File tree

4 files changed

+127
-0
lines changed

4 files changed

+127
-0
lines changed

Android/app/src/main/java/org/artoolkitx/utilities/cameracalibration/CameraCalibrationActivity.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,13 @@
11
package org.artoolkitx.utilities.cameracalibration;
22

3+
import android.content.Context;
34
import android.content.Intent;
45
import android.os.Bundle;
56
import android.net.Uri;
7+
import android.print.PrintAttributes;
8+
import android.print.PrintDocumentAdapter;
9+
import android.print.PrintManager;
10+
import android.util.Log;
611
import android.view.Menu;
712
import android.view.MenuInflater;
813
import android.view.MenuItem;
@@ -13,6 +18,8 @@
1318
import org.libsdl.app.SDLActivity;
1419

1520
public class CameraCalibrationActivity extends SDLActivity {
21+
22+
static final String TAG = "CameraCalibrationActivity";
1623
@Override
1724
protected void onCreate(Bundle savedInstanceState) {
1825
super.onCreate(savedInstanceState);
@@ -38,6 +45,22 @@ public boolean onOptionsItemSelected(@NonNull MenuItem item) {
3845
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://github.com/artoolkitx/artoolkitx-calibration/wiki")));
3946
return true;
4047
case R.id.menu_print:
48+
PrintManager printManager = (PrintManager) this.getSystemService(Context.PRINT_SERVICE);
49+
try
50+
{
51+
PrintDocumentAdapter printAdapter = null;
52+
if (getSharedPreferences("cameracalibrationsettings", MODE_PRIVATE).getString("print_paper_size", "a4") == "usletter") {
53+
printAdapter = new PdfDocumentAdapter(this, R.raw.printusletter, "Calibration chessboard (US Letter)", 1);
54+
} else {
55+
// Assume A4.
56+
printAdapter = new PdfDocumentAdapter(this, R.raw.printa4, "Calibration chessboard (A4)", 1);
57+
}
58+
printManager.print("Printing calibration pattern", printAdapter, new PrintAttributes.Builder().build());
59+
}
60+
catch (Exception e)
61+
{
62+
Log.e(TAG, "onOptionsItemSelected: " + e);
63+
}
4164
return true;
4265
case R.id.menu_settings:
4366
startActivity(new Intent(this, CameraCalibrationSettingsActivity.class));
Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
package org.artoolkitx.utilities.cameracalibration;
2+
3+
import android.content.Context;
4+
import android.os.Bundle;
5+
import android.os.CancellationSignal;
6+
import android.os.ParcelFileDescriptor;
7+
import android.print.PageRange;
8+
import android.print.PrintAttributes;
9+
import android.print.PrintDocumentAdapter;
10+
import android.print.PrintDocumentInfo;
11+
import android.util.Log;
12+
13+
import java.io.File;
14+
import java.io.FileInputStream;
15+
import java.io.FileOutputStream;
16+
import java.io.IOException;
17+
import java.io.InputStream;
18+
import java.io.OutputStream;
19+
import java.nio.file.Paths;
20+
21+
public class PdfDocumentAdapter extends PrintDocumentAdapter {
22+
23+
static final String LOGTAG = "PdfDocumentAdapter";
24+
Context context = null;
25+
String pathName = null;
26+
String name = null;
27+
int resID = 0;
28+
int pageCount = 0;
29+
30+
public PdfDocumentAdapter(Context ctxt, String pathName, String name, int pageCount) {
31+
context = ctxt;
32+
this.pathName = pathName;
33+
this.name = name;
34+
this.resID = 0;
35+
this.pageCount = pageCount;
36+
}
37+
38+
// Use e.g. new PdfDocumentAdapter(getApplicationContext, R.raw.myfile.pdf, 0);
39+
public PdfDocumentAdapter(Context ctxt, int resID, String name, int pageCount) {
40+
context = ctxt;
41+
this.pathName = null;
42+
this.name = name;
43+
this.resID = resID;
44+
this.pageCount = pageCount;
45+
}
46+
47+
@Override
48+
public void onLayout(PrintAttributes printAttributes, PrintAttributes printAttributes1, CancellationSignal cancellationSignal, LayoutResultCallback layoutResultCallback, Bundle bundle) {
49+
if (cancellationSignal.isCanceled()) {
50+
layoutResultCallback.onLayoutCancelled();
51+
} else {
52+
PrintDocumentInfo.Builder builder = new PrintDocumentInfo.Builder(name);
53+
builder.setContentType(PrintDocumentInfo.CONTENT_TYPE_DOCUMENT)
54+
.setPageCount(pageCount > 0 ? pageCount : PrintDocumentInfo.PAGE_COUNT_UNKNOWN)
55+
.build();
56+
layoutResultCallback.onLayoutFinished(builder.build(),
57+
!printAttributes1.equals(printAttributes));
58+
}
59+
}
60+
61+
@Override
62+
public void onWrite(PageRange[] pageRanges, ParcelFileDescriptor parcelFileDescriptor, CancellationSignal cancellationSignal, WriteResultCallback writeResultCallback) {
63+
InputStream in = null;
64+
OutputStream out = null;
65+
try {
66+
if (resID != 0) {
67+
in = context.getResources().openRawResource(resID);
68+
} else if (pathName != null) {
69+
File file = new File(pathName);
70+
in = new FileInputStream(file);
71+
} else {
72+
writeResultCallback.onWriteFailed("Nothing to print");
73+
return;
74+
}
75+
out = new FileOutputStream(parcelFileDescriptor.getFileDescriptor());
76+
77+
byte[] buf = new byte[16384];
78+
int size;
79+
80+
while ((size = in.read(buf)) >= 0 && !cancellationSignal.isCanceled()) {
81+
out.write(buf, 0, size);
82+
}
83+
84+
if (cancellationSignal.isCanceled()) {
85+
writeResultCallback.onWriteCancelled();
86+
} else {
87+
writeResultCallback.onWriteFinished(new PageRange[] { PageRange.ALL_PAGES });
88+
}
89+
}
90+
catch (Exception e) {
91+
writeResultCallback.onWriteFailed(e.getMessage());
92+
Log.e(LOGTAG, "onWrite: " + e);
93+
}
94+
finally {
95+
try {
96+
in.close();
97+
out.close();
98+
}
99+
catch (IOException e) {
100+
Log.e(LOGTAG, "close: " + e);
101+
}
102+
}
103+
}
104+
}
52.7 KB
Binary file not shown.
52.9 KB
Binary file not shown.

0 commit comments

Comments
 (0)