Skip to content

Commit 8875aaf

Browse files
author
literacyapp
authored
Merge pull request #15 from jogrimst/master
Screen capturing
2 parents a1abfb3 + 6ac1058 commit 8875aaf

File tree

6 files changed

+109
-7
lines changed

6 files changed

+109
-7
lines changed

app/build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ android {
1414
applicationId "org.literacyapp.analytics"
1515
minSdkVersion 21
1616
targetSdkVersion 23
17-
versionCode 1000000
18-
versionName "1.0.0"
17+
versionCode 1000001
18+
versionName "1.0.1-SNAPSHOT"
1919
}
2020

2121
buildTypes {

app/src/main/AndroidManifest.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
33
package="org.literacyapp.analytics">
44

5+
<uses-permission android:name="android.permission.CAMERA" />
56
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
67
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
78

app/src/main/java/org/literacyapp/analytics/service/ScreenshotJobService.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import android.util.Log;
88
import android.view.Display;
99

10+
import org.literacyapp.analytics.util.CameraHelper;
1011
import org.literacyapp.analytics.util.DisplayHelper;
1112

1213
import java.io.File;
@@ -25,13 +26,21 @@ public boolean onStartJob(JobParameters jobParameters) {
2526
for (Display display : displayManager.getDisplays()) {
2627
if (display.getState() != Display.STATE_OFF) {
2728
Log.i(getClass().getName(), "display.getState(): " + display.getState());
29+
30+
// Capture screenshot
2831
File screenshotFile = DisplayHelper.captureScreenshot();
2932
Log.i(getClass().getName(), "screenshotFile.exists(): " + screenshotFile.exists());
3033
if (screenshotFile.exists()) {
3134
// Reduce image size
32-
File resizedScreenshotFile = DisplayHelper.resizeBitmap(screenshotFile, 320, false);
35+
File resizedScreenshotFile = DisplayHelper.resizeBitmap(screenshotFile, 640, false);
3336
Log.i(getClass().getName(), "resizedScreenshotFile.exists(): " + resizedScreenshotFile.exists());
3437
}
38+
39+
// Take picture with front camera
40+
String picturePath = screenshotFile.getAbsolutePath().replace("_screenshot", "_picture");
41+
Log.i(getClass().getName(), "picturePath: " + picturePath);
42+
File pictureFile = new CameraHelper().takePicture(getApplicationContext(), picturePath);
43+
Log.i(getClass().getName(), "pictureFile.exists(): " + pictureFile.exists());
3544
}
3645
}
3746

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
package org.literacyapp.analytics.util;
2+
3+
import android.content.Context;
4+
import android.hardware.Camera;
5+
import android.util.Log;
6+
import android.view.SurfaceView;
7+
8+
import java.io.File;
9+
import java.io.FileNotFoundException;
10+
import java.io.FileOutputStream;
11+
import java.io.IOException;
12+
13+
/**
14+
* See https://developer.android.com/training/camera/cameradirect.html
15+
*/
16+
public class CameraHelper {
17+
18+
private File pictureFile;
19+
20+
public File takePicture(Context context, String picturePath) {
21+
Log.i(getClass().getName(), "takePicture");
22+
23+
pictureFile = new File(picturePath);
24+
Log.i(DisplayHelper.class.getName(), "pictureFile: " + pictureFile);
25+
26+
// String deviceModel = DeviceInfoHelper.getDeviceModel(context);
27+
// Log.i(getClass().getName(), "deviceModel: " + deviceModel);
28+
29+
try {
30+
// http://stackoverflow.com/questions/32770723/capturing-image-from-camera-in-a-background-service
31+
int cameraId = 1; // Front camera
32+
Camera mCamera = Camera.open(cameraId); // Throws Exception if the camera is already in use by another application
33+
Log.i(getClass().getName(), "mCamera: " + mCamera);
34+
SurfaceView surfaceView = new SurfaceView(context);
35+
Log.i(getClass().getName(), "surfaceView: " + surfaceView);
36+
Camera.Parameters parameters = mCamera.getParameters();
37+
Log.i(getClass().getName(), "parameters: " + parameters);
38+
mCamera.setParameters(parameters);
39+
mCamera.startPreview();
40+
mCamera.takePicture(null, null, mPictureCallback);
41+
} catch (Exception e) {
42+
Log.e(getClass().getName(), "Failed to open camera", e);
43+
}
44+
45+
return pictureFile;
46+
}
47+
48+
private Camera.PictureCallback mPictureCallback = new Camera.PictureCallback() {
49+
50+
@Override
51+
public void onPictureTaken(byte[] bytes, Camera camera) {
52+
Log.i(getClass().getName(), "onPictureTaken");
53+
54+
Log.i(getClass().getName(), "bytes.length: " + bytes.length);
55+
56+
// TODO: reduce image size
57+
58+
try {
59+
FileOutputStream fileOutputStream = new FileOutputStream(pictureFile);
60+
fileOutputStream.write(bytes);
61+
fileOutputStream.close();
62+
} catch (FileNotFoundException e) {
63+
Log.i(getClass().getName(), null, e);
64+
} catch (IOException e) {
65+
Log.i(getClass().getName(), null, e);
66+
} finally {
67+
camera.stopPreview();
68+
camera.release();
69+
}
70+
}
71+
};
72+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package org.literacyapp.analytics.util;
2+
3+
import android.content.Context;
4+
import android.os.Build;
5+
import android.util.Log;
6+
7+
import java.io.UnsupportedEncodingException;
8+
import java.net.URLEncoder;
9+
10+
public class DeviceInfoHelper {
11+
12+
public static String getDeviceModel(Context context) {
13+
String deviceModel = "";
14+
try {
15+
deviceModel = URLEncoder.encode(Build.MODEL, "UTF-8");
16+
} catch (UnsupportedEncodingException e) {
17+
Log.e(DeviceInfoHelper.class.getName(), "Build.MODEL: " + Build.MODEL, e);
18+
}
19+
return deviceModel;
20+
}
21+
}

app/src/main/java/org/literacyapp/analytics/util/DisplayHelper.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,14 @@ public class DisplayHelper {
2020
public static File captureScreenshot() {
2121
Log.i(DisplayHelper.class.getName(), "captureScreenshot");
2222

23-
String screenshotsPath = Environment.getExternalStorageDirectory() + File.separator + ".literacyapp-analytics" + File.separator + "screenshots";
23+
String screenshotsPath = Environment.getExternalStorageDirectory() + File.separator + ".literacyapp-analytics" + File.separator + "pictures";
2424
File screenshotsDir = new File(screenshotsPath);
2525
if (!screenshotsDir.exists()) {
2626
screenshotsDir.mkdirs();
2727
}
2828

29-
String dateFormatted = (String) DateFormat.format("yyyy-MM-dd_HH:mm:ss", Calendar.getInstance());
30-
String fileName = "Screenshot_" + dateFormatted + ".png";
29+
String dateFormatted = (String) DateFormat.format("yyyy-MM-dd_HHmmss", Calendar.getInstance());
30+
String fileName = dateFormatted + "_screenshot.png";
3131
File screenshotFile = new File(screenshotsDir, fileName);
3232
Log.i(DisplayHelper.class.getName(), "screenshotFile: " + screenshotFile);
3333

@@ -56,7 +56,6 @@ public static File resizeBitmap(File screenshotFile, int maxImageSize, boolean f
5656

5757
// Save scaled bitmap as file
5858
String scaledScreenshotPath = screenshotFile.getAbsolutePath();
59-
scaledScreenshotPath = scaledScreenshotPath.replace(".png", "_" + maxImageSize + ".png");
6059
Log.i(DisplayHelper.class.getName(), "scaledScreenshotPath: " + scaledScreenshotPath);
6160
File scaledScreenshotFile = new File(scaledScreenshotPath);
6261
try {

0 commit comments

Comments
 (0)