diff --git a/README.md b/README.md
index 5afb343..abc40de 100644
--- a/README.md
+++ b/README.md
@@ -1,101 +1,22 @@
-# cdr9020_qtr
-
+Thermal_QTR
+=================
+This sample is third-camera video record:
+
+* [Camera2](https://developer.android.com/reference/android/hardware/camera2/package-summary.html)
+* [Fragment](https://developer.android.com/reference/android/app/Fragment.html)
+* [RestartApp](https://qiita.com/Shiozawa/items/85f078ed57aed46f6b69.html)
+
+Libraries Used
+--------------
+* [Foundation][0] - Components for core system capabilities, Kotlin extensions and support for
+ multidex and automated testing.
+ * [AppCompat][1] - Degrade gracefully on older versions of Android.
+* [UI][2] - Details on why and how to use UI Components in your apps - together or separate
+ * [Fragment][3] - A basic unit of composable UI.
+ * [Layout][4] - Lay out widgets using different algorithms.
+
+[0]: https://developer.android.com/jetpack/components
+[1]: https://developer.android.com/topic/libraries/support-library/packages#v7-appcompat
+[2]: https://developer.android.com/guide/topics/ui
+[3]: https://developer.android.com/guide/components/fragments
+[4]: https://developer.android.com/guide/topics/ui/declaring-layout
diff --git a/app/.gitignore b/app/.gitignore
old mode 100755
new mode 100644
diff --git a/app/build.gradle b/app/build.gradle
old mode 100755
new mode 100644
index e63b347..6c7f92a
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -1,7 +1,5 @@
apply plugin: 'com.android.application'
-
android {
-
signingConfigs {
debug {
storeFile file('libs/debug.keystore')
@@ -9,16 +7,22 @@ android {
keyAlias = 'platform'
keyPassword 'android'
}
+ release {
+ storeFile file('libs/platform.keystore')
+ storePassword 'android'
+ keyAlias = 'platform'
+ keyPassword 'android'
+ }
}
- compileSdkVersion 28
+ compileSdkVersion 30
defaultConfig {
- applicationId "com.askey.record"
- minSdkVersion 27
- //noinspection OldTargetApi
- targetSdkVersion 27
- versionCode 2
+ applicationId "com.d160.thermal"
+ minSdkVersion 26
+ //noinspection ExpiredTargetSdkVersion,OldTargetApi
+ targetSdkVersion 30
+ versionCode 1
versionName "1.0"
- testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
+ testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner'
signingConfig signingConfigs.debug
}
buildTypes {
@@ -27,6 +31,8 @@ android {
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
debug {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
buildToolsVersion '28.0.3'
@@ -44,13 +50,18 @@ dependencies {
compileOnly files('libs/layoutlib.jar')
implementation fileTree(include: ['*.jar'], dir: 'libs')
//noinspection GradleDependency,GradleCompatible
- implementation 'com.android.support.constraint:constraint-layout:1.0.2'
+ implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
//noinspection GradleDependency,GradleCompatible
- implementation 'com.android.support.constraint:constraint-layout-solver:1.0.2'
+ implementation 'androidx.constraintlayout:constraintlayout-solver:1.1.3'
//noinspection GradleDependency,GradleCompatible
- implementation 'com.android.support:design:27.1.0'
+ implementation 'androidx.legacy:legacy-support-v4:1.0.0'
//noinspection GradleDependency,GradleCompatible
- implementation 'com.android.support:support-v4:27.1.0'
+ implementation 'androidx.appcompat:appcompat:1.0.0'
//noinspection GradleDependency,GradleCompatible
- implementation 'com.android.support:appcompat-v7:27.1.0'
+ implementation 'com.google.android.material:material:1.0.0'
+ //noinspection GradleDependency
+ testImplementation 'junit:junit:4.13.1'
+}
+repositories {
+ mavenCentral()
}
\ No newline at end of file
diff --git a/app/libs/platform.keystore b/app/libs/platform.keystore
new file mode 100644
index 0000000..52a741c
Binary files /dev/null and b/app/libs/platform.keystore differ
diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
old mode 100755
new mode 100644
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
old mode 100755
new mode 100644
index 023ba18..8d527a4
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -1,50 +1,47 @@
-
+
+
-
-
-
-
+
-
+
+
+
-
-
-
-
-
-
+ android:theme="@android:style/Theme.Translucent.NoTitleBar" />
-
+
\ No newline at end of file
diff --git a/app/src/main/assets/fonts/SF-Pro-Display-Black.ttf b/app/src/main/assets/fonts/SF-Pro-Display-Black.ttf
old mode 100755
new mode 100644
diff --git a/app/src/main/assets/fonts/SF-Pro-Display-BlackItalic.ttf b/app/src/main/assets/fonts/SF-Pro-Display-BlackItalic.ttf
old mode 100755
new mode 100644
diff --git a/app/src/main/assets/fonts/SF-Pro-Display-Bold.ttf b/app/src/main/assets/fonts/SF-Pro-Display-Bold.ttf
old mode 100755
new mode 100644
diff --git a/app/src/main/assets/fonts/SF-Pro-Display-BoldItalic.ttf b/app/src/main/assets/fonts/SF-Pro-Display-BoldItalic.ttf
old mode 100755
new mode 100644
diff --git a/app/src/main/assets/fonts/SF-Pro-Display-Heavy.ttf b/app/src/main/assets/fonts/SF-Pro-Display-Heavy.ttf
old mode 100755
new mode 100644
diff --git a/app/src/main/assets/fonts/SF-Pro-Display-HeavyItalic.ttf b/app/src/main/assets/fonts/SF-Pro-Display-HeavyItalic.ttf
old mode 100755
new mode 100644
diff --git a/app/src/main/assets/fonts/SF-Pro-Display-Light.ttf b/app/src/main/assets/fonts/SF-Pro-Display-Light.ttf
old mode 100755
new mode 100644
diff --git a/app/src/main/assets/fonts/SF-Pro-Display-LightItalic.ttf b/app/src/main/assets/fonts/SF-Pro-Display-LightItalic.ttf
old mode 100755
new mode 100644
diff --git a/app/src/main/assets/fonts/SF-Pro-Display-Medium.ttf b/app/src/main/assets/fonts/SF-Pro-Display-Medium.ttf
old mode 100755
new mode 100644
diff --git a/app/src/main/assets/fonts/SF-Pro-Display-MediumItalic.ttf b/app/src/main/assets/fonts/SF-Pro-Display-MediumItalic.ttf
old mode 100755
new mode 100644
diff --git a/app/src/main/assets/fonts/SF-Pro-Display-Regular.ttf b/app/src/main/assets/fonts/SF-Pro-Display-Regular.ttf
old mode 100755
new mode 100644
diff --git a/app/src/main/assets/fonts/SF-Pro-Display-RegularItalic.ttf b/app/src/main/assets/fonts/SF-Pro-Display-RegularItalic.ttf
old mode 100755
new mode 100644
diff --git a/app/src/main/assets/fonts/SF-Pro-Display-Semibold.ttf b/app/src/main/assets/fonts/SF-Pro-Display-Semibold.ttf
old mode 100755
new mode 100644
diff --git a/app/src/main/assets/fonts/SF-Pro-Display-SemiboldItalic.ttf b/app/src/main/assets/fonts/SF-Pro-Display-SemiboldItalic.ttf
old mode 100755
new mode 100644
diff --git a/app/src/main/assets/fonts/SF-Pro-Display-Thin.ttf b/app/src/main/assets/fonts/SF-Pro-Display-Thin.ttf
old mode 100755
new mode 100644
diff --git a/app/src/main/assets/fonts/SF-Pro-Display-ThinItalic.ttf b/app/src/main/assets/fonts/SF-Pro-Display-ThinItalic.ttf
old mode 100755
new mode 100644
diff --git a/app/src/main/assets/fonts/SF-Pro-Display-Ultralight.ttf b/app/src/main/assets/fonts/SF-Pro-Display-Ultralight.ttf
old mode 100755
new mode 100644
diff --git a/app/src/main/assets/fonts/SF-Pro-Display-UltralightItalic.ttf b/app/src/main/assets/fonts/SF-Pro-Display-UltralightItalic.ttf
old mode 100755
new mode 100644
diff --git a/app/src/main/java/com/askey/record/Config.java b/app/src/main/java/com/askey/record/Config.java
deleted file mode 100644
index fd38de0..0000000
--- a/app/src/main/java/com/askey/record/Config.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package com.askey.record;
-
-import android.content.Context;
-
-import static com.askey.record.Utils.CONFIG_TITLE;
-import static com.askey.record.Utils.configName;
-import static com.askey.record.Utils.defaultProp;
-import static com.askey.record.Utils.logName;
-
-public class Config {
-
- protected Context context;
- protected String firstCamera = "0";
- protected String secondCamera = "1";
- protected int numberOfRuns = 999;
- protected boolean New = defaultProp;
-
- public Config(Context context) {
- this.context = context;
- }
-
- public Config(Context context, String firstCamera, String secondCamera, int isRuns, boolean isNew) {
- this.context = context;
- this.firstCamera = firstCamera;
- this.secondCamera = secondCamera;
- this.numberOfRuns = isRuns;
- this.New = isNew;
- }
-
- protected String[] config() {
- return new String[]{
- CONFIG_TITLE+ context.getString(R.string.app_name) + "\r\n",
- "#CameraID (0:Outer, 1:Inner, 2:External)\r\n",
- "firstCameraID = " + firstCamera + "\r\n",
- "secondCameraID = " + secondCamera + "\r\n", "\r\n",
- "#Total number of runs (1 record is 1 min)\r\n",
- "numberOfRuns = " + numberOfRuns + "\r\n", "\r\n",
- "#Set Property\r\n",
- "setProperty = " + New + "\r\n", "\r\n",
- "#Video path\r\n",
- "first camera = /sdcard/v(yyMMddHHmmss)f.mp4\r\n",
- "second camera = /sdcard/v(yyMMddHHmmss)s.mp4\r\n", "\r\n",
- "#Recording in SD card for front, back or external camera\r\n",
- "#Recording high quality videos with 1080p / 720p\r\n",
- "#Recording custom frame rates from 13.7 / 27.5\r\n",
- "#Recording custom video Bit Rate 6Mbps\r\n",
- "#" + configName + " will build in Internal shared storage/DCIM/ for initial camera device or record time\r\n",
- "#" + configName + " failed to read column string or not exists will rebuild\r\n",
- "#" + logName + " will build in Internal shared storage/DCIM/ for save application log message\r\n",
- "#" + logName + " not exists will rebuild\r\n",
- "#" + logName + " will copy to SD card when record complete\r\n",
- "#Delete old videos when SD card full\r\n",
- "#At the recording video, please don't copy the SD card file\r\n",
- "#At least 1 Gb memory needs to be available to record\r\n",
- "#Need reboot device to wake up the External camera\r\n",
- "#Inner and External can't be used at the same time\r\n",
- "#Application will reset when external camera error\r\n", "\r\n"
- };
- }
-}
diff --git a/app/src/main/java/com/askey/record/Utils.java b/app/src/main/java/com/askey/record/Utils.java
deleted file mode 100644
index f3f0553..0000000
--- a/app/src/main/java/com/askey/record/Utils.java
+++ /dev/null
@@ -1,479 +0,0 @@
-package com.askey.record;
-
-import android.annotation.SuppressLint;
-import android.content.Context;
-import android.os.Handler;
-import android.util.SparseIntArray;
-import android.view.Surface;
-import android.view.View;
-import android.widget.EditText;
-
-import com.askey.widget.LogMsg;
-import com.askey.widget.mLog;
-
-import java.io.BufferedReader;
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.InputStreamReader;
-import java.time.format.DateTimeFormatter;
-import java.util.ArrayList;
-import java.util.Calendar;
-
-import static com.askey.record.VideoRecordActivity.SD_Mode;
-import static com.askey.record.VideoRecordActivity.onReset;
-import static com.askey.record.VideoRecordActivity.saveLog;
-
-public class Utils {
- public static final double[] DFRAME_RATE = {16, 27.5},
- NEW_DFRAME_RATE = {14, 28};
- public static final String[] FRAME_RATE = {"16fps", "27.5fps"},
- NEW_FRAME_RATE = {"14fps", "28fps"};
- public static final String[] FPS = {"140", "280"};
- public static final String FRAMESKIP = "persist.our.camera.fps";
- public static final String EXTRA_VIDEO_RUN = "RestartActivity.run";
- public static final String EXTRA_VIDEO_FAIL = "RestartActivity.fail";
- public static final String EXTRA_VIDEO_RESET = "RestartActivity.reset";
- public static final String EXTRA_VIDEO_RECORD = "RestartActivity.record";
- public static final String EXTRA_VIDEO_SUCCESS = "RestartActivity.success";
- public static final String EXTRA_VIDEO_COPY = "RestartActivity.copy";
- public static final String EXTRA_VIDEO_PATH = "RestartActivity.path";
- public static final String EXTRA_VIDEO_PASTE = "RestartActivity.paste";
- public static final String EXTRA_VIDEO_REMOVE = "RestartActivity.remove";
- public static final String EXTRA_VIDEO_VERSION = "RestartActivity.version";
- public static final String EXTRA_VIDEO_REFORMAT = "RestartActivity.reformat";
- public static final String NO_SD_CARD = "SD card is not available!";
- public static final String configName = "VideoRecordConfig.ini";
- public static final String logName = "VideoRecordLog.ini";
- public static final String CONFIG_TITLE = "[Video_Record_Config]";
- public static final String LOG_TITLE = "[Video_Record_Log]";
- public static final SparseIntArray ORIENTATIONS = new SparseIntArray();
- public static final double sdData = 1;
- public static final boolean defaultProp = true;
- public static int isRun = 0, Success = 0, Fail = 0;
- public static String TAG = "VideoRecordActivity";
- public static String firstCamera = "0";
- public static String secondCamera = "1";
- public static String lastfirstCamera = "0";
- public static String lastsecondCamera = "1";
- public static String firstFile = "";
- public static String secondFile = "";
- public static ArrayList firstFilePath, secondFilePath;
- public static ArrayList videoLogList = null;
- public static int isFinish = 999, delayTime = 60500, isFrame = 0, isQuality = 0;
- public static boolean isReady = false, isRecord = false, isError = false, isNew = true;
- public static boolean fCamera = true, sCamera = true, getSdCard = false;
- public static String errorMessage = "";
-
- static {
- ORIENTATIONS.append(Surface.ROTATION_0, 90);
- ORIENTATIONS.append(Surface.ROTATION_90, 0);
- ORIENTATIONS.append(Surface.ROTATION_180, 270);
- ORIENTATIONS.append(Surface.ROTATION_270, 180);
- }
-
- //TODO Default Path
- public static String getPath() {
- String path = "/storage/emulated/0/DCIM/";
- return path;
- }
-
- public static String getSDPath() {
- String path = "";
- if (SD_Mode) {
- try {
- long start = System.currentTimeMillis();
- long end = start + 10000;
- Runtime run = Runtime.getRuntime();
- String cmd = "ls /storage";
- Process pr = run.exec(cmd);
- BufferedReader buf = new BufferedReader(new InputStreamReader(pr.getInputStream()));
- String line;
- while ((line = buf.readLine()) != null) {
- if (!line.equals("self") && !line.equals("emulated") && !line.equals("enterprise") && !line.contains("sdcard")) {
- path = "/storage/" + line + "/";
- break;
- }
- if (System.currentTimeMillis() > end) {
- break;
- }
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- } else {
- path = getPath();
- }
- return path;
- }
-
- public static int getFail() {
- return Fail;
- }
-
- public static int getIsRun() {
- return isRun;
- }
-
- public static int getSuccess() {
- return Success;
- }
-
- public static int getReset() {
- return onReset;
- }
-
- public static boolean isInteger(String s, boolean zero) {
- try {
- if (Integer.parseInt(s) <= (zero ? 0 : -1)) {
- return false;
- }
- } catch (Exception e) {
- e.printStackTrace();
- return false;
- }
- return true;
- }
-
- public static boolean isBoolean(String s) {
- try {
- Boolean.valueOf(s);
- return true;
- } catch (Exception e) {
- e.printStackTrace();
- return false;
- }
- }
-
- public static void setTestTime(int min) {
- if (min == 999)
- videoLogList.add(new LogMsg("setRecord time: unlimited times.", mLog.d));
- else {
- videoLogList.add(new LogMsg("setRecord time: " + min + " min.", mLog.d));
- }
- isFinish = min == 999 ? min : min * 2;
- }
-
- public static void checkConfigFile(Context context, boolean first) {
- videoLogList.add(new LogMsg("#checkConfigFile", mLog.v));
- if (!getPath().equals("")) {
- getSdCard = true;
- File file = new File(getPath(), configName);
- if (!file.exists()) {
- try {
- file.createNewFile();
- } catch (Exception e) {
- e.printStackTrace();
- }
- videoLogList.add(new LogMsg("Create the config file.", mLog.w));
- writeConfigFile(context, file, new Config(context).config());
- } else {
- if (!isReady) {
- videoLogList.add(new LogMsg("Find the config file.", mLog.d));
- videoLogList.add(new LogMsg("#------------------------------", mLog.v));
- }
- checkConfigFile(context, new File(getPath(), configName), first);
- }
- } else {
- getSdCard = false;
- }
- }
-
- public static void checkLogFile(Context context, File file, ArrayList list) {
- String input = readConfigFile(context, file);
- if (input.length() > 0) {
- String[] read = input.split("\r\n");
- for (String s : read)
- list.add(s);
- }
- }
-
- public static boolean[] checkConfigFile(Context context, File file, boolean firstOne) {
- try {
- String input = readConfigFile(context, file);
- boolean reformat = true, isCameraChange = false, isPropChange = false, update = true;
- if (input.length() > 0) {
- String[] read = input.split("\r\n");
- int target = 0, t;
- String title = CONFIG_TITLE;
- String first = "firstCameraID = ", second = "secondCameraID = ";
- String code = "numberOfRuns = ", prop = "setProperty = ";
- for (String s : read)
- if (s.indexOf(title) != -1) {
- target++;
- t = s.indexOf(title) + title.length();
- title = s.substring(t);
- break;
- }
- for (String s : read)
- if (s.indexOf(first) != -1) {
- target++;
- t = s.indexOf(first) + first.length();
- first = s.substring(t);
- break;
- }
- for (String s : read)
- if (s.indexOf(second) != -1) {
- target++;
- t = s.indexOf(second) + second.length();
- second = s.substring(t);
- break;
- }
- for (String s : read)
- if (s.indexOf(code) != -1) {
- target++;
- t = s.indexOf(code) + code.length();
- code = s.substring(t);
- break;
- }
- for (String s : read)
- if (s.indexOf(prop) != -1) {
- target++;
- t = s.indexOf(prop) + prop.length();
- prop = s.substring(t);
- break;
- }
-
- if (target == 5) {
- reformat = false;
- if (title.equals(context.getString(R.string.app_name))) {
- update = false;
- } else {
- videoLogList.add(new LogMsg("Config is updated.", mLog.e));
- reformat = true;
- }
- if (!first.equals(second)) {
- if ((first.equals("1") && second.equals("2")) || (first.equals("2") && second.equals("1"))) {
- videoLogList.add(new LogMsg("Inner and External can't be used at the same time.", mLog.e));
- reformat = true;
- } else {
- if (isCameraID(context, first.split("\n")[0], second.split("\n")[0])) {
- lastfirstCamera = firstOne ? first : firstCamera;
- lastsecondCamera = firstOne ? second : secondCamera;
- firstCamera = first;
- secondCamera = second;
- if (!firstOne)
- if (!lastfirstCamera.equals(firstCamera) || !lastsecondCamera.equals(secondCamera))
- isCameraChange = true;
- } else {
- videoLogList.add(new LogMsg("Unknown Camera ID.", mLog.e));
- reformat = true;
- }
- }
- } else {
- videoLogList.add(new LogMsg("Cannot use the same Camera ID.", mLog.e));
- reformat = true;
- }
- if (isInteger(code.split("\n")[0], true)) {
- int min = Integer.parseInt(code.split("\n")[0]);
- if (min < 0) {
- videoLogList.add(new LogMsg("The test time must be a positive number.", mLog.e));
- reformat = true;
- }
- setTestTime(min);
- } else {
- videoLogList.add(new LogMsg("Unknown Record Times.", mLog.e));
- reformat = true;
- }
- if (isBoolean(prop)) {
- boolean getProp = Boolean.valueOf(prop);
- if (isNew != getProp)
- isPropChange = true;
- isNew = getProp;
-
- } else {
- videoLogList.add(new LogMsg("Unknown setProperty.", mLog.e));
- reformat = true;
- }
- }
- }
- if (update) {
- String logString = LOG_TITLE + context.getString(R.string.app_name) + "\r\n";
- videoLogList.add(new LogMsg("Reformat the Log file.", mLog.e));
- for (LogMsg logs : videoLogList) {
- String time = logs.time.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))
- + " run:" + logs.runTime + " -> ";
- logString += (time + logs.msg + "\r\n");
- }
- try {
- FileOutputStream output = new FileOutputStream(new File(getPath(), logName), false);
- output.write(logString.getBytes());
- output.close();
- videoLogList.clear();
-
- } catch (Exception e) {
- e.printStackTrace();
- videoLogList.add(new LogMsg("Write LOG failed. <============ error here", mLog.e));
- }
- }
- if (reformat) {
- reformatConfigFile(context, file);
- return new boolean[]{true, true};
- } else return new boolean[]{isCameraChange, isPropChange};
- } catch (Exception e) {
- e.printStackTrace();
- reformatConfigFile(context, file);
- return new boolean[]{true, true};
- }
- }
-
- public static boolean isCameraID(Context context, String f, String b) {
- try {
- if (Integer.parseInt(f) <= -1) {
- videoLogList.add(new LogMsg("The Camera ID must be a positive number.", mLog.e));
- return false;
- } else {
- boolean cameraID;
- switch (Integer.parseInt(f)) {
- case 0:
- case 1:
- case 2:
- cameraID = true;
- break;
- default:
- cameraID = false;
- break;
- }
- if (!cameraID) {
- videoLogList.add(new LogMsg("The Camera ID is unknown.", mLog.e));
- return false;
- }
- }
- if (Integer.parseInt(b) <= -1) {
- videoLogList.add(new LogMsg("The Camera ID must be a positive number.", mLog.e));
- return false;
- } else {
- boolean cameraID;
- switch (Integer.parseInt(b)) {
- case 0:
- case 1:
- case 2:
- cameraID = true;
- break;
- default:
- cameraID = false;
- break;
- }
- if (!cameraID) {
- videoLogList.add(new LogMsg("The Camera ID is unknown.", mLog.e));
- return false;
- }
- }
- return true;
- } catch (Exception e) {
- e.printStackTrace();
- return false;
- }
- }
-
- public static void setConfigFile(Context context, File file, View view, boolean reset) {
- EditText editText_1 = view.findViewById(R.id.dialog_editText_1);
- EditText editText_2 = view.findViewById(R.id.dialog_editText_2);
- EditText editText_3 = view.findViewById(R.id.dialog_editText_3);
- int isFinish = 999;
-
- if (!reset) {
- if (isInteger(editText_3.getText().toString(), false)) {
- isFinish = Integer.parseInt(editText_3.getText().toString());
- } else {
- isFinish = 999;
- }
- }
-
- //toast(context, "Ready to write.", mLog.w);
- writeConfigFile(context, file, (
- !reset ? new Config(context, editText_1.getText().toString(),
- editText_2.getText().toString(), isFinish, isNew) : new Config(context)).config());
- //toast(context, "Write file is completed.", mLog.i);
- }
-
- public static void reformatConfigFile(Context context, File file) {
- //toast(context, "Config file error.", mLog.e);
- writeConfigFile(context, file, new Config(context).config());
- videoLogList.add(new LogMsg("Reformat the Config file.", mLog.e));
- }
-
- public static String readConfigFile(Context context, File file) {
- String tmp = "";
- try {
- FileInputStream input = new FileInputStream(file);
- ByteArrayOutputStream bytes = new ByteArrayOutputStream();
- byte[] buffer = new byte[1024];
- int length;
- while ((length = input.read(buffer)) != -1) {
- bytes.write(buffer, 0, length);
- }
- tmp += bytes.toString();
- bytes.close();
- input.close();
- } catch (Exception e) {
- e.printStackTrace();
- isError = true;
- getSdCard = !getSDPath().equals("");
- videoLogList.add(new LogMsg("Read failed. " + NO_SD_CARD + ". <============ Crash here", mLog.e));
- new Handler().post(() -> saveLog(context, false, false));
- errorMessage = "Read failed." + NO_SD_CARD + "<============ Crash here";
- videoLogList.add(new LogMsg("Read failed.", mLog.e));
- tmp += ("App Version:" + context.getString(R.string.app_name) + "\r\n");
- tmp += (NO_SD_CARD);
- return tmp;
- }
- return tmp;
- }
-
- public static void writeConfigFile(Context context, File file, String[] str) {
- if (getSdCard) {
- String tmp = "";
- for (String s : str)
- tmp += s;
- try {
- FileOutputStream output = new FileOutputStream(file);
- output.write(tmp.getBytes());
- output.close();
- } catch (Exception e) {
- e.printStackTrace();
- isError = true;
- getSdCard = !getSDPath().equals("");
- videoLogList.add(new LogMsg("Write failed. " + NO_SD_CARD + ". <============ Crash here", mLog.e));
- new Handler().post(() -> saveLog(context, false, false));
- errorMessage = "Write failed. " + NO_SD_CARD + "<============ Crash here";
- }
- } else {
- videoLogList.add(new LogMsg(NO_SD_CARD, mLog.e));
- }
- }
-
- @SuppressLint("DefaultLocale")
- public static String getCalendarTime() {
- String d, h, i, s;
- Calendar calendar = Calendar.getInstance();
- d = String.format("%02d", calendar.get(Calendar.DATE));
- h = String.format("%02d", calendar.get(Calendar.HOUR_OF_DAY));
- i = String.format("%02d", calendar.get(Calendar.MINUTE));
- s = String.format("%02d", calendar.get(Calendar.SECOND));
-
- return d + h + i + s + "";
- }
-
- @SuppressLint("DefaultLocale")
- public static String getCalendarTime(boolean isCameraOne) {
- String y, m, d, h, i, s;
- Calendar calendar = Calendar.getInstance();
- y = String.format("%02d", calendar.get(Calendar.YEAR));
- m = String.format("%02d", (calendar.get(Calendar.MONTH) - 1));
- d = String.format("%02d", calendar.get(Calendar.DATE));
- h = String.format("%02d", calendar.get(Calendar.HOUR_OF_DAY));
- i = String.format("%02d", calendar.get(Calendar.MINUTE));
- s = String.format("%02d", calendar.get(Calendar.SECOND));
-
- return "v" + y + m + d + h + i + s + (isCameraOne ? "f" : "s");
- }
-
- public static String getFileExtension(String fullName) {
- String fileName = new File(fullName).getName();
- int dotIndex = fileName.lastIndexOf('.');
- return (dotIndex == -1) ? "" : fileName.substring(dotIndex + 1);
- }
-
-}
diff --git a/app/src/main/java/com/askey/record/VideoRecordActivity.java b/app/src/main/java/com/askey/record/VideoRecordActivity.java
deleted file mode 100644
index 388bad6..0000000
--- a/app/src/main/java/com/askey/record/VideoRecordActivity.java
+++ /dev/null
@@ -1,1478 +0,0 @@
-package com.askey.record;
-
-import android.Manifest;
-import android.annotation.SuppressLint;
-import android.annotation.TargetApi;
-import android.app.Activity;
-import android.app.AlertDialog;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.content.pm.PackageManager;
-import android.content.res.Configuration;
-import android.graphics.SurfaceTexture;
-import android.hardware.camera2.CameraCaptureSession;
-import android.hardware.camera2.CameraCharacteristics;
-import android.hardware.camera2.CameraDevice;
-import android.hardware.camera2.CameraManager;
-import android.hardware.camera2.CameraMetadata;
-import android.hardware.camera2.CaptureRequest;
-import android.media.CamcorderProfile;
-import android.media.MediaRecorder;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.HandlerThread;
-import android.os.Message;
-import android.os.SystemProperties;
-import android.support.v4.app.ActivityCompat;
-import android.util.Log;
-import android.util.Size;
-import android.view.LayoutInflater;
-import android.view.Surface;
-import android.view.TextureView;
-import android.view.View;
-import android.widget.EditText;
-import android.widget.ListView;
-import android.widget.TextView;
-
-import com.askey.widget.CustomPageTransformer;
-import com.askey.widget.CustomTextView;
-import com.askey.widget.HomeListen;
-import com.askey.widget.LogMsg;
-import com.askey.widget.PropertyUtils;
-import com.askey.widget.VerticalViewPager;
-import com.askey.widget.mListAdapter;
-import com.askey.widget.mLog;
-import com.askey.widget.mPagerAdapter;
-
-import java.io.File;
-import java.math.BigDecimal;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Timer;
-import java.util.TimerTask;
-
-import static com.askey.record.Utils.EXTRA_VIDEO_COPY;
-import static com.askey.record.Utils.EXTRA_VIDEO_FAIL;
-import static com.askey.record.Utils.EXTRA_VIDEO_PASTE;
-import static com.askey.record.Utils.EXTRA_VIDEO_PATH;
-import static com.askey.record.Utils.EXTRA_VIDEO_RECORD;
-import static com.askey.record.Utils.EXTRA_VIDEO_REFORMAT;
-import static com.askey.record.Utils.EXTRA_VIDEO_REMOVE;
-import static com.askey.record.Utils.EXTRA_VIDEO_RESET;
-import static com.askey.record.Utils.EXTRA_VIDEO_RUN;
-import static com.askey.record.Utils.EXTRA_VIDEO_SUCCESS;
-import static com.askey.record.Utils.EXTRA_VIDEO_VERSION;
-import static com.askey.record.Utils.FPS;
-import static com.askey.record.Utils.FRAMESKIP;
-import static com.askey.record.Utils.FRAME_RATE;
-import static com.askey.record.Utils.NEW_FRAME_RATE;
-import static com.askey.record.Utils.NO_SD_CARD;
-import static com.askey.record.Utils.TAG;
-import static com.askey.record.Utils.checkConfigFile;
-import static com.askey.record.Utils.configName;
-import static com.askey.record.Utils.delayTime;
-import static com.askey.record.Utils.errorMessage;
-import static com.askey.record.Utils.fCamera;
-import static com.askey.record.Utils.Fail;
-import static com.askey.record.Utils.firstCamera;
-import static com.askey.record.Utils.firstFile;
-import static com.askey.record.Utils.firstFilePath;
-import static com.askey.record.Utils.getCalendarTime;
-import static com.askey.record.Utils.getFail;
-import static com.askey.record.Utils.getIsRun;
-import static com.askey.record.Utils.getPath;
-import static com.askey.record.Utils.getSDPath;
-import static com.askey.record.Utils.getSdCard;
-import static com.askey.record.Utils.getSuccess;
-import static com.askey.record.Utils.isError;
-import static com.askey.record.Utils.isFinish;
-import static com.askey.record.Utils.isFrame;
-import static com.askey.record.Utils.isInteger;
-import static com.askey.record.Utils.isNew;
-import static com.askey.record.Utils.isQuality;
-import static com.askey.record.Utils.isReady;
-import static com.askey.record.Utils.isRecord;
-import static com.askey.record.Utils.isRun;
-import static com.askey.record.Utils.lastfirstCamera;
-import static com.askey.record.Utils.lastsecondCamera;
-import static com.askey.record.Utils.logName;
-import static com.askey.record.Utils.readConfigFile;
-import static com.askey.record.Utils.reformatConfigFile;
-import static com.askey.record.Utils.sCamera;
-import static com.askey.record.Utils.secondCamera;
-import static com.askey.record.Utils.secondFile;
-import static com.askey.record.Utils.secondFilePath;
-import static com.askey.record.Utils.setConfigFile;
-import static com.askey.record.Utils.Success;
-import static com.askey.record.Utils.videoLogList;
-import static com.askey.record.restartActivity.EXTRA_MAIN_PID;
-
-public class VideoRecordActivity extends Activity {
- //TODO 使用SD Card儲存 SD_Mode 設置為 true
- public static boolean SD_Mode = true;
- //TODO 使用錯誤重啟 autoRestart 設置為 true
- public static boolean autoRestart = true;
- public static boolean extraRecordStatus = false, onRestart = false;
- public static int onRun = 0, onSuccess = 0, onFail = 0, onReset = 0;
- private static String codeDate0, codeDate1, resetDate;
- private Size mPreviewSize;
- private TextureView mTextureView0, mTextureView1;
- private CameraDevice mCameraDevice0, mCameraDevice1;
- private CameraCaptureSession mPreviewSession0, mPreviewSession1;
- private CameraDevice.StateCallback mStateCallback0, mStateCallback1;
- private CaptureRequest.Builder mPreviewBuilder0, mPreviewBuilder1;
- private MediaRecorder mMediaRecorder0, mMediaRecorder1;
- private Handler mainHandler, demoHandler;
- private Handler recordHandler0, recordHandler1, stopRecordHandler0, stopRecordHandler1;
- private Handler backgroundHandler0, backgroundHandler1;
- private HandlerThread thread0, thread1;
- private HomeListen home;
- private mTimerTask timerTask = null;
- private Timer mTimer = null;
- private float mLaptime = 0.0f;
- private int delayMillis = 3000;
-
- private void getSetting(Context context, EditText editText1, EditText editText2, EditText editText3, TextView editText4) {
- String input = readConfigFile(context, new File(getPath(), configName));
- if (input.length() > 0) {
- String[] read = input.split("\r\n");
- int t;
- String first = "firstCameraID = ", second = "secondCameraID = ";
- String code = "numberOfRuns = ", prop = "setProperty = ";
- for (String s : read)
- if (s.indexOf(first) != -1) {
- t = s.indexOf(first) + first.length();
- first = s.substring(t);
- break;
- }
- for (String s : read)
- if (s.indexOf(second) != -1) {
- t = s.indexOf(second) + second.length();
- second = s.substring(t);
- break;
- }
- for (String s : read)
- if (s.indexOf(code) != -1) {
- t = s.indexOf(code) + code.length();
- code = s.substring(t);
- break;
- }
- for (String s : read)
- if (s.indexOf(prop) != -1) {
- t = s.indexOf(prop) + prop.length();
- prop = s.substring(t);
- break;
- }
- editText1.setText(first);
- editText2.setText(second);
- editText3.setText(code);
- editText4.setText(prop);
- } else {
- videoLogList.add(new LogMsg("Error reading config file."));
- reformatConfigFile(context, new File(getPath(), configName));
- }
- }
-
- private void setRecord() {
- isRecord = true;
- checkConfigFile(VideoRecordActivity.this, new File(getPath(), configName), false);
- if (extraRecordStatus) {
- isRun = onRun;
- Success = onSuccess;
- Fail = onFail;
- } else {
- onReset = 0;
- isRun = 0;
- Success = 0;
- Fail = 0;
- }
- extraRecordStatus = true;
- firstFilePath.clear();
- secondFilePath.clear();
- }
-
- private void isRecordStart(boolean auto) {
- if (!isError && getSdCard) {
- if (isReady) {
- if (!isRecord) {
- if (!auto)
- videoLogList.add(new LogMsg("@Start record", mLog.v));
- else
- videoLogList.add(new LogMsg("#Start record", mLog.v));
- setRecord();
- takeRecord();
-
- } else {
- if (!auto)
- videoLogList.add(new LogMsg("@Stop record", mLog.v));
- else
- videoLogList.add(new LogMsg("#Stop record", mLog.v));
- isFinish = 0;
- new Handler().post(() -> stopRecord(true));
- }
- } else {
- videoLogList.add(new LogMsg("#Camera is not ready.", mLog.v));
- }
- } else {
- stopRecordAndSaveLog(false);
- showDialogLog();
- }
- }
-
- private boolean checkPermission() {
- videoLogList.add(new LogMsg("#checkPermission", mLog.v));
- int CAMERA = checkSelfPermission(Manifest.permission.CAMERA);
- int STORAGE = checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE);
- return permission(CAMERA) || permission(STORAGE);
- }
-
- @TargetApi(23)
- @SuppressLint("NewApi")
- private void showPermission() {
- videoLogList.add(new LogMsg("#showPermission", mLog.v));
- // We don't have permission so prompt the user
- List permissions = new ArrayList();
- permissions.add(Manifest.permission.CAMERA);
- permissions.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
- requestPermissions(permissions.toArray(new String[permissions.size()]), 0);
- }
-
- public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
- switch (requestCode) {
- case 0:
- if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
- // 許可授權
- setStart();
- } else {
- // 沒有權限
- showPermission();
- videoLogList.add(new LogMsg("#no permissions!", mLog.e));
- videoLogList.add(new LogMsg("No permissions!"));
- }
- break;
- default:
- super.onRequestPermissionsResult(requestCode, permissions, grantResults);
- }
- }
-
- private boolean permission(int mp) {
- return mp != PackageManager.PERMISSION_GRANTED;
- }
-
- @SuppressLint("InflateParams")
- private void setStart() {
- setContentView(R.layout.activity_video_record);
- setHomeListener();
- initial();
- }
-
- public void onConfigurationChanged(Configuration newConfig) {
- super.onConfigurationChanged(newConfig);
- Log.d(TAG, "onConfigurationChanged: E");
- // do nothing
- }
-
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- isRun = 0;
- videoLogList = new ArrayList();
- if (checkPermission()) {
- showPermission();
- } else {
- checkConfigFile(this, true);
- //TODO getprop
- // -> adb shell su 0 getprop persist.our.camera.fps
- if (isNew) {
- try {
- SystemProperties.set(FRAMESKIP, FPS[0]);
- } catch (Exception e) {
- e.getStackTrace();
- isError = true;
- videoLogList.add(new LogMsg("SystemProperties error.", mLog.e));
- new Handler().post(() -> saveLog(this, false, false));
- errorMessage = "SystemProperties error. Please check your BuildVersion is 0302.";
- }
- } //*reflection invoke
- setStart();
-
- }
- }
-
- public void onBackPressed() {
- videoLogList.add(new LogMsg("@back", mLog.v));
- stopRecordAndSaveLog(true);
- }
-
- private void setHomeListener() {
- home = new HomeListen(this);
- home.setOnHomeBtnPressListener(new HomeListen.OnHomeBtnPressLitener() {
- public void onHomeBtnPress() {
- videoLogList.add(new LogMsg("@home", mLog.v));
- stopRecordAndSaveLog(true);
- }
-
- public void onHomeBtnLongPress() {
- videoLogList.add(new LogMsg("@recent", mLog.v));
- stopRecordAndSaveLog(true);
- }
- });
- home.start();
- }
-
- private void setCallback(int callback) {
- try {
- if (callback == 0)
- mStateCallback0 = new CameraDevice.StateCallback() {
-
- public void onOpened(CameraDevice camera) {
- fCamera = true;
- if (!isReady) {
- // 打开摄像头
- Log.e(TAG, "onOpened");
- videoLogList.add(new LogMsg("Camera " + firstCamera + " is opened.", mLog.i));
- }
- mCameraDevice0 = camera;
- // 开启预览
- takePreview(firstCamera);
- }
-
- public void onDisconnected(CameraDevice camera) {
- try {
- fCamera = false;
- camera.close();
- // 关闭摄像头
- Log.e(TAG, "onDisconnected");
- videoLogList.add(new LogMsg("Camera " + firstCamera + " is disconnected.", mLog.w));
- if (null != mCameraDevice0) {
- mCameraDevice0.close();
- mCameraDevice0 = null;
- }
- } catch (Exception e) {
- e.printStackTrace();
- isError = true;
- videoLogList.add(new LogMsg("Camera " + firstCamera + " close error.", mLog.w));
- new Handler().post(() -> stopRecordAndSaveLog(false));
- errorMessage = "Camera " + firstCamera + " close error.";
- ((TextView) findViewById(R.id.record_status)).setText("Error");
- }
- if (autoRestart && isError) {
- final String dates = resetDate + "";
- final boolean records = extraRecordStatus;
- new Handler().postDelayed(() -> restartApp(dates, records), delayMillis);
- }
- }
-
- public void onError(CameraDevice camera, int error) {
- isError = true;
- onDisconnected(camera);
- // 前鏡頭開啟失敗
- Log.e(TAG, "onError");
- closePreviewSession(firstCamera);
- videoLogList.add(new LogMsg("Open Camera " + firstCamera + " error. <============ Crash here", mLog.e));
- new Handler().post(() -> stopRecordAndSaveLog(false));
- errorMessage = "Open Camera " + firstCamera + " error. <============ Crash here";
- ((TextView) findViewById(R.id.record_status)).setText("Error");
- }
- };
- if (callback == 1)
- mStateCallback1 = new CameraDevice.StateCallback() {
-
- public void onOpened(CameraDevice camera) {
- sCamera = true;
- if (!isReady) {
- // 打开摄像头
- Log.e(TAG, "onOpened");
- videoLogList.add(new LogMsg("Camera " + secondCamera + " is opened.", mLog.i));
- }
- mCameraDevice1 = camera;
- // 开启预览
- takePreview(secondCamera);
- if (!isReady) {
- isReady = true;
- new Handler().postDelayed(() -> demoHandler.obtainMessage().sendToTarget(), 500);
- }
- }
-
- public void onDisconnected(CameraDevice camera) {
- try {
- sCamera = false;
- camera.close();
- // 关闭摄像头
- Log.e(TAG, "onDisconnected");
- videoLogList.add(new LogMsg("Camera " + secondCamera + " is disconnected.", mLog.w));
- if (null != mCameraDevice1) {
- mCameraDevice1.close();
- mCameraDevice1 = null;
- }
- } catch (Exception e) {
- e.printStackTrace();
- isError = true;
- videoLogList.add(new LogMsg("Camera " + secondCamera + " close error.", mLog.w));
- new Handler().post(() -> stopRecordAndSaveLog(false));
- errorMessage = "Camera " + secondCamera + " close error.";
- ((TextView) findViewById(R.id.record_status)).setText("Error");
- }
- if (autoRestart && isError) {
- final String dates = resetDate + "";
- final boolean records = extraRecordStatus;
- new Handler().postDelayed(() -> restartApp(dates, records), delayMillis);
- }
- }
-
- public void onError(CameraDevice camera, int error) {
- isError = true;
- onDisconnected(camera);
- // 前鏡頭開啟失敗
- Log.e(TAG, "onError");
- closePreviewSession(secondCamera);
- videoLogList.add(new LogMsg("Open Camera " + secondCamera + " error. <============ Crash here", mLog.e));
- new Handler().post(() -> stopRecordAndSaveLog(false));
- errorMessage = "Open Camera " + secondCamera + " error. <============ Crash here";
- ((TextView) findViewById(R.id.record_status)).setText("Error");
- }
- };
- } catch (Exception e) {
- e.printStackTrace();
- getSdCard = !getSDPath().equals("");
- isError = true;
- videoLogList.add(new LogMsg("CameraDevice.StateCallback " + callback + " error. <============ Crash here", mLog.e));
- new Handler().post(() -> stopRecordAndSaveLog(false));
- errorMessage = "CameraDevice.StateCallback " + callback + " error. <============ Crash here";
- ((TextView) findViewById(R.id.record_status)).setText("Error");
- if (autoRestart) {
- final String dates = resetDate + "";
- final boolean records = extraRecordStatus;
- new Handler().postDelayed(() -> restartApp(dates, records), delayMillis);
- }
- }
- }
-
- private void stopRecordAndSaveLog(boolean kill) {
- isFinish = 0;
- if (isRecord) new Handler().post(() -> {
- new Handler().post(() -> stopRecord(false));
- });
- new Handler().post(() -> saveLog(getApplicationContext(), false, kill));
- }
-
- private void restartApp(String date, boolean record) {
- if (date.equals(resetDate)) {
- try {
- home = null;
- } catch (Exception ignored) {
-
- }
- onRestart = true;
- onReset++;
- Context context = getApplicationContext();
- Intent intent = restartActivity.createIntent(context);
- intent.putExtra(EXTRA_VIDEO_RUN, onRun);
- intent.putExtra(EXTRA_VIDEO_FAIL, onFail);
- intent.putExtra(EXTRA_VIDEO_RESET, onReset);
- intent.putExtra(EXTRA_VIDEO_SUCCESS, onSuccess);
- intent.putExtra(EXTRA_VIDEO_RECORD, record);
- context.startActivity(intent);
- }
- }
-
- @SuppressLint("HandlerLeak")
- private void initial() {
- getSdCard = !getSDPath().equals("");
- ArrayList items_frame = new ArrayList();
- ArrayList items_quality = new ArrayList();
- for (String frame : new ArrayList<>(Arrays.asList( // or "3.9fps", "3.4fps", "1.7fps", "0.8fps"
- isNew ? NEW_FRAME_RATE : FRAME_RATE))) {
- View vi = LayoutInflater.from(this).inflate(R.layout.style_vertical_item, null);
- CustomTextView item = vi.findViewById(R.id.customTextView);
- item.setText(frame);
- items_frame.add(vi);
- }
- for (String quality : new ArrayList<>(Arrays.asList("1080p", "720p"))) {
- View vi = LayoutInflater.from(this).inflate(R.layout.style_vertical_item, null);
- CustomTextView item = vi.findViewById(R.id.customTextView);
- item.setText(quality);
- items_quality.add(vi);
- }
- if (isNew) {
- VerticalViewPager pager_Frame = findViewById(R.id.pager1);
- pager_Frame.addOnPageChangeListener(new mOnPageChangeListener(0));
- pager_Frame.setAdapter(new mPagerAdapter(items_frame));
- pager_Frame.setPageTransformer(true, new CustomPageTransformer());
- }
- VerticalViewPager pager_Quality = findViewById(R.id.pager2);
- pager_Quality.addOnPageChangeListener(new mOnPageChangeListener(1));
- pager_Quality.setAdapter(new mPagerAdapter(items_quality));
- pager_Quality.setPageTransformer(true, new CustomPageTransformer());
-
- // TODO findViewById
- setLoading(false);
- videoLogList.add(new LogMsg("Initial now.", mLog.v));
- thread0 = new HandlerThread("CameraPreview0");
- thread0.start();
- thread1 = new HandlerThread("CameraPreview1");
- thread1.start();
- backgroundHandler0 = new Handler(thread0.getLooper());
- backgroundHandler1 = new Handler(thread1.getLooper());
- mainHandler = new Handler(getMainLooper());
- recordHandler0 = new Handler() {
- public void handleMessage(android.os.Message msg) {
- startRecord(firstCamera);
- }
- };
- recordHandler1 = new Handler() {
- public void handleMessage(android.os.Message msg) {
- startRecord(secondCamera);
- }
- };
- stopRecordHandler0 = new Handler() {
- public void handleMessage(android.os.Message msg) {
- stopRecord(msg.obj.toString(), msg.arg1 + "");
- }
- };
- stopRecordHandler1 = new Handler() {
- public void handleMessage(android.os.Message msg) {
- stopRecord(msg.obj.toString(), msg.arg1 + "");
- }
- };
-
- codeDate0 = getCalendarTime();
- codeDate1 = getCalendarTime();
- resetDate = getCalendarTime();
- setCallback(0);
- setCallback(1);
- mTextureView0 = findViewById(R.id.surfaceView0);
- mTextureView0.setSurfaceTextureListener(new mSurfaceTextureListener(firstCamera));
- mTextureView1 = findViewById(R.id.surfaceView1);
- mTextureView1.setSurfaceTextureListener(new mSurfaceTextureListener(secondCamera));
-
- findViewById(R.id.cancel).setOnClickListener((View v) -> {
- videoLogList.add(new LogMsg("@cancel", mLog.v));
- stopRecordAndSaveLog(true);
- });
- findViewById(R.id.record).setOnClickListener((View v) -> {
- isRecordStart(false);
- });
- findViewById(R.id.setting).setOnClickListener((View v) -> {
- if (getSdCard && !isError) {
- videoLogList.add(new LogMsg("@dialog_setting", mLog.v));
- View view = LayoutInflater.from(this).inflate(R.layout.layout_setting, null);
- final AlertDialog dialog = new AlertDialog.Builder(this).setView(view).setCancelable(false).create();
- view.findViewById(R.id.dialog_button_1).setOnClickListener((View vs) -> { // reset
- videoLogList.add(new LogMsg("@setting_reset", mLog.v));
- setConfigFile(this, new File(getPath(), configName), view, true);
- getSetting(this, view.findViewById(R.id.dialog_editText_1), view.findViewById(R.id.dialog_editText_2),
- view.findViewById(R.id.dialog_editText_3), view.findViewById(R.id.dialog_editText_4));
- setSetting();
- });
- view.findViewById(R.id.dialog_button_2).setOnClickListener((View vs) -> { // cancel
- videoLogList.add(new LogMsg("@setting_cancel", mLog.v));
- dialog.dismiss();
- });
- view.findViewById(R.id.dialog_button_3).setOnClickListener((View vs) -> { // ok
- videoLogList.add(new LogMsg("@setting_ok", mLog.v));
- setConfigFile(this, new File(getPath(), configName), view, false);
- setSetting();
- dialog.dismiss();
- });
- getSetting(this, view.findViewById(R.id.dialog_editText_1), view.findViewById(R.id.dialog_editText_2),
- view.findViewById(R.id.dialog_editText_3), view.findViewById(R.id.dialog_editText_4));
- dialog.show();
- } else {
- showDialogLog();
- }
- });
- findViewById(R.id.loadingView).setVisibility(View.INVISIBLE);
- ((TextView) findViewById(R.id.record_status)).setText(getSDPath().equals("") ? "Error" : "Ready");
- firstFilePath = new ArrayList();
- secondFilePath = new ArrayList();
- videoLogList.add(new LogMsg("#initial complete", mLog.v));
- onRun = getIntent().getIntExtra(EXTRA_VIDEO_RUN, 0);
- onFail = getIntent().getIntExtra(EXTRA_VIDEO_FAIL, 0);
- onReset = getIntent().getIntExtra(EXTRA_VIDEO_RESET, 0);
- onSuccess = getIntent().getIntExtra(EXTRA_VIDEO_SUCCESS, 0);
- if (onReset != 0)
- videoLogList.add(new LogMsg("#noReset:" + onReset, mLog.v));
- extraRecordStatus = getIntent().getBooleanExtra(EXTRA_VIDEO_RECORD, false);
- // show DEMO
- demoHandler = new Handler() {
- public void handleMessage(android.os.Message msg) {
- this.post(() -> checkSdCardFromFileList());
- if (!extraRecordStatus) {
- this.post(() -> saveLog(getApplicationContext(), false, false));
- } else {
- isRecordStart(true);
- }
- }
- };
- this.registerReceiver(new BroadcastReceiver() {
-
- public void onReceive(Context context, Intent intent) {
- if (intent.getAction().equals(Intent.ACTION_BATTERY_CHANGED)) { //Battery
- videoLogList.add(new LogMsg("Battery:" + intent.getIntExtra("level", 0) + "%", mLog.e));
- new Handler().post(() -> saveLog(getApplicationContext(), false, false));
- }
- }
- }, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
- }
-
- private void setSetting() {
- if (!isRecord) {
- boolean[] check = checkConfigFile(this, new File(getPath(), configName), false);
- if (check[0]) {
- new Handler().post(() -> {
- mStateCallback0.onDisconnected(mCameraDevice0);
- mStateCallback1.onDisconnected(mCameraDevice1);
- openCamera(firstCamera);
- openCamera(secondCamera);
- });
- }
- if (check[1]) {
- try {
- try {
- SystemProperties.set(FRAMESKIP, FPS[0]);
- } catch (Exception e) {
- videoLogList.add(new LogMsg("PropertyUtils fail.", mLog.e));
- }
- if (isNew) {
- String getFrameSkip = PropertyUtils.get(FRAMESKIP);
- if (null != getFrameSkip) {
- if (isInteger(getFrameSkip, false)) {
- //if FrameSkip is change or LastCamera != CameraID, delay 3s to change camera devices
- SystemProperties.set(FRAMESKIP, FPS[isFrame]);
- videoLogList.add(new LogMsg("getFrameSkip:" + PropertyUtils.get(FRAMESKIP), mLog.e));
- } else {
- videoLogList.add(new LogMsg("getFrameSkip error, fs(" + getFrameSkip + ") is not integer.", mLog.e));
- }
- } else {
- videoLogList.add(new LogMsg("getFrameSkip error, fs == null.", mLog.e));
- }
- }
- ArrayList new_frame = new ArrayList();
- if (isNew) {
- for (String frame : new ArrayList<>(Arrays.asList( // or "3.9fps", "3.4fps", "1.7fps", "0.8fps"
- isNew ? NEW_FRAME_RATE : FRAME_RATE))) {
- View vi = LayoutInflater.from(this).inflate(R.layout.style_vertical_item, null);
- CustomTextView item = vi.findViewById(R.id.customTextView);
- item.setText(frame);
- new_frame.add(vi);
- }
- }
- ((VerticalViewPager) findViewById(R.id.pager1)).setAdapter(new mPagerAdapter(new_frame));
- } catch (Exception e) {
- e.getStackTrace();
- isError = true;
- videoLogList.add(new LogMsg("SystemProperties error.", mLog.e));
- new Handler().post(() -> saveLog(this, false, false));
- errorMessage = "SystemProperties error. Please check your BuildVersion is 0302.";
- }
- }
- } else {
- new Handler().post(() -> saveLog(getApplicationContext(), false, false));
- }
- }
-
- private void showDialogLog() {
- if (!isRecord) {
- videoLogList.add(new LogMsg("#dialog_log", mLog.v));
- View view = LayoutInflater.from(this).inflate(R.layout.layout_getlog, null);
- final AlertDialog dialog = new AlertDialog.Builder(this, android.R.style.Theme_Black_NoTitleBar_Fullscreen).setView(view).setCancelable(true).create();
-
- view.findViewById(R.id.dialog_button_2).setOnClickListener((View vs) -> { // ok
- videoLogList.add(new LogMsg("@log_ok", mLog.v));
- dialog.dismiss();
- });
- ArrayList list = new ArrayList();
- list.add("App Version:" + this.getString(R.string.app_name));
- if (getSdCard)
- list.add("Please check file at your SD card");
- else list.add(NO_SD_CARD);
- if (!fCamera) {
- list.add("Camera Access error, Please check camera " + firstCamera + ". <============ Crash here");
- if (firstCamera.equals("2"))
- list.add("You can try Reboot device to walk up external camera.");
- }
- if (!sCamera) {
- list.add("Camera Access error, Please check camera " + secondCamera + ". <============ Crash here");
- if (secondCamera.equals("2"))
- list.add("You can try Reboot device to walk up external camera.");
- }
- if (!errorMessage.equals(""))
- list.add(errorMessage);
- if (list.size() > 0) {
- ArrayList items = new ArrayList();
- for (String s : list) {
- View item_layout = LayoutInflater.from(this).inflate(R.layout.style_text_item, null);
- ((CustomTextView) item_layout.findViewById(R.id.customTextView)).setText(s);
- items.add(item_layout);
- }
- ((ListView) view.findViewById(R.id.dialog_listview)).setAdapter(new mListAdapter(items));
- ((ListView) view.findViewById(R.id.dialog_listview)).setSelection(items.size() - 1);
- }
- dialog.show();
- }
- }
-
- private void setLoading(boolean visible) {
- runOnUiThread(() -> findViewById(R.id.loadingView).setVisibility(visible ? View.VISIBLE : View.INVISIBLE));
- }
-
- private void takeRecord() {
- if (!isError && getSdCard) {
- videoLogList.add(new LogMsg("#------------------------------", mLog.v));
- videoLogList.add(new LogMsg("#takeRecord FrameRate:" +
- (isNew ? NEW_FRAME_RATE : FRAME_RATE)[isFrame], mLog.v));
- int delay = 0;
- if (!lastfirstCamera.equals(firstCamera) || !lastsecondCamera.equals(secondCamera)) {
- lastfirstCamera = firstCamera; // String
- lastsecondCamera = secondCamera;
- new Handler().post(() -> {
- mStateCallback0.onDisconnected(mCameraDevice0);
- mStateCallback1.onDisconnected(mCameraDevice1);
- openCamera(firstCamera);
- openCamera(secondCamera);
- });
- delay = 3000;
- }
-
- recordHandler0.obtainMessage().sendToTarget();
- recordHandler1.obtainMessage().sendToTarget();
- new Handler().postDelayed(() -> saveLog(getApplicationContext(), false, false), delay);
- } else {
- stopRecordAndSaveLog(false);
- showDialogLog();
- }
- }
-
- public static void saveLog(Context context, boolean reFormat, boolean kill) {
- if (!getSDPath().equals("")) {
- String version = context.getString(R.string.app_name);
- Intent intent = new Intent();
- intent.setClassName(context.getPackageName(), saveLogService.class.getName());
- intent.putExtra(EXTRA_VIDEO_VERSION, version);
- intent.putExtra(EXTRA_VIDEO_REFORMAT, reFormat);
- if (kill)
- intent.putExtra(EXTRA_MAIN_PID, android.os.Process.myPid());
- context.startService(intent);
- } else {
- isError = true;
- getSdCard = !getSDPath().equals("");
- if (kill)
- android.os.Process.killProcess(android.os.Process.myPid());
- }
- }
-
- protected void onDestroy() {
- super.onDestroy();
- isFinish = 0;
- if (mStateCallback0 != null) {
- mStateCallback0.onDisconnected(mCameraDevice0);
- mStateCallback0 = null;
- }
- if (mStateCallback1 != null) {
- mStateCallback1.onDisconnected(mCameraDevice1);
- mStateCallback1 = null;
- }
- closePreviewSession(firstCamera);
- closePreviewSession(secondCamera);
- try {
- if (mMediaRecorder0 != null) {
- mMediaRecorder0.stop();
- mMediaRecorder0.release();
- mMediaRecorder0 = null;
- videoLogList.add(new LogMsg("Record " + firstCamera + " finish."));
- }
- if (mMediaRecorder1 != null) {
- mMediaRecorder1.stop();
- mMediaRecorder1.release();
- mMediaRecorder1 = null;
- videoLogList.add(new LogMsg("Record " + secondCamera + " finish."));
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- new Handler().post(() -> stopRecordAndSaveLog(false));
- }
-
- private void openCamera(String cameraId) {
- CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
- Log.e(TAG, "openCamera E");
- try {
- /** cameraId
- * 0 = CameraCharacteristics.LENS_FACING_FRONT
- * 1 = CameraCharacteristics.LENS_FACING_BACK
- * 2 = CameraCharacteristics.LENS_FACING_EXTERNAL
- */
- Log.e(TAG, "camera ID: " + cameraId);
- Log.e(TAG, "number of camera: " + manager.getCameraIdList().length);
- if (isCameraOne(cameraId))
- mPreviewSize = manager.getCameraCharacteristics(cameraId)
- .get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP)
- .getOutputSizes(SurfaceTexture.class)[0];
- if (ActivityCompat.checkSelfPermission(this,
- Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
- return;
- }
- Log.e(TAG, "camera open");
- manager.openCamera(cameraId, isCameraOne(cameraId) ? mStateCallback0 : mStateCallback1, mainHandler);
- } catch (Exception e) {
- e.printStackTrace();
- isError = true;
- videoLogList.add(new LogMsg("Camera Access error, Please check camera " + cameraId + ". <============ Crash here", mLog.e));
- new Handler().post(() -> stopRecordAndSaveLog(false));
- errorMessage = "Camera Access error, Please check camera " + cameraId + ". <============ Crash here";
- ((TextView) findViewById(R.id.record_status)).setText("Error");
- if (cameraId.equals("2"))
- errorMessage += "\nYou can try Reboot device to walk up external camera.";
- }
- Log.e(TAG, "openCamera X");
- }
-
- private String getCodeDate(String CameraID) {
- return (isCameraOne(CameraID)) ? codeDate0 : codeDate1;
- }
-
- private void stopRecord(String date, String cameraID) {
- try {
- if (date.equals(getCodeDate(cameraID))) {
- isRun++;
- if (isCameraOne(cameraID))
- codeDate0 = getCalendarTime();
- else
- codeDate1 = getCalendarTime();
- if (isCameraOne(cameraID)) {
- if (mTimer != null) {
- mTimer.cancel();
- mTimer = null;
- }
- ((TextView) findViewById(R.id.record_status)).setText("Stop");
- videoLogList.add(new LogMsg("#stopRecord", mLog.v));
- Log.d(TAG, "stopRecord");
- } else
- moveFile(getPath() + logName, getSDPath() + logName, false);
-
- if (isCameraOne(cameraID)) {
- if (mMediaRecorder0 != null) {
- mMediaRecorder0.stop();
- mMediaRecorder0.release();
- mMediaRecorder0 = null;
- videoLogList.add(new LogMsg("Record " + firstCamera + " finish."));
- } else {
- videoLogList.add(new LogMsg("mMediaRecorder " + firstCamera + " is null."));
- }
- } else {
- if (mMediaRecorder1 != null) {
- mMediaRecorder1.stop();
- mMediaRecorder1.release();
- mMediaRecorder1 = null;
- videoLogList.add(new LogMsg("Record " + secondCamera + " finish."));
- } else {
- videoLogList.add(new LogMsg("mMediaRecorder " + secondCamera + " is null."));
- }
- }
- checkAndClear(cameraID);
- if (isFinish == 999 || isRun <= isFinish) {
- startRecord(cameraID);
- } else {
- isRecordStart(true);
- }
- if (isError || !getSdCard) {
- isRun = 0;
- isFinish = 0;
- isRecord = false;
- extraRecordStatus = false;
- ((TextView) findViewById(R.id.record_status)).setText("Error");
- }
- }
- } catch (Exception e) {
- e.printStackTrace();
- isError = true;
- videoLogList.add(new LogMsg("Camera " + cameraID + " stopRecord error. <============ Crash here", mLog.e));
- new Handler().post(() -> stopRecordAndSaveLog(false));
- errorMessage = "Camera " + cameraID + " stopRecord error. <============ Crash here";
- ((TextView) findViewById(R.id.record_status)).setText("Error");
- if (autoRestart) {
- final String dates = resetDate + "";
- final boolean records = extraRecordStatus;
- new Handler().postDelayed(() -> restartApp(dates, records), delayMillis);
- }
- }
- }
-
- private void stopRecord(boolean preview) {
- try {
- if (mTimer != null) {
- mTimer.cancel();
- mTimer = null;
- }
- codeDate0 = getCalendarTime();
- codeDate1 = getCalendarTime();
- moveFile(getPath() + logName, getSDPath() + logName, false);
- if (!isError && getSdCard) {
- ((TextView) findViewById(R.id.record_status)).setText("Stop");
- if (isRecord) {
- videoLogList.add(new LogMsg("#stopRecord", mLog.v));
- Log.d(TAG, "stopRecord");
- try {
- if (mMediaRecorder0 != null) {
- mMediaRecorder0.stop();
- mMediaRecorder0.release();
- mMediaRecorder0 = null;
- videoLogList.add(new LogMsg("Record " + firstCamera + " finish."));
- }
- } catch (Exception e) {
- videoLogList.add(new LogMsg("mMediaRecorder0 is error."));
- }
- try {
- if (mMediaRecorder1 != null) {
- mMediaRecorder1.stop();
- mMediaRecorder1.release();
- mMediaRecorder1 = null;
- videoLogList.add(new LogMsg("Record " + secondCamera + " finish."));
- }
- } catch (Exception e) {
- videoLogList.add(new LogMsg("mMediaRecorder1 is error."));
- }
- try {
- checkAndClear();
- } catch (Exception e) {
- videoLogList.add(new LogMsg("Check file is fail."));
- }
- isRun = 0;
- isFinish = 0;
- isRecord = false;
- extraRecordStatus = false;
- videoLogList.add(new LogMsg("#------------------------------", mLog.v));
- videoLogList.add(new LogMsg("#Complete"));
- ((TextView) findViewById(R.id.record_status)).setText("Complete");
- } else {
- isRun = 0;
- isFinish = 0;
- }
- end(preview);
- } else {
- ((TextView) findViewById(R.id.record_status)).setText("Error");
- }
- } catch (Exception e) {
- e.printStackTrace();
- isError = true;
- videoLogList.add(new LogMsg("stopRecord all camera error. <============ Crash here", mLog.e));
- new Handler().post(() -> stopRecordAndSaveLog(false));
- errorMessage = "stopRecord all camera error. <============ Crash here";
- ((TextView) findViewById(R.id.record_status)).setText("Error");
- if (autoRestart) {
- final String dates = resetDate + "";
- final boolean records = extraRecordStatus;
- new Handler().postDelayed(() -> restartApp(dates, records), delayMillis);
- }
- }
- }
-
- private void end(boolean preview) {
- new Handler().post(() -> saveLog(getApplicationContext(), false, false));
- if (preview) {
- takePreview();
- }
- }
-
- private void moveFile(String video, String pathname, boolean remove) {
- if (SD_Mode) {
- Context context = getApplicationContext();
- Intent intent = new Intent();
- intent.setClassName(context.getPackageName(), copyFileService.class.getName());
- intent.putExtra(EXTRA_VIDEO_COPY, video);
- intent.putExtra(EXTRA_VIDEO_PASTE, pathname);
- intent.putExtra(EXTRA_VIDEO_REMOVE, remove);
- context.startService(intent);
- }
- }
-
- private void checkFile(String path) {
- Context context = getApplicationContext();
- Intent intent = new Intent();
- intent.setClassName(context.getPackageName(), checkFileService.class.getName());
- intent.putExtra(EXTRA_VIDEO_PATH, path);
- context.startService(intent);
- }
-
- private void closePreviewSession(String cameraId) {
- if (isCameraOne(cameraId) && mPreviewSession0 != null) {
- mPreviewSession0.close();
- mPreviewSession0 = null;
- }
- if (!isCameraOne(cameraId) && mPreviewSession1 != null) {
- mPreviewSession1.close();
- mPreviewSession1 = null;
- }
- }
-
- private void startRecord(String cameraId) {
- if (!isError) {
- Log.d(TAG, "startRecord");
- try {
- if (isCameraOne(cameraId))
- codeDate0 = getCalendarTime();
- else
- codeDate1 = getCalendarTime();
-
- if (isCameraOne(cameraId)) {
- checkSdCardFromFileList();
- runOnUiThread(() -> {
- if (mTimer == null) {
- onFail = getFail();
- onRun = getIsRun();
- onSuccess = getSuccess();
- //タイマーの初期化処理
- timerTask = new mTimerTask();
- mLaptime = 0.0f;
- mTimer = new Timer(true);
- ((TextView) findViewById(R.id.record_timer)).setText("00");
- ((TextView) findViewById(R.id.record_status)).setText("Recording");
- }
- });
- }
- closePreviewSession(cameraId);
- SurfaceTexture texture = isCameraOne(cameraId) ? mTextureView0.getSurfaceTexture() : mTextureView1.getSurfaceTexture();
- if (null == texture) {
- Log.e(TAG, "texture is null, return");
- return;
- }
-
- texture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight());
- Surface surface = new Surface(texture);
- List surfaces = new ArrayList<>();
- CameraDevice mCameraDevice;
- CaptureRequest.Builder mPreviewBuilder;
- Surface recorderSurface;
- Handler backgroundHandler;
- if (isCameraOne(cameraId)) {
- backgroundHandler = backgroundHandler0;
- mCameraDevice = mCameraDevice0;
- mMediaRecorder0 = setUpMediaRecorder(firstCamera);
- mPreviewBuilder0 = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_RECORD);
- surfaces.add(surface);
- mPreviewBuilder0.addTarget(surface);
- recorderSurface = mMediaRecorder0.getSurface();
- surfaces.add(recorderSurface);
- mPreviewBuilder0.addTarget(recorderSurface);
- mPreviewBuilder = mPreviewBuilder0;
- } else {
- backgroundHandler = backgroundHandler1;
- mCameraDevice = mCameraDevice1;
- mMediaRecorder1 = setUpMediaRecorder(secondCamera);
- mPreviewBuilder1 = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_RECORD);
- surfaces.add(surface);
- mPreviewBuilder1.addTarget(surface);
- recorderSurface = mMediaRecorder1.getSurface();
- surfaces.add(recorderSurface);
- mPreviewBuilder1.addTarget(recorderSurface);
- mPreviewBuilder = mPreviewBuilder1;
- }
- // Start a capture session
- // Once the session starts, we can update the UI and start recording
- if (mPreviewBuilder != null) {
-
- try {
- mCameraDevice.createCaptureSession(surfaces,
- new CameraCaptureSession.StateCallback() {
-
- public void onConfigured(CameraCaptureSession session) {
- // 当摄像头已经准备好时,开始显示预览
- if (isCameraOne(cameraId)) {
- mPreviewSession0 = session;
- } else {
- mPreviewSession1 = session;
- }
- updatePreview(mPreviewBuilder, session, backgroundHandler);
-
- if (isCameraOne(cameraId)) {
- Message msg = stopRecordHandler0.obtainMessage();
- msg.arg1 = Integer.parseInt(cameraId);
- msg.obj = getCodeDate(cameraId);
- stopRecordHandler0.sendMessageDelayed(msg, delayTime);
- if (mMediaRecorder0 != null)
- mMediaRecorder0.start();
- mTimer.schedule(timerTask, 100, 100);
- } else {
- Message msg = stopRecordHandler1.obtainMessage();
- msg.arg1 = Integer.parseInt(cameraId);
- msg.obj = getCodeDate(cameraId);
- stopRecordHandler1.sendMessageDelayed(msg, delayTime + 500);
- if (mMediaRecorder1 != null)
- mMediaRecorder1.start();
- }
-
- }
-
- public void onConfigureFailed(CameraCaptureSession cameraCaptureSession) {
- videoLogList.add(new LogMsg("Camera " + cameraId + " Record onConfigureFailed.", mLog.e));
- new Handler().post(() -> saveLog(getApplicationContext(), false, false));
- }
- }, backgroundHandler);
- } catch (Exception e) {
- e.printStackTrace();
- isError = true;
- videoLogList.add(new LogMsg("Camera " + cameraId + " CameraCaptureSession.StateCallback() error. <============ Crash here", mLog.e));
- new Handler().post(() -> stopRecordAndSaveLog(false));
- errorMessage = "Camera " + cameraId + " startRecord error. <============ Crash here";
- ((TextView) findViewById(R.id.record_status)).setText("Error");
- if (autoRestart) {
- final String dates = resetDate + "";
- final boolean records = extraRecordStatus;
- new Handler().postDelayed(() -> restartApp(dates, records), delayMillis);
- }
- }
- } else {
- isError = true;
- videoLogList.add(new LogMsg("Camera " + cameraId + " mPreviewBuilder is null. <============ Crash here", mLog.e));
- new Handler().post(() -> stopRecordAndSaveLog(false));
- errorMessage = "Camera " + cameraId + " mPreviewBuilder is null. <============ Crash here";
- ((TextView) findViewById(R.id.record_status)).setText("Error");
- if (autoRestart) {
- final String dates = resetDate + "";
- final boolean records = extraRecordStatus;
- new Handler().postDelayed(() -> restartApp(dates, records), delayMillis);
- }
- }
- } catch (Exception e) {
- e.printStackTrace();
- isError = true;
- videoLogList.add(new LogMsg("Camera " + cameraId + " startRecord error. <============ Crash here", mLog.e));
- new Handler().post(() -> stopRecordAndSaveLog(false));
- errorMessage = "Camera " + cameraId + " startRecord error. <============ Crash here";
- ((TextView) findViewById(R.id.record_status)).setText("Error");
- if (autoRestart) {
- final String dates = resetDate + "";
- final boolean records = extraRecordStatus;
- new Handler().postDelayed(() -> restartApp(dates, records), delayMillis);
- }
- }
- }
- }
-
- private void checkSdCardFromFileList() {
- Context context = getApplicationContext();
- Intent intent = new Intent();
- intent.setClassName(context.getPackageName(), checkSdCardService.class.getName());
- context.startService(intent);
- }
-
- private void checkAndClear(String cameraID) {
- try {
- if (isRecord)
- for (String f : isCameraOne(cameraID) ? firstFilePath : secondFilePath)
- checkFile(f);
- } catch (Exception e) {
- videoLogList.add(new LogMsg("CheckFile " + cameraID + " error.", mLog.e));
- } finally {
- if (isCameraOne(cameraID))
- firstFilePath.clear();
- else
- secondFilePath.clear();
- }
- }
-
- private void checkAndClear() {
- for (String f : firstFilePath)
- checkFile(f);
- for (String s : secondFilePath)
- checkFile(s);
- firstFilePath.clear();
- secondFilePath.clear();
- }
-
- private MediaRecorder setUpMediaRecorder(String cameraId) {
- MediaRecorder mediaRecorder = null;
- try {
- /*TODO CamcorderProfile.QUALITY_HIGH:质量等级对应于最高可用分辨率*/// 1080p, 720p
- CamcorderProfile profile_720 = CamcorderProfile.get(CamcorderProfile.QUALITY_720P);
- CamcorderProfile profile_1080 = CamcorderProfile.get(CamcorderProfile.QUALITY_1080P);
- String file = "";
- if (!getSDPath().equals("")) {
- file = getSDPath() + getCalendarTime(isCameraOne(cameraId)) + ".mp4";
- videoLogList.add(new LogMsg("Create: " + file.split("/")[3], mLog.w));
-
- (isCameraOne(cameraId) ? firstFilePath : secondFilePath).add(file);
- if (isCameraOne(cameraId))
- firstFile = file + "";
- else
- secondFile = file + "";
- // Step 1: Unlock and set camera to MediaRecorder
- CamcorderProfile profile = isQuality == 1 ? profile_720 : profile_1080;
- mediaRecorder = new MediaRecorder();
- // Step 2: Set sources
- if (isCameraOne(cameraId))
- mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
- mediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
- mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
- if (isCameraOne(cameraId))
- mediaRecorder.setAudioEncoder(profile.audioCodec);
- mediaRecorder.setVideoEncoder(profile.videoCodec);
- mediaRecorder.setVideoSize(profile.videoFrameWidth, profile.videoFrameHeight);
- if (isCameraOne(cameraId))
- mediaRecorder.setAudioEncodingBitRate(profile.audioBitRate);
- mediaRecorder.setVideoEncodingBitRate((int) (profile.videoBitRate / 3.3));
- if (isCameraOne(cameraId)) {
- mediaRecorder.setAudioChannels(profile.audioChannels);
- mediaRecorder.setAudioSamplingRate(profile.audioSampleRate);
- }
- /*设置要捕获的视频的帧速率*/ // default is 24.6
- mediaRecorder.setVideoFrameRate(!isNew ? isFrame == 0 ? 10 : 28 : 27); // 1 -> 12fps, 10 -> 16fps
- // Step 4: Set output file
- mediaRecorder.setOutputFile(file);
- // Step 5: Prepare configured MediaRecorder
- mediaRecorder.prepare();
- } else {
- getSdCard = !getSDPath().equals("");
- isError = true;
- videoLogList.add(new LogMsg("MediaRecorder error. " + NO_SD_CARD + " <============ Crash here", mLog.e));
- new Handler().post(() -> stopRecordAndSaveLog(false));
- errorMessage = "MediaRecorder error. " + NO_SD_CARD + " <============ Crash here";
- ((TextView) findViewById(R.id.record_status)).setText("Error");
- return null;
- }
- } catch (Exception e) {
- e.printStackTrace();
- getSdCard = !getSDPath().equals("");
- isError = true;
- videoLogList.add(new LogMsg("MediaRecorder " + cameraId + " error. <============ Crash here", mLog.e));
- new Handler().post(() -> stopRecordAndSaveLog(false));
- errorMessage = "MediaRecorder " + cameraId + " error. <============ Crash here";
- ((TextView) findViewById(R.id.record_status)).setText("Error");
- if (getSdCard) {
- if (autoRestart) {
- final String dates = resetDate + "";
- final boolean records = extraRecordStatus;
- new Handler().postDelayed(() -> restartApp(dates, records), delayMillis);
- }
- } else {
- videoLogList.add(new LogMsg(NO_SD_CARD, mLog.e));
- }
- }
- return mediaRecorder;
- }
-
- private void takePreview() {
- takePreview(firstCamera);
- takePreview(secondCamera);
- }
-
- private void takePreview(String cameraId) {
- Log.d(TAG, "takePreview");
- videoLogList.add(new LogMsg("Preview " + cameraId + " Camera.", mLog.i));
- SurfaceTexture texture = null;
- try {
- texture = isCameraOne(cameraId) ? mTextureView0.getSurfaceTexture() : mTextureView1.getSurfaceTexture();
- } catch (Exception e) {
- e.printStackTrace();
- isError = true;
- videoLogList.add(new LogMsg("takePreview " + cameraId + " error. <============ Crash here", mLog.e));
- new Handler().post(() -> stopRecordAndSaveLog(false));
- errorMessage = "takePreview " + cameraId + " error. <============ Crash here";
- ((TextView) findViewById(R.id.record_status)).setText("Error");
- if (autoRestart) {
- final String dates = resetDate + "";
- final boolean records = extraRecordStatus;
- new Handler().postDelayed(() -> restartApp(dates, records), delayMillis);
- }
- }
- if (null != texture) {
- texture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight());
- Surface surface = new Surface(texture);
-
- CaptureRequest.Builder mPreviewBuilder;
- CameraDevice mCameraDevice;
- Handler backgroundHandler;
- if (isCameraOne(cameraId)) {
- backgroundHandler = backgroundHandler0;
- mCameraDevice = mCameraDevice0;
- } else {
- backgroundHandler = backgroundHandler1;
- mCameraDevice = mCameraDevice1;
- }
- if (!isError) {
- try {
- mPreviewBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
-
- mPreviewBuilder.addTarget(surface);
-
- // CaptureRequest.CONTROL_MODE
- mCameraDevice.createCaptureSession(Arrays.asList(surface),
- new CameraCaptureSession.StateCallback() {
-
- public void onConfigured(CameraCaptureSession session) {
- // 当摄像头已经准备好时,开始显示预览
- if (isCameraOne(cameraId)) {
- mPreviewSession0 = session;
- } else {
- mPreviewSession1 = session;
- }
- updatePreview(mPreviewBuilder, session, backgroundHandler);
- }
-
-
- public void onConfigureFailed(CameraCaptureSession session) {
- videoLogList.add(new LogMsg("Preview " + cameraId + " onConfigureFailed", mLog.e));
- }
- }, backgroundHandler);
- } catch (Exception e) {
- e.printStackTrace();
- isError = true;
- videoLogList.add(new LogMsg("Preview " + cameraId + " error.", mLog.e));
- new Handler().post(() -> stopRecordAndSaveLog(false));
- errorMessage = "Preview " + cameraId + " error.";
- ((TextView) findViewById(R.id.record_status)).setText("Error");
- if (autoRestart) {
- final String dates = resetDate + "";
- final boolean records = extraRecordStatus;
- new Handler().postDelayed(() -> restartApp(dates, records), delayMillis);
- }
- }
- }
- }
- }
-
- protected void updatePreview(CaptureRequest.Builder mPreviewBuilder, CameraCaptureSession mPreviewSession, Handler backgroundHandler) {
- mPreviewBuilder.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO);
- try {
- mPreviewSession.setRepeatingRequest(mPreviewBuilder.build(), null, backgroundHandler);
- } catch (Exception e) {
- e.printStackTrace();
- isError = true;
- videoLogList.add(new LogMsg("setCaptureRequest error.", mLog.e));
- new Handler().post(() -> stopRecordAndSaveLog(false));
- errorMessage = "setCaptureRequest error.";
- ((TextView) findViewById(R.id.record_status)).setText("Error");
- if (autoRestart) {
- final String dates = resetDate + "";
- final boolean records = extraRecordStatus;
- new Handler().postDelayed(() -> restartApp(dates, records), delayMillis);
- }
- }
- }
-
- private boolean isCameraOne(String cameraId) {
- return cameraId.equals(firstCamera);
- }
-
- private class mTimerTask extends TimerTask {
-
- public void run() {
- // mHandlerを通じてUI Threadへ処理をキューイング
- runOnUiThread(() -> {
- //実行間隔分を加算処理
- mLaptime += 0.1d;
- if (mLaptime >= 65) {
- isError = true;
- videoLogList.add(new LogMsg("Application has timed out.", mLog.w));
- new Handler().post(() -> stopRecordAndSaveLog(false));
- errorMessage = "Application has timed out.";
- new Handler().post(() -> ((TextView) findViewById(R.id.record_status)).setText("Error"));
- if (autoRestart) {
- final String dates = resetDate + "";
- final boolean records = extraRecordStatus;
- new Handler().postDelayed(() -> restartApp(dates, records), delayMillis);
- }
- }
- //計算にゆらぎがあるので小数点第1位で丸める
- BigDecimal bi = new BigDecimal(mLaptime);
- float outputValue = bi.setScale(1, BigDecimal.ROUND_HALF_UP).floatValue();
- //現在のLapTime
- ((TextView) findViewById(R.id.record_timer)).setText(Float.toString(outputValue));
- });
- }
- }
-
- private class mSurfaceTextureListener implements TextureView.SurfaceTextureListener {
- String CameraID;
-
- public mSurfaceTextureListener(String CameraID) {
- this.CameraID = CameraID;
- }
-
- public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
- openCamera(CameraID);
- }
-
- public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {
-
- }
-
- public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
- return false;
- }
-
- public void onSurfaceTextureUpdated(SurfaceTexture surface) {
-
- }
- }
-
- private class mOnPageChangeListener implements VerticalViewPager.OnPageChangeListener {
- int pos;
-
- public mOnPageChangeListener(int pos) {
- this.pos = pos;
- }
-
- public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
-
- }
-
- public void onPageSelected(int position) {
- switch (pos) {
- case 0:
- if (!isRecord) {
- isFrame = position;
- if (isNew) {
- setLoading(true);
- new Handler().post(() -> {
- String getFrameSkip = PropertyUtils.get(FRAMESKIP);
- if (null != getFrameSkip) {
- if (isInteger(getFrameSkip, false)) {
- //if frameskip is chehe or lastcamera != cameraid, delay 3s to change camera devices
- try {
- SystemProperties.set(FRAMESKIP, FPS[isFrame]);
- } catch (Exception e) {
- e.getStackTrace();
- isError = true;
- videoLogList.add(new LogMsg("SystemProperties error.", mLog.e));
- new Handler().post(() -> saveLog(getApplicationContext(), false, false));
- errorMessage = "SystemProperties error. Please check your BuildVersion is 0302.";
- }
- videoLogList.add(new LogMsg("getFrameSkip:" + PropertyUtils.get(FRAMESKIP), mLog.e));
- mStateCallback0.onDisconnected(mCameraDevice0);
- mStateCallback1.onDisconnected(mCameraDevice1);
- new Handler().post(() -> openCamera(firstCamera));
- new Handler().post(() -> openCamera(secondCamera));
- } else {
- videoLogList.add(new LogMsg("getFrameSkip error, fs(" + getFrameSkip + ") is not integer.", mLog.e));
- }
- } else {
- videoLogList.add(new LogMsg("getFrameSkip error, fs == null.", mLog.e));
- }
- setLoading(false);
- });
- }
- } else {
- ((VerticalViewPager) findViewById(R.id.pager1)).setCurrentItem(isFrame);
- }
- break;
- case 1:
- if (!isRecord) {
- isQuality = position;
- } else {
- ((VerticalViewPager) findViewById(R.id.pager2)).setCurrentItem(isQuality);
- }
- break;
- default:
- break;
- }
- }
-
- public void onPageScrollStateChanged(int state) {
-
- }
- }
-}
\ No newline at end of file
diff --git a/app/src/main/java/com/askey/record/checkFileService.java b/app/src/main/java/com/askey/record/checkFileService.java
deleted file mode 100644
index 77706c6..0000000
--- a/app/src/main/java/com/askey/record/checkFileService.java
+++ /dev/null
@@ -1,147 +0,0 @@
-package com.askey.record;
-
-import android.app.IntentService;
-import android.content.Intent;
-import android.media.MediaExtractor;
-import android.media.MediaFormat;
-
-import com.askey.widget.LogMsg;
-import com.askey.widget.mLog;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-
-import static com.askey.record.Utils.DFRAME_RATE;
-import static com.askey.record.Utils.EXTRA_VIDEO_PATH;
-import static com.askey.record.Utils.Fail;
-import static com.askey.record.Utils.NEW_DFRAME_RATE;
-import static com.askey.record.Utils.NO_SD_CARD;
-import static com.askey.record.Utils.Success;
-import static com.askey.record.Utils.getFail;
-import static com.askey.record.Utils.getReset;
-import static com.askey.record.Utils.getSDPath;
-import static com.askey.record.Utils.getSuccess;
-import static com.askey.record.Utils.isFrame;
-import static com.askey.record.Utils.isNew;
-import static com.askey.record.Utils.videoLogList;
-
-public class checkFileService extends IntentService {
- private String path;
-
- public checkFileService() {
- super("checkFileService");
- }
-
- public static int getFrameRate(File file) {
- int frameRate = 0;
- if (!getSDPath().equals("")) {
- try {
- MediaExtractor extractor = null;
- FileInputStream fis = null;
- try {
- extractor = new MediaExtractor();
- fis = new FileInputStream(file);
- extractor.setDataSource(fis.getFD());
- } catch (IOException e) {
- e.printStackTrace();
- if (null != videoLogList)
- videoLogList.add(new LogMsg("getFrameRate failed on MediaExtractor.<============ Crash here", mLog.e));
- return 0;
- }
- int numTracks = extractor.getTrackCount();
- for (int i = 0; i < numTracks; i++) {
- MediaFormat format = extractor.getTrackFormat(i);
- if (format.containsKey(MediaFormat.KEY_FRAME_RATE)) {
- frameRate = format.getInteger(MediaFormat.KEY_FRAME_RATE);
- }
- }
- if (extractor != null)
- extractor.release();
- if (fis != null)
- fis.close();
- } catch (Exception e) {
- e.printStackTrace();
- if (null != videoLogList)
- videoLogList.add(new LogMsg("getFrameRate failed.<============ Crash here", mLog.e));
- }
- } else {
- if (null != videoLogList)
- videoLogList.add(new LogMsg("getFrameRate failed " + NO_SD_CARD + ".", mLog.e));
- }
- return frameRate;
- }
-
- private void checkFile(String path) {
- try {
- File video = new File(path);
- int frameRate = 0;
-
- if (video.exists()) {
- try {
- frameRate = getFrameRate(video);
-
- } catch (Exception e) {
- e.printStackTrace();
- if (null != videoLogList)
- videoLogList.add(new LogMsg("CheckFile error.", mLog.e));
- }
- if (isNew) {
- boolean check = false;
- double[] range = isNew ? NEW_DFRAME_RATE : DFRAME_RATE;
- if (frameRate >= range[isFrame]) {
- if (frameRate <= range[isFrame] + 3) {
- check = true;
- }
- } else if (frameRate < range[isFrame]) {
- if (frameRate >= range[isFrame] - 3) {
- check = true;
- }
- }
- if (check) Success++;
- else Fail++;
- } else Success++;
- } else {
- Fail++;
- }
- if (null != videoLogList)
- videoLogList.add(new LogMsg("CheckFile: " + path.split("/")[3] + " frameRate:" + frameRate +
- " success:" + getSuccess() + " fail:" + getFail() + " reset:" + getReset(), mLog.i));
- } catch (Exception e) {
- e.printStackTrace();
- if (null != videoLogList)
- videoLogList.add(new LogMsg("CheckFile error.", mLog.e));
- Fail++;
- }
- }
-
- private void saveLog() {
- Intent intent = new Intent();
- intent.setClassName(this.getPackageName(), saveLogService.class.getName());
- startService(intent);
- }
-
- protected void onHandleIntent(Intent intent) {
- try {
- path = intent.getStringExtra(EXTRA_VIDEO_PATH);
-
- Thread t = new Thread(() -> {
-
- try {
- checkFile(path);
- saveLog();
- } catch (Exception e) {
- e.printStackTrace();
- }
- });
- t.start();
- t.join();
- } catch (Exception e) {
- e.printStackTrace();
- if (null != videoLogList)
- videoLogList.add(new LogMsg("CheckFileService error.", mLog.e));
- } finally {
- saveLog();
- }
- }
-}
\ No newline at end of file
diff --git a/app/src/main/java/com/askey/record/checkSdCardService.java b/app/src/main/java/com/askey/record/checkSdCardService.java
deleted file mode 100644
index 09414ea..0000000
--- a/app/src/main/java/com/askey/record/checkSdCardService.java
+++ /dev/null
@@ -1,158 +0,0 @@
-package com.askey.record;
-
-
-import android.app.IntentService;
-import android.content.Context;
-import android.content.Intent;
-import android.os.StatFs;
-
-import com.askey.widget.LogMsg;
-import com.askey.widget.mLog;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Arrays;
-
-import static com.askey.record.Utils.EXTRA_VIDEO_REFORMAT;
-import static com.askey.record.Utils.EXTRA_VIDEO_VERSION;
-import static com.askey.record.Utils.NO_SD_CARD;
-import static com.askey.record.Utils.errorMessage;
-import static com.askey.record.Utils.firstFile;
-import static com.askey.record.Utils.getSDPath;
-import static com.askey.record.Utils.getSdCard;
-import static com.askey.record.Utils.isError;
-import static com.askey.record.Utils.sdData;
-import static com.askey.record.Utils.secondFile;
-import static com.askey.record.Utils.videoLogList;
-
-public class checkSdCardService extends IntentService {
-
- public checkSdCardService() {
- // ActivityのstartService(intent);で呼び出されるコンストラクタはこちら
- super("checkSdCardService");
- }
-
- private void saveLog(Context context) {
- Intent intent = new Intent();
- intent.setClassName(context.getPackageName(), saveLogService.class.getName());
- intent.putExtra(EXTRA_VIDEO_VERSION, context.getString(R.string.app_name));
- intent.putExtra(EXTRA_VIDEO_REFORMAT, false);
- context.startService(intent);
- }
-
- private void checkSdCardFromFileList() {
- getSdCard = !getSDPath().equals("");
- if (getSdCard) {
- try {
- StatFs stat = new StatFs(getSDPath());
- long sdAvailSize = stat.getAvailableBlocksLong()
- * stat.getBlockSizeLong();
- double gigaAvailable = (sdAvailSize >> 30);
- if (gigaAvailable < sdData) {
- if (null != videoLogList) {
- videoLogList.add(new LogMsg("SD Card is Full."));
- }
- ArrayList tmp = new ArrayList();
- File[] fileList = new File(getSDPath()).listFiles();
- for (int i = 0; i < fileList.length; i++) {
- // Recursive call if it's a directory
- File file = fileList[i];
- if (!fileList[i].isDirectory()) {
- if (Utils.getFileExtension(file.toString()).equals("mp4"))
- if (!file.toString().equals(firstFile) || !file.toString().equals(secondFile))
- tmp.add(file.toString());
- }
- }
- if (tmp.size() >= 2) {
- Object[] list = tmp.toArray();
- Arrays.sort(list);
- delete((String) list[0], true);
- delete((String) list[1], true);
- checkSdCardFromFileList();
- }
- }
- } catch (Exception e) {
- e.printStackTrace();
- isError = true;
- getSdCard = !getSDPath().equals("");
- if (getSdCard) {
- if (null != videoLogList) {
- videoLogList.add(new LogMsg("#error: At least " + sdData + " memory needs to be available to record, please check the SD Card free space.", mLog.e));
- saveLog(this);
- }
- errorMessage = "error: At least " + sdData + " memory needs to be available to record, please check the SD Card free space.";
-// ((TextView) findViewById(R.id.record_status)).setText("Error");
- } else {
- if (null != videoLogList) {
- videoLogList.add(new LogMsg(NO_SD_CARD, mLog.e));
- saveLog(this);
- }
- errorMessage = NO_SD_CARD;
- }
- }
- } else {
- isError = true;
- if (null != videoLogList) {
- videoLogList.add(new LogMsg(NO_SD_CARD, mLog.e));
- saveLog(this);
- }
- errorMessage = NO_SD_CARD;
- }
- }
-
- private void delete(String path, boolean fromSDcard) {
- try {
- if (path != "") {
- File video = new File(path);
- if (video.exists()) {
- if (null != videoLogList)
- if (fromSDcard)
- videoLogList.add(new LogMsg("Delete: " + path.split("/")[3], mLog.w));
- else
- videoLogList.add(new LogMsg("Delete: " + path.split("/")[5], mLog.w));
- video.delete();
- } else {
- if (null != videoLogList)
- videoLogList.add(new LogMsg("Video not find.", mLog.e));
- }
- }
- } catch (Exception e) {
- e.printStackTrace();
- isError = true;
- getSdCard = !getSDPath().equals("");
- if (null != videoLogList) {
- videoLogList.add(new LogMsg("#delete " + path + " error. <============ Crash here", mLog.e));
- saveLog(this);
- }
- errorMessage = "Delete file error. <============ Crash here";
-// ((TextView) findViewById(R.id.record_status)).setText("Error");
- }
- }
-
- @Override
- protected void onHandleIntent(Intent intent) {
- try {
-
- Thread t = new Thread(() -> {
- try {
- checkSdCardFromFileList();
- } catch (Exception e) {
- e.printStackTrace();
- if (null != videoLogList) {
- videoLogList.add(new LogMsg("checkSdCardFromFileList error.", mLog.e));
- saveLog(this);
- }
- }
- });
- t.start();
- t.join();
- } catch (Exception e) {
- e.printStackTrace();
- if (null != videoLogList) {
- videoLogList.add(new LogMsg("CheckSdCardService error.", mLog.e));
- saveLog(this);
- }
- }
- }
-}
-
diff --git a/app/src/main/java/com/askey/record/copyFileService.java b/app/src/main/java/com/askey/record/copyFileService.java
deleted file mode 100644
index b025858..0000000
--- a/app/src/main/java/com/askey/record/copyFileService.java
+++ /dev/null
@@ -1,107 +0,0 @@
-package com.askey.record;
-
-import android.app.IntentService;
-import android.content.Intent;
-import android.util.Log;
-
-import com.askey.widget.LogMsg;
-import com.askey.widget.mLog;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-
-import static com.askey.record.Utils.EXTRA_VIDEO_COPY;
-import static com.askey.record.Utils.EXTRA_VIDEO_PASTE;
-import static com.askey.record.Utils.EXTRA_VIDEO_REMOVE;
-import static com.askey.record.Utils.errorMessage;
-import static com.askey.record.Utils.getSDPath;
-import static com.askey.record.Utils.isError;
-import static com.askey.record.Utils.videoLogList;
-
-public class copyFileService extends IntentService {
- String video;
- String pathname;
- boolean reomve;
-
- public copyFileService() {
- // ActivityのstartService(intent);で呼び出されるコンストラクタはこちら
- super("copyFileService");
- }
-
- public static void copy(String src, String dst, boolean remove) {
- try {
- File sf = new File(src);
- InputStream in = new FileInputStream(sf);
- try {
- OutputStream out = new FileOutputStream(dst);
- try {
- // Transfer bytes from in to out
- byte[] buf = new byte[1024];
- int len;
- while ((len = in.read(buf)) > 0) {
- out.write(buf, 0, len);
- }
- } catch (IOException | RuntimeException e) {
- e.printStackTrace();
- isError = true;
- errorMessage = "Copy file error. <============ Crash here";
- } finally {
- out.close();
- }
- } catch (Exception e) {
- e.printStackTrace();
- isError = true;
- errorMessage = "Copy file error. <============ Crash here";
- } finally {
- in.close();
- if (remove) sf.delete();
- }
- } catch (Exception e) {
- e.printStackTrace();
- isError = true;
- errorMessage = "Copy file error. <============ Crash here";
- if (null != videoLogList)
- videoLogList.add(new LogMsg("Copy file error", mLog.e));
- }
- }
-
-
- protected void onHandleIntent(Intent intent) {
- video = intent.getStringExtra(EXTRA_VIDEO_COPY);
- pathname = intent.getStringExtra(EXTRA_VIDEO_PASTE);
- reomve = intent.getBooleanExtra(EXTRA_VIDEO_REMOVE, false);
- // 非同期処理を行うメソッド。タスクはonHandleIntentメソッド内で実行する
- try {
- if (null != videoLogList)
- videoLogList.add(new LogMsg("#copy.", mLog.e));
- Log.d("IntentService", "onHandleIntent Start");
- Thread t = new Thread(() -> {
- try {
- if (!getSDPath().equals(""))
- copy(video, pathname, reomve);
- } catch (Exception e) {
- e.printStackTrace();
- isError = true;
- errorMessage = "Copy file error. <============ Crash here";
- if (null != videoLogList)
- videoLogList.add(new LogMsg("Copy file error", mLog.e));
- }
- });
- t.start();
- t.join();
- if (null != videoLogList)
- videoLogList.add(new LogMsg("copy successful.", mLog.e));
- } catch (Exception e) {
- e.printStackTrace();
- isError = true;
- errorMessage = "Copy file error. <============ Crash here";
- if (null != videoLogList)
- videoLogList.add(new LogMsg("Copy file error", mLog.e));
- }
- }
-}
-
diff --git a/app/src/main/java/com/askey/record/saveLogService.java b/app/src/main/java/com/askey/record/saveLogService.java
deleted file mode 100644
index 4ba553d..0000000
--- a/app/src/main/java/com/askey/record/saveLogService.java
+++ /dev/null
@@ -1,120 +0,0 @@
-package com.askey.record;
-
-
-import android.app.IntentService;
-import android.content.Context;
-import android.content.Intent;
-
-import com.askey.widget.LogMsg;
-import com.askey.widget.mLog;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.time.format.DateTimeFormatter;
-import java.util.ArrayList;
-
-import static com.askey.record.Utils.EXTRA_VIDEO_COPY;
-import static com.askey.record.Utils.EXTRA_VIDEO_PASTE;
-import static com.askey.record.Utils.EXTRA_VIDEO_REFORMAT;
-import static com.askey.record.Utils.EXTRA_VIDEO_REMOVE;
-import static com.askey.record.Utils.EXTRA_VIDEO_VERSION;
-import static com.askey.record.Utils.LOG_TITLE;
-import static com.askey.record.Utils.getPath;
-import static com.askey.record.Utils.getSDPath;
-import static com.askey.record.Utils.logName;
-import static com.askey.record.Utils.videoLogList;
-import static com.askey.record.VideoRecordActivity.SD_Mode;
-import static com.askey.record.restartActivity.EXTRA_MAIN_PID;
-
-public class saveLogService extends IntentService {
- private String version;
- private boolean reFormat;
-
- public saveLogService() {
- // ActivityのstartService(intent);で呼び出されるコンストラクタはこちら
- super("saveLogService");
- }
-
- private void saveLog(ArrayList mLogList, boolean reFormat, boolean move) {
- String logString;
-
- File file = new File(getPath(), logName);
- if (!file.exists()) {
- logString = LOG_TITLE + version + "\r\n";
- try {
- file.createNewFile();
- mLogList.add(new LogMsg("Create the log file.", mLog.w));
- } catch (Exception e) {
- e.printStackTrace();
- }
- } else {
- logString = "";
- }
-
- for (LogMsg logs : mLogList) {
- String time = logs.time.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))
- + " run:" + logs.runTime + " -> ";
- logString += (time + logs.msg + "\r\n");
- }
- try {
- FileOutputStream output = new FileOutputStream(file, !reFormat);
- output.write(logString.getBytes());
- output.close();
- mLogList.clear();
-
- } catch (Exception e) {
- e.printStackTrace();
- }
- if(SD_Mode) {
- if (move)
- try {
- Thread tMove = new Thread(() -> {
- moveFile(getPath() + logName, getSDPath() + logName, false);
- });
- tMove.start();
- tMove.join();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
-
- private void moveFile(String video, String pathname, boolean remove) {
- Context context = getApplicationContext();
- Intent intent = new Intent();
- intent.setClassName(context.getPackageName(), copyFileService.class.getName());
- intent.putExtra(EXTRA_VIDEO_COPY, video);
- intent.putExtra(EXTRA_VIDEO_PASTE, pathname);
- intent.putExtra(EXTRA_VIDEO_REMOVE, remove);
- context.startService(intent);
- }
-
-
- protected void onHandleIntent(Intent intent) {
- int mainPid = 0;
- try {
- mainPid = intent.getIntExtra(EXTRA_MAIN_PID, -1);
- version = intent.getStringExtra(EXTRA_VIDEO_VERSION);
- reFormat = intent.getBooleanExtra(EXTRA_VIDEO_REFORMAT, false);
-
- int finalMainPid = mainPid;
- Thread t = new Thread(() -> {
- final boolean move = finalMainPid > 0;
- try {
- saveLog(videoLogList, reFormat, move);
- } catch (Exception e) {
- e.printStackTrace();
- }
- });
- t.start();
- t.join();
- } catch (Exception e) {
- e.printStackTrace();
- if (null != videoLogList)
- videoLogList.add(new LogMsg("SaveLogService error.", mLog.e));
- } finally {
- if (mainPid > 0) android.os.Process.killProcess(mainPid);
- }
- }
-}
-
diff --git a/app/src/main/java/com/askey/widget/CommandUtil.java b/app/src/main/java/com/askey/widget/CommandUtil.java
deleted file mode 100644
index 5e9732d..0000000
--- a/app/src/main/java/com/askey/widget/CommandUtil.java
+++ /dev/null
@@ -1,162 +0,0 @@
-package com.askey.widget;
-
-import java.io.BufferedReader;
-import java.io.DataOutputStream;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.util.ArrayList;
-import java.util.List;
-
-public class CommandUtil {
-
- // public static final String TAG = CommandUtil.class.getSimpleName();
- public static final String COMMAND_SH = "sh";
- public static final String COMMAND_SU = "su";
- public static final String COMMAND_LINE_END = "\n";
- public static final String COMMAND_EXIT = "exit\n";
- private static final boolean ISDEBUG = true;
-
- /**
- * 執行單條命令
- *
- * @param command
- * @return
- */
- public static List execute(String command) {
- //CommandUtil.execute("getprop " + FRAMESKIP).get(0);
- return execute(new String[]{command});
- }
-
- /**
- * 可執行多行命令(bat)
- *
- * @param commands
- * @return
- */
- public static List execute(String[] commands) {
- List results = new ArrayList();
- int status = -1;
- if (commands == null || commands.length == 0) {
- return null;
- }
-// debug("execute command start : " + commands);
- Process process = null;
- BufferedReader successReader = null;
- BufferedReader errorReader = null;
- StringBuilder errorMsg = null;
-
- DataOutputStream dos = null;
- try {
- // TODO
- process = Runtime.getRuntime().exec(COMMAND_SH);
- dos = new DataOutputStream(process.getOutputStream());
- for (String command : commands) {
- if (command == null) {
- continue;
- }
- dos.write(command.getBytes());
- dos.writeBytes(COMMAND_LINE_END);
- dos.flush();
- }
- dos.writeBytes(COMMAND_EXIT);
- dos.flush();
-
- status = process.waitFor();
-
- errorMsg = new StringBuilder();
- successReader = new BufferedReader(new InputStreamReader(
- process.getInputStream()));
- errorReader = new BufferedReader(new InputStreamReader(
- process.getErrorStream()));
- String lineStr;
- while ((lineStr = successReader.readLine()) != null) {
- results.add(lineStr);
-// debug(" command line item : " + lineStr);
- }
- while ((lineStr = errorReader.readLine()) != null) {
- errorMsg.append(lineStr);
- }
-
- } catch (IOException e) {
- e.printStackTrace();
- } catch (Exception e) {
- e.printStackTrace();
- } finally {
- try {
- if (dos != null) {
- dos.close();
- }
- if (successReader != null) {
- successReader.close();
- }
- if (errorReader != null) {
- errorReader.close();
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
-
- if (process != null) {
- process.destroy();
- }
- }
-// debug(String.format(Locale.CHINA,
-// "execute command end,errorMsg:%s,and status %d: ", errorMsg,
-// status));
- return results;
- }
-
- public static void executed(String command) {
- //CommandUtil.executed("setprop " + FRAMESKIP + " 0");
- executed(new String[]{command});
- }
-
- public static void executed(String[] commands) {
- Process process = null;
- DataOutputStream dos = null;
- try {
- // TODO
- process = Runtime.getRuntime().exec(COMMAND_SH);
- dos = new DataOutputStream(process.getOutputStream());
- for (String command : commands) {
- if (command == null) {
- continue;
- }
- dos.write(command.getBytes());
- dos.writeBytes(COMMAND_LINE_END);
- dos.flush();
- }
- dos.writeBytes(COMMAND_EXIT);
- dos.flush();
-
- } catch (IOException e) {
- e.printStackTrace();
- } catch (Exception e) {
- e.printStackTrace();
- } finally {
- try {
- if (dos != null) {
- dos.close();
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
-
- if (process != null) {
- process.destroy();
- }
- }
- }
-
-// /**
-// * DEBUG LOG
-// *
-// * @param message
-// */
-// private static void debug(String message) {
-// if (ISDEBUG) {
-// Log.d(TAG, message);
-// }
-// }
-
-}
\ No newline at end of file
diff --git a/app/src/main/java/com/askey/widget/CustomPageTransformer.java b/app/src/main/java/com/askey/widget/CustomPageTransformer.java
deleted file mode 100644
index 0924686..0000000
--- a/app/src/main/java/com/askey/widget/CustomPageTransformer.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package com.askey.widget;
-
-import android.view.View;
-
-import com.askey.record.R;
-
-public class CustomPageTransformer implements VerticalViewPager.PageTransformer {
- @Override
- public void transformPage(View view, float position) {
- int pageWidth = view.getWidth();
- int pageHeight = view.getHeight();
- float dafTranslation = 0;
- float xPosition = pageWidth * -position;
- view.setTranslationX(xPosition);
- float yPosition = position * pageHeight - dafTranslation;
- view.setTranslationY(yPosition);
- CustomTextView item_timezone = view.findViewById(R.id.customTextView);
- item_timezone.setTextColor(view.getResources().getColor(R.color.gray_dark));
- item_timezone.setTranslationX(dafTranslation * 1.5f);
- if (position < 0) {
- view.setAlpha(1f + 0.3f * position);
- item_timezone.setScaleX(0.2f * position + 1);
- } else if (position < 1) {
- view.setAlpha(1f - 0.3f * position);
- item_timezone.setScaleX(-0.2f * position + 1);
- item_timezone.setTextColor(view.getResources().getColor(R.color.orange));
- } else {
- view.setAlpha(1f - 0.3f * position);
- item_timezone.setScaleX(-0.2f * position + 1);
- }
- }
-}
diff --git a/app/src/main/java/com/askey/widget/LogMsg.java b/app/src/main/java/com/askey/widget/LogMsg.java
deleted file mode 100644
index 6450693..0000000
--- a/app/src/main/java/com/askey/widget/LogMsg.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package com.askey.widget;
-
-import com.askey.record.Utils;
-
-import java.time.LocalDateTime;
-
-public class LogMsg {
- public int runTime;
- public LocalDateTime time;
- public String msg;
- public mLog type;
-
- public LogMsg(String msg) {
- this.runTime = Utils.getIsRun();
- this.time = LocalDateTime.now();
- this.msg = msg;
- this.type = mLog.d;
- }
-
- public LogMsg(String msg, mLog type) {
- this.runTime = Utils.getIsRun();
- this.time = LocalDateTime.now();
- this.msg = msg;
- this.type = type;
- }
-}
diff --git a/app/src/main/java/com/askey/widget/PropertyUtils.java b/app/src/main/java/com/askey/widget/PropertyUtils.java
deleted file mode 100755
index 812c4c4..0000000
--- a/app/src/main/java/com/askey/widget/PropertyUtils.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package com.askey.widget;
-
-import java.lang.reflect.Method;
-
-public class PropertyUtils {
- //Use the reflection invoke SystemProperites.
- //https://gist.github.com/crossle/5046538
- public static String get(String key) {
- String value = "";
- try {
- Class> c = Class.forName("android.os.SystemProperties");
- Method get = c.getMethod("get", String.class, String.class);
- value = (String) (get.invoke(c, key, "unknown"));
- } catch (Exception e) {
- e.printStackTrace();
- } finally {
- return value;
- }
- }
-
- public static void set(String key, String value) {
- try {
- Class> c = Class.forName("android.os.SystemProperties");
- Method set = c.getMethod("set", String.class, String.class);
- set.invoke(c, key, value);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
-}
diff --git a/app/src/main/java/com/askey/widget/VerticalPageTransformer.java b/app/src/main/java/com/askey/widget/VerticalPageTransformer.java
deleted file mode 100755
index 3dfca6e..0000000
--- a/app/src/main/java/com/askey/widget/VerticalPageTransformer.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package com.askey.widget;
-
-import android.view.View;
-
-import com.askey.record.R;
-
-public class VerticalPageTransformer implements VerticalViewPager.PageTransformer {
- @Override
- public void transformPage(View view, float position) {
- int pageWidth = view.getWidth();
- int pageHeight = view.getHeight();
- CustomTextView customTextView = view.findViewById(R.id.customTextView);
- customTextView.setTextColor(view.getResources().getColor(R.color.gray_dark));
- int width = customTextView.getText().toString().length();
- float dafTranslation = 0;
- float xPosition = pageWidth * -position + dafTranslation * (width == 2 ? 2f : width == 3 ? 1.6f : 1);
- float yPosition = position * pageHeight;
- view.setTranslationX(xPosition);
- view.setTranslationY(yPosition);
- if (position < 0) {
- view.setAlpha(1f + 0.5f * position);
- view.setScaleX(0.2f * position + 1);
- } else if (position < 1) {
- view.setAlpha(1f - 0.5f * position);
- view.setScaleX(-0.2f * position + 1);
- customTextView.setTextColor(view.getResources().getColor(R.color.orange));
- } else {
- view.setAlpha(1f - 0.5f * position);
- view.setScaleX(-0.2f * position + 1);
- }
- }
-}
\ No newline at end of file
diff --git a/app/src/main/java/com/askey/widget/VerticalPagerContainer.java b/app/src/main/java/com/askey/widget/VerticalPagerContainer.java
deleted file mode 100755
index 7a8263d..0000000
--- a/app/src/main/java/com/askey/widget/VerticalPagerContainer.java
+++ /dev/null
@@ -1,90 +0,0 @@
-package com.askey.widget;
-
-import android.content.Context;
-import android.graphics.Point;
-import android.util.AttributeSet;
-import android.view.MotionEvent;
-import android.view.View;
-import android.widget.FrameLayout;
-
-public class VerticalPagerContainer extends FrameLayout implements VerticalViewPager.OnPageChangeListener {
-
- boolean mNeedsRedraw = false;
- private VerticalViewPager mPager;
- private Point mCenter = new Point();
- private Point mInitialTouch = new Point();
-
- public VerticalPagerContainer(Context context) {
- super(context);
- init();
- }
-
- public VerticalPagerContainer(Context context, AttributeSet attrs) {
- super(context, attrs);
- init();
- }
-
- public VerticalPagerContainer(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
- init();
- }
-
- private void init() {
- //Disable clipping of children so non-selected pages are visible
- setClipChildren(false);
- setLayerType(View.LAYER_TYPE_SOFTWARE, null);
- }
-
- @Override
- protected void onFinishInflate() {
- super.onFinishInflate();
- try {
- mPager = (VerticalViewPager) getChildAt(0);
- mPager.setOnPageChangeListener(this);
- } catch (Exception e) {
- throw new IllegalStateException("The root child of PagerContainer must be a ViewPager");
- }
- }
-
- public VerticalViewPager getViewPager() {
- return mPager;
- }
-
- @Override
- protected void onSizeChanged(int w, int h, int oldw, int oldh) {
- mCenter.x = w / 2;
- mCenter.y = h / 2;
- }
-
- @Override
- public boolean onTouchEvent(MotionEvent ev) {
- //We capture any touches not already handled by the ViewPager
- // to implement scrolling from a touch outside the pager bounds.
- switch (ev.getAction()) {
- case MotionEvent.ACTION_DOWN:
- mInitialTouch.x = (int) ev.getX();
- mInitialTouch.y = (int) ev.getY();
- default:
- ev.offsetLocation(mCenter.x - mInitialTouch.x, mCenter.y - mInitialTouch.y);
- break;
- }
-
- return mPager.dispatchTouchEvent(ev);
- }
-
- @Override
- public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
- //Force the container to redraw on scrolling.
- //Without this the outer pages render initially and then stay static
- if (mNeedsRedraw) invalidate();
- }
-
- @Override
- public void onPageSelected(int position) {
- }
-
- @Override
- public void onPageScrollStateChanged(int state) {
- mNeedsRedraw = (state != VerticalViewPager.SCROLL_STATE_IDLE);
- }
-}
\ No newline at end of file
diff --git a/app/src/main/java/com/askey/widget/VerticalViewPager.java b/app/src/main/java/com/askey/widget/VerticalViewPager.java
deleted file mode 100755
index 07d3932..0000000
--- a/app/src/main/java/com/askey/widget/VerticalViewPager.java
+++ /dev/null
@@ -1,61 +0,0 @@
-package com.askey.widget;
-
-import android.content.Context;
-import android.support.v4.view.ViewPager;
-import android.util.AttributeSet;
-import android.view.MotionEvent;
-import android.view.View;
-
-public class VerticalViewPager extends ViewPager {
- public VerticalViewPager(Context context) {
- super(context);
- init();
- }
-
- public VerticalViewPager(Context context, AttributeSet attrs) {
- super(context, attrs);
- init();
- }
-
- /**
- * @return {@code false} since a vertical view pager can never be scrolled horizontally
- */
- @Override
- public boolean canScrollHorizontally(int direction) {
- return false;
- }
-
- /**
- * @return {@code true} if a normal view pager would support horizontal scrolling at this time
- */
- @Override
- public boolean canScrollVertically(int direction) {
- return super.canScrollHorizontally(direction);
- }
-
- private void init() {
- // Make page transit vertical
- setPageTransformer(true, new VerticalPageTransformer());
- // Get rid of the overscroll drawing that happens on the left and right (the ripple)
- setOverScrollMode(View.OVER_SCROLL_NEVER);
- }
-
- @Override
- public boolean onInterceptTouchEvent(MotionEvent ev) {
- return super.onInterceptTouchEvent(flipXY(ev));
- }
-
- @Override
- public boolean onTouchEvent(MotionEvent ev) {
- return super.onTouchEvent(flipXY(ev));
- }
-
- private MotionEvent flipXY(MotionEvent ev) {
- final float width = getWidth();
- final float height = getHeight();
- final float x = (ev.getY() / height) * width;
- final float y = (ev.getX() / width) * height;
- ev.setLocation(x, y);
- return ev;
- }
-}
diff --git a/app/src/main/java/com/askey/widget/ViewHolder.java b/app/src/main/java/com/askey/widget/ViewHolder.java
deleted file mode 100644
index 214b64d..0000000
--- a/app/src/main/java/com/askey/widget/ViewHolder.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package com.askey.widget;
-
-import android.widget.TextView;
-
-public class ViewHolder {
- TextView tv;
-}
diff --git a/app/src/main/java/com/askey/widget/mLogListAdapter.java b/app/src/main/java/com/askey/widget/mLogListAdapter.java
deleted file mode 100644
index ed6631b..0000000
--- a/app/src/main/java/com/askey/widget/mLogListAdapter.java
+++ /dev/null
@@ -1,58 +0,0 @@
-package com.askey.widget;
-
-import android.content.Context;
-import android.graphics.Color;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.BaseAdapter;
-
-import com.askey.record.R;
-
-import java.time.format.DateTimeFormatter;
-import java.util.ArrayList;
-
-public class mLogListAdapter extends BaseAdapter {
-
- private LayoutInflater inflater;
- private ArrayList arrayList;
-
- public mLogListAdapter(Context context, ArrayList arrayList) {
- this.arrayList = arrayList;
- inflater = LayoutInflater.from(context);
- }
-
- public int getCount() {
- return arrayList.size();
- }
-
- public Object getItem(int position) {
- return position;
- }
-
- public long getItemId(int position) {
- return position;
- }
-
- public View getView(int position, View convertView, ViewGroup parent) {
- ViewHolder holder;
- if (convertView == null) {
- convertView = inflater.inflate(R.layout.style_text_item, null);
- holder = new ViewHolder();
- holder.tv = convertView.findViewById(R.id.customTextView);
- convertView.setTag(holder);
- } else {
- holder = (ViewHolder) convertView.getTag();
- }
- if (arrayList.size() > 0) {
- LogMsg log = arrayList.get(position);
- String time = log.time.format(DateTimeFormatter.ofPattern("HH:mm:ss")) + " ";
- holder.tv.setText(time + log.msg);
- mLog type = log.type;
- int color = type == mLog.v ? Color.BLACK : type == mLog.d ? Color.BLUE :
- type == mLog.i ? Color.GREEN : type == mLog.w ? Color.YELLOW : Color.RED;
- holder.tv.setTextColor(color);
- }
- return convertView;
- }
-}
diff --git a/app/src/main/java/com/askey/widget/mPagerAdapter.java b/app/src/main/java/com/askey/widget/mPagerAdapter.java
deleted file mode 100644
index 721cdd1..0000000
--- a/app/src/main/java/com/askey/widget/mPagerAdapter.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package com.askey.widget;
-
-import android.support.v4.view.PagerAdapter;
-import android.view.View;
-import android.view.ViewGroup;
-
-import java.util.ArrayList;
-
-public class mPagerAdapter extends PagerAdapter {
-
- ArrayList viewList;
-
- public mPagerAdapter(ArrayList viewList) {
- this.viewList = viewList;
- }
-
- public int getCount() {
- return viewList.size();
- }
-
- public Object instantiateItem(ViewGroup container, int position) {
- container.addView(viewList.get(position));
- return viewList.get(position);
- }
-
- public boolean isViewFromObject(View view, Object object) {
- return view == object;
- }
-
- public void destroyItem(ViewGroup container, int position, Object object) {
- container.removeView((View) object);
- }
-}
\ No newline at end of file
diff --git a/app/src/main/java/com/d160/thermal/CameraActivity.java b/app/src/main/java/com/d160/thermal/CameraActivity.java
new file mode 100644
index 0000000..33e0d33
--- /dev/null
+++ b/app/src/main/java/com/d160/thermal/CameraActivity.java
@@ -0,0 +1,19 @@
+package com.d160.thermal;
+
+import android.os.Bundle;
+
+import androidx.appcompat.app.AppCompatActivity;
+
+public class CameraActivity extends AppCompatActivity {
+
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_camera);
+ if (null == savedInstanceState) {
+ getSupportFragmentManager().beginTransaction()
+ .replace(R.id.container, CameraFragment.newInstance())
+ .commit();
+ }
+ }
+
+}
diff --git a/app/src/main/java/com/d160/thermal/CameraFragment.java b/app/src/main/java/com/d160/thermal/CameraFragment.java
new file mode 100644
index 0000000..7b7830d
--- /dev/null
+++ b/app/src/main/java/com/d160/thermal/CameraFragment.java
@@ -0,0 +1,1186 @@
+package com.d160.thermal;
+
+import static java.lang.System.gc;
+import static android.os.Looper.getMainLooper;
+import static com.d160.thermal.Utils.*;
+
+import android.*;
+import android.annotation.*;
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.content.*;
+import android.content.pm.*;
+import android.graphics.*;
+import android.hardware.camera2.*;
+import android.media.*;
+import android.os.*;
+import android.util.*;
+import android.view.*;
+import android.widget.*;
+
+import androidx.annotation.NonNull;
+import androidx.core.app.*;
+import androidx.core.content.*;
+import androidx.fragment.app.*;
+
+import com.d160.view.*;
+
+import java.io.*;
+import java.math.*;
+import java.time.format.*;
+import java.util.*;
+import java.util.concurrent.atomic.*;
+
+public class CameraFragment extends Fragment {
+
+ public static final String TAG = "com.d160.thermal";
+ public static final String firstCamera = "0", secondCamera = "1", thirdCamera = "2";
+ public static final int delay_3 = 3000, delay_60 = 60600;
+ //-------------------------------------------------------------------------------
+ public static final boolean Open_f_Camera = true, Open_s_Camera = true, Open_t_Camera = false;
+ public static final boolean Open_Audio = true;
+ //TODO 是否啟用keepScreen
+ public static boolean keepScreen = true;
+ //TODO 是否啟用preview
+ public static boolean preview = false;
+ //TODO 是否使用SD_Mode
+ public static boolean SD_Mode = true;
+ //TODO 是否啟用onPause
+ public static boolean autoPause = true;
+ //TODO 是否啟用重啟功能
+ public static boolean autoRestart = true;
+ //TODO 是否啟用60s停止錄影
+ public static boolean autoStopRecord = true;
+ //-------------------------------------------------------------------------------
+ public static boolean extraRecordStatus = true, onRestart = false;
+ public static int onRun = 0, onSuccess = 0, onFail = 0, onReset = 0;
+ //-------------------------------------------------------------------------------
+ private BroadcastReceiver mBroadcastReceiver;
+ private Handler mainHandler, resetHandler;
+ private Size mPreviewSize = null;
+ private HomeListen home;
+ private mTimerTask timerTask = null;
+ private Timer mTimer = null;
+ private float value = 0.0f;
+
+ public static CameraFragment newInstance() {
+ return new CameraFragment();
+ }
+
+ public static void checkFile(String path) {
+ try {
+ File video = new File(path);
+ int frameRate = 0;
+ if (video.exists()) {
+ try {
+ frameRate = getFrameRate(video);
+ } catch (Exception ignored) {
+ if (null != videoLogList)
+ videoLogList.add(new mLogMsg("CheckFile error.", mLog.e));
+ }
+ if (frameRate != 0) Success++;
+ else Fail++;
+ } else {
+ Fail++;
+ }
+ if (null != videoLogList) {
+ videoLogList.add(new mLogMsg("CheckFile:(" + path.split("/")[3] +
+ ") video_frameRate:(" + frameRate + ") video_success/fail:(" + getSuccess() + "/" + getFail() +
+ ") app_reset:(" + getReset() + ")", mLog.i));
+ Log.e(TAG, "CheckFile:(video_frameRate:(" + frameRate + ") video_success/fail:(" + getSuccess() + "/" + getFail() +
+ ") app_reset:(" + getReset() + ")");
+ }
+ } catch (Exception ignored) {
+ if (null != videoLogList)
+ videoLogList.add(new mLogMsg("CheckFile error.", mLog.e));
+ Fail++;
+ }
+ }
+
+ private static int getFrameRate(File file) {
+ int frameRate = 0;
+ if (!getSDPath().equals("")) {
+ try {
+ MediaExtractor extractor;
+ FileInputStream fis;
+ try {
+ fis = new FileInputStream(file);
+ extractor = new MediaExtractor();
+ extractor.setDataSource(fis.getFD());
+ } catch (Exception e) {
+ e.printStackTrace();
+ videoLogList.add(new mLogMsg("getFrameRate failed on MediaExtractor.<============ Crash here", mLog.e));
+ return 0;
+ }
+ int numTracks = extractor.getTrackCount();
+ for (int i = 0; i < numTracks; i++) {
+ MediaFormat format = extractor.getTrackFormat(i);
+ if (format.containsKey(MediaFormat.KEY_FRAME_RATE)) {
+ try {
+ frameRate = format.getInteger(MediaFormat.KEY_FRAME_RATE);
+ } catch (Exception e) {
+ e.printStackTrace();
+ videoLogList.add(new mLogMsg("getFrameRate failed on MediaExtractor.<============ Crash here", mLog.e));
+ }
+ }
+ }
+ extractor.release();
+ fis.close();
+ } catch (Exception e) {
+ e.printStackTrace();
+ videoLogList.add(new mLogMsg("getFrameRate failed.<============ Crash here", mLog.e));
+ }
+ } else {
+ videoLogList.add(new mLogMsg("getFrameRate failed " + NO_SD_CARD + ".", mLog.e));
+ }
+ return frameRate;
+ }
+
+ public static void saveLog(Context context, boolean reFormat, boolean kill) {
+ if (null != videoLogList)
+ if (!getSDPath().equals("")) {
+ String version = context.getString(R.string.app_name);
+ StringBuilder logString;
+ assert videoLogList != null;
+ File file = new File(getPath(), logName);
+ if (!file.exists()) {
+ logString = new StringBuilder(LOG_TITLE + version + "\r\n");
+ try {
+ boolean create = file.createNewFile();
+ if (null != videoLogList) {
+ if (!create)
+ videoLogList.add(new mLogMsg("Create file failed.", mLog.w));
+ else
+ videoLogList.add(new mLogMsg("Create the log file.", mLog.w));
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ if (null != videoLogList)
+ videoLogList.add(new mLogMsg("Create file failed.", mLog.w));
+ }
+ } else {
+ logString = new StringBuilder();
+ }
+ if (null != videoLogList)
+ try {
+ for (mLogMsg logs : videoLogList) {
+ // ex: 2020-03-25 19:46:55 run:0 -> logs.msg
+ String time = logs.date.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))
+ + " run:" + logs.run + " -> ";
+ logString.append(time).append(logs.msg).append("\r\n");
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ try {
+ FileOutputStream output = new FileOutputStream(new File(getLogPath(), logName), !reFormat);
+ output.write(logString.toString().getBytes());
+ output.close();
+ videoLogList.clear();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ } else {
+ isError = true;
+ isSave = !getSDPath().equals("");
+ }
+ if (kill)
+ android.os.Process.killProcess(android.os.Process.myPid());
+ }
+
+ // TODO onCreateView
+ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+ isRun = 0;
+ videoLogList = new ArrayList<>();
+ //#onCreateView -> #onViewCreated -> #onActivityCreated -> #onResume
+ //#onPause -> #onResume -> #onPause -> #onResume..
+ int layout = R.layout.fragment_camera;
+ switch (getOpen()) {
+ case 2:
+ layout = R.layout.fragment_camera_2;
+ break;
+ case 3:
+ layout = R.layout.fragment_camera_3;
+ break;
+ }
+ return inflater.inflate(layout, container, false);
+ }
+
+ // TODO onViewCreated
+ @SuppressLint("HandlerLeak")
+ public void onViewCreated(@NonNull final View view, Bundle savedInstanceState) {
+ Log.e(TAG, "#onViewCreated");
+ videoLogList.add(new mLogMsg("#onViewCreated", mLog.v));
+ if (checkPermission(Objects.requireNonNull(getContext()))) {
+ showPermission();
+ } else {
+ initial();
+ if (!autoPause)
+ startBackgroundThread();
+ }
+ }
+
+ private void initial() {
+ setHomeListener();
+ Activity activity = getActivity();
+ isSave = !getSDPath().equals("");
+ Log.e(TAG, "#initial");
+ videoLogList.add(new mLogMsg("#initial", mLog.v));
+ checkSdCardFromFileList();
+ Objects.requireNonNull(activity).findViewById(R.id.cancel).setOnClickListener((View v) -> {
+ videoLogList.add(new mLogMsg("@cancel", mLog.v));
+ stopRecordAndSaveLog(true);
+ });
+ activity.findViewById(R.id.record).setOnClickListener((View v) -> isRecordStart(false));
+ ((TextView) activity.findViewById(R.id.record_status)).setText(getSDPath().equals("") ? "Error" : "Ready");
+ videoLogList.add(new mLogMsg("#initial complete", mLog.v));
+ onRun = activity.getIntent().getIntExtra(EXTRA_VIDEO_RUN, 0);
+ onFail = activity.getIntent().getIntExtra(EXTRA_VIDEO_FAIL, 0);
+ onReset = activity.getIntent().getIntExtra(EXTRA_VIDEO_RESET, 0);
+ onSuccess = activity.getIntent().getIntExtra(EXTRA_VIDEO_SUCCESS, 0);
+ isInitReady = true;
+// extraRecordStatus = activity.getIntent().getBooleanExtra(EXTRA_VIDEO_RECORD, false);
+ if (Open_f_Camera && Open_s_Camera != Open_t_Camera) {
+ if (Open_s_Camera)
+ Objects.requireNonNull(getActivity()).findViewById(R.id.textureView2).setVisibility(View.GONE);
+ if (Open_t_Camera)
+ Objects.requireNonNull(getActivity()).findViewById(R.id.textureView1).setVisibility(View.GONE);
+ }
+ if (onReset != 0)
+ videoLogList.add(new mLogMsg("#noReset:" + onReset, mLog.v));
+ }
+
+ private void isRecordStart(boolean auto) {
+ if (!isError && isSave) {
+ if (isCameraReady) {
+ if (!isRecord) {
+ if (!auto)
+ videoLogList.add(new mLogMsg("@Start record", mLog.v));
+ else
+ videoLogList.add(new mLogMsg("#Start record", mLog.v));
+ isRecord = true;
+ if (extraRecordStatus) {
+ isRun = onRun;
+ Success = onSuccess;
+ Fail = onFail;
+ } else {
+ onReset = 0;
+ isRun = 0;
+ Success = 0;
+ Fail = 0;
+ }
+ for (String CameraId : allCamera) {
+ int id = Integer.parseInt(CameraId);
+ cameraFile.set(id, "");
+ if (isOpenCamera.get(id))
+ cameraFilePath.get(id).clear();
+ }
+ extraRecordStatus = true;
+ if (!isError && isSave) {
+ videoLogList.add(new mLogMsg("#------------------------------", mLog.v));
+ videoLogList.add(new mLogMsg("#takeRecord FrameRate: default", mLog.v));
+ int delay = 0;
+ for (String CameraId : allCamera) {
+ int id = Integer.parseInt(CameraId);
+ if (isOpenCamera.get(id)) {
+ new Handler(getMainLooper()).postDelayed(() -> recordHandler.get(id).obtainMessage().sendToTarget(), delay);
+ delay += 500;
+ }
+ }
+ saveLog(getContext(), false, false);
+ } else {
+ stopRecordAndSaveLog(false);
+ showDialogLog(false);
+ }
+ } else {
+ if (!auto)
+ videoLogList.add(new mLogMsg("@Stop record", mLog.v));
+ else
+ videoLogList.add(new mLogMsg("#Stop record", mLog.v));
+ new Handler(getMainLooper()).post(() -> stopRecord(false));
+ }
+ } else {
+ showDialogLog(false);
+ videoLogList.add(new mLogMsg("#Camera is not ready.", mLog.v));
+ }
+ } else {
+ stopRecordAndSaveLog(false);
+ showDialogLog(false);
+ }
+ }
+
+ // TODO onResume 螢幕開啟
+ public void onResume() {
+ super.onResume();
+ if (!checkPermission(Objects.requireNonNull(getContext()))) {
+ if (autoPause && isInitReady) {
+ Log.e(TAG, "#onResume");
+ videoLogList.add(new mLogMsg("#onResume", mLog.v));
+ startBackgroundThread();
+ }
+ } else {
+ showPermission();
+ }
+ }
+
+ // TODO onPause 螢幕關閉
+ public void onPause() {
+ if (autoPause && !checkPermission(Objects.requireNonNull(getContext())) && isInitReady) {
+ Log.e(TAG, "#onPause");
+ videoLogList.add(new mLogMsg("#onPause", mLog.v));
+ if (isRecord)
+ isRecordStart(true);
+ closeCamera();
+ stopBackgroundThread();
+ saveLog(getContext(), false, false);
+ }
+ super.onPause();
+ }
+
+ private void showPermission() {
+ videoLogList.add(new mLogMsg("#showPermission", mLog.v));
+ // We don't have permission so prompt the user
+ List permissions = new ArrayList<>();
+ permissions.add(Manifest.permission.CAMERA);
+ permissions.add(Manifest.permission.RECORD_AUDIO);
+ permissions.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
+ requestPermissions(permissions.toArray(new String[0]), 0);
+ }
+
+ private boolean checkPermission(@NonNull Context context) {
+ videoLogList.add(new mLogMsg("#checkPermission", mLog.v));
+ int CAMERA = ActivityCompat.checkSelfPermission(context, Manifest.permission.CAMERA);
+ int AUDIO = ActivityCompat.checkSelfPermission(context, Manifest.permission.RECORD_AUDIO);
+ int ExSTORAGE = ActivityCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE);
+ return permission(CAMERA) || permission(AUDIO) || permission(ExSTORAGE);
+ }
+
+ private boolean permission(int mp) {
+ return mp != PackageManager.PERMISSION_GRANTED;
+ }
+
+ @Override
+ public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
+ if (requestCode == 0) {
+ if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
+ // 許可授權
+ initial();
+ startBackgroundThread();
+ } else {
+ // 沒有權限
+ showPermission();
+ videoLogList.add(new mLogMsg("#no permissions!", mLog.e));
+ }
+ } else {
+ super.onRequestPermissionsResult(requestCode, permissions, grantResults);
+ }
+ }
+
+ private void openCamera(String CameraId) {
+ int id = Integer.parseInt(CameraId);
+ if (ContextCompat.checkSelfPermission(Objects.requireNonNull(getActivity()), Manifest.permission.CAMERA)
+ != PackageManager.PERMISSION_GRANTED) {
+ return;
+ }
+ videoLogList.add(new mLogMsg("#Open Camera" + CameraId + ".", mLog.w));
+ Log.e(TAG, "camera ID: " + CameraId);
+ Activity activity = getActivity();
+ CameraManager manager = (CameraManager) activity.getSystemService(Context.CAMERA_SERVICE);
+ try {
+ mPreviewSize = Objects.requireNonNull(manager.getCameraCharacteristics(CameraId)
+ .get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP))
+ .getOutputSizes(SurfaceTexture.class)[0];
+ Log.e(TAG, "camera " + CameraId + " is open");
+ manager.openCamera(CameraId, stateCallback.get(id), mainHandler);
+ } catch (Exception e) {
+ e.printStackTrace();
+ } finally {
+ if (isLastCamera(CameraId))
+ isCameraReady = true;
+ }
+ }
+
+ private void closeCamera() {
+ for (String CameraId : allCamera) {
+ int id = Integer.parseInt(CameraId);
+ try {
+ if (isOpenCamera.get(id)) {
+ if (null != cameraDevice.get(id)) {
+ Thread.sleep(500);
+ new Thread(() -> {
+ cameraDevice.get(id).close();
+ cameraDevice.set(id, null);
+ }).start();
+ }
+ }
+ } catch (Exception e) {
+ throw new RuntimeException("Interrupted while trying to lock camera closing.", e);
+ }
+ }
+ isCameraReady = false;
+ }
+
+ @SuppressLint("HandlerLeak")
+ private void startBackgroundThread() {
+ mainHandler = new Handler(getMainLooper());
+ if (keepScreen)
+ Objects.requireNonNull(getActivity()).getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
+ else
+ Objects.requireNonNull(getActivity()).getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
+ for (String CameraId : allCamera) {
+ int id = Integer.parseInt(CameraId);
+ if (isOpenCamera.get(id)) {
+ Log.e(TAG,"isOpenCamera:"+id);
+ thread.set(id, new HandlerThread(threadString.get(id)));
+ thread.get(id).start();
+ backgroundHandler.set(id, new Handler(thread.get(id).getLooper()));
+ try {
+ setCamera(CameraId);
+ } catch (Exception e) {
+ e.printStackTrace();
+ videoLogList.add(new mLogMsg("setCallback " + CameraId + " is error.", mLog.w));
+ }
+ if (textureView.get(id).isAvailable())
+ openCamera(CameraId);
+ else
+ textureView.get(id).setSurfaceTextureListener(new mSurfaceTextureListener(CameraId));
+ }
+ }
+ getActivity().registerReceiver(mBroadcastReceiver = new BroadcastReceiver() {
+ public void onReceive(Context context, Intent intent) {
+ if (Objects.equals(intent.getAction(), Intent.ACTION_BATTERY_CHANGED)) { //Battery
+ Log.e(TAG, "Battery:" + intent.getIntExtra("level", 0) + "%");
+ videoLogList.add(new mLogMsg("Battery:" + intent.getIntExtra("level", 0) + "%", mLog.e));
+ saveLog(getContext(), false, false);
+ }
+ }
+ }, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
+ resetHandler = new Handler(getMainLooper()) {
+ public void handleMessage(Message msg) {
+ if (autoPause || extraRecordStatus)
+ isRecordStart(true);
+ saveLog(getContext(), false, false);
+ }
+ };
+ new Handler(getMainLooper()).postDelayed(() -> resetHandler.obtainMessage().sendToTarget(), delay_3 / 2);
+ }
+
+ private void stopBackgroundThread() {
+ Objects.requireNonNull(getActivity()).getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
+ for (String CameraId : allCamera) {
+ int id = Integer.parseInt(CameraId);
+ if (isOpenCamera.get(id)) {
+ thread.get(id).quitSafely();
+ try {
+ thread.get(id).join();
+ thread.set(id, null);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ backgroundHandler.get(id).removeCallbacks(thread.get(id));
+ backgroundHandler.set(id, null);
+ }
+ }
+ getActivity().unregisterReceiver(mBroadcastReceiver);
+ }
+
+ private void takePreview(String CameraId) {
+ int id = Integer.parseInt(CameraId);
+ Log.e(TAG, "takePreview " + CameraId);
+ videoLogList.add(new mLogMsg("Preview " + CameraId + " Camera.", mLog.i));
+ try {
+ SurfaceTexture texture = null;
+ try {
+ texture = textureView.get(id).getSurfaceTexture();
+ } catch (Exception e) {
+ e.printStackTrace();
+ errorMessage("takePreview " + CameraId + " error. <============ Crash here", true, e);
+ }
+ assert texture != null;
+ // We configure the size of default buffer to be the size of camera preview we want.
+ texture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight());
+ Surface surface = new Surface(texture);
+ CaptureRequest.Builder mPreviewBuilder;
+ // We set up a CaptureRequest.Builder with the output Surface.
+ mPreviewBuilder = cameraDevice.get(id).createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
+ mPreviewBuilder.addTarget(surface);
+ // Here, we create a CameraCaptureSession for camera preview.
+ cameraDevice.get(id).createCaptureSession(Collections.singletonList(surface),
+ new CameraCaptureSession.StateCallback() {
+ @Override
+ public void onConfigured(@NonNull CameraCaptureSession session) {
+ try {
+ // When the session is ready, we start displaying the preview.
+ previewSession.set(id, session);
+ updatePreview(mPreviewBuilder, previewSession.get(id), backgroundHandler.get(id));
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ @Override
+ public void onConfigureFailed(
+ @NonNull CameraCaptureSession cameraCaptureSession) {
+ showToast("Camera " + CameraId + " Failed");
+ Objects.requireNonNull(getActivity()).runOnUiThread(() ->
+ errorMessage("Preview " + CameraId + " onConfigureFailed", true, null));
+ }
+ }, backgroundHandler.get(id));
+ } catch (CameraAccessException e) {
+ e.printStackTrace();
+ }
+ }
+
+ protected void updatePreview(CaptureRequest.Builder mPreviewBuilder, CameraCaptureSession mPreviewSession, Handler backgroundHandler) {
+ try {
+ mPreviewBuilder.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO);
+ mPreviewSession.setRepeatingRequest(mPreviewBuilder.build(), null, backgroundHandler);
+ } catch (Exception e) {
+ e.printStackTrace();
+ errorMessage("setCaptureRequest error.", true, e);
+ }
+ }
+
+ @SuppressLint("SetTextI18n")
+ private void startRecord(String CameraId) {
+ int id = Integer.parseInt(CameraId);
+ if (!isError) {
+ Log.e(TAG, "startRecord " + CameraId);
+ try {
+ if (isCameraOne(CameraId)) {
+ checkSdCardFromFileList();
+ Objects.requireNonNull(getActivity()).runOnUiThread(() -> {
+ if (mTimer == null) {
+ onRun = getIsRun();
+ onFail = getFail();
+ onSuccess = getSuccess();
+ timerTask = new mTimerTask();
+ value = 0.0f;
+ mTimer = new Timer(true);
+ ((TextView) getActivity().findViewById(R.id.record_timer)).setText("00");
+ ((TextView) getActivity().findViewById(R.id.record_status)).setText("Recording");
+ }
+ });
+ CameraManager manager = (CameraManager) getActivity().getSystemService(Context.CAMERA_SERVICE);
+ mPreviewSize = Objects.requireNonNull(manager.getCameraCharacteristics(CameraId)
+ .get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP))
+ .getOutputSizes(SurfaceTexture.class)[0];
+ }
+ try {
+ closePreviewSession(CameraId);
+ } catch (Exception e) {
+ e.printStackTrace();
+ errorMessage("closePreviewSession error.", true, e);
+ }
+ SurfaceTexture texture = null;
+ try {
+ texture = textureView.get(id).getSurfaceTexture();
+ } catch (Exception e) {
+ e.printStackTrace();
+ videoLogList.add(new mLogMsg("getSurfaceTexture" + CameraId + " is error."));
+ }
+ if (null == texture) {
+ Log.e(TAG, isRun + " texture is null, return");
+ return;
+ }
+ texture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight());
+ Surface surface = new Surface(texture);
+ List surfaces = new ArrayList<>();
+ CaptureRequest.Builder mPreviewBuilder;
+ CameraDevice mCameraDevice;
+ Surface recorderSurface;
+ mCameraDevice = cameraDevice.get(id);
+ mediaRecorder.set(id, setUpMediaRecorder(CameraId));
+ recorderSurface = mediaRecorder.get(id).getSurface();
+ surfaces.add(surface);
+ surfaces.add(recorderSurface);
+ if (mCameraDevice != null) {
+ mPreviewBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_RECORD);
+ mPreviewBuilder.addTarget(surface);
+ mPreviewBuilder.addTarget(recorderSurface);
+ try {
+ mCameraDevice.createCaptureSession(surfaces,
+ new CameraCaptureSession.StateCallback() {
+ public void onConfigured(@NonNull CameraCaptureSession session) {
+ try {
+ if (isCameraOne(CameraId))
+ mTimer.schedule(timerTask, 100, 100);
+ previewSession.set(id, session);
+ updatePreview(mPreviewBuilder, session, backgroundHandler.get(id));
+ if (null != mediaRecorder.get(id)) {
+ mediaRecorder.get(id).start();
+ codeDate.set(id, getCalendarTime());
+ Message msg = stopRecordHandler.get(id).obtainMessage();
+ msg.obj = codeDate.get(id);
+ int delay = 0;
+ if (!isCameraOne(CameraId)) {
+ for (String c : allCamera) {
+ if (isOpenCamera.get(Integer.parseInt(c))) {
+ delay += id * 600;
+ if (c.equals(CameraId))
+ break;
+ }
+ }
+ }
+ if (autoStopRecord)
+ stopRecordHandler.get(id).sendMessageDelayed(msg, delay_60 + delay);
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ errorMessage("Camera " + CameraId + " can't record. <============ Crash here", false, e);
+ }
+ }
+
+ public void onConfigureFailed(@NonNull CameraCaptureSession Session) {
+ errorMessage("Camera " + CameraId + " Record onConfigureFailed.", true, null);
+ }
+ }, backgroundHandler.get(id));
+ } catch (Exception e) {
+ e.printStackTrace();
+ errorMessage("Camera " + CameraId + " CameraCaptureSession.StateCallback() error. <============ Crash here", true, e);
+ }
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ errorMessage("Camera " + CameraId + " startRecord error. <============ Crash here", true, e);
+ }
+ } else {
+ if (autoRestart) {
+ new Handler(getMainLooper()).postDelayed(this::restartApp, delay_3);
+ }
+ }
+ }
+
+ @SuppressLint("SetTextI18n")
+ private void stopRecord(String date, String CameraId) {
+ int id = Integer.parseInt(CameraId);
+ try {
+ if (date.equals(codeDate.get(id))) {
+ isRun++;
+ videoLogList.add(new mLogMsg("#stopRecord " + CameraId, mLog.v));
+ Log.e(TAG, isRun + " stopRecord " + CameraId);
+ if (isCameraOne(CameraId))
+ Objects.requireNonNull(getActivity()).runOnUiThread(() -> {
+ if (mTimer != null) {
+ mTimer.cancel();
+ mTimer = null;
+ }
+ ((TextView) getActivity().findViewById(R.id.record_status)).setText("Stop");
+ });
+ codeDate.set(id, getCalendarTime());
+ try {
+ closeMediaRecorder(CameraId);
+ checkAndClear(CameraId);
+ } catch (Exception e) {
+ e.printStackTrace();
+ videoLogList.add(new mLogMsg("Check file is fail."));
+ }
+// if (isFinish == 999 || isRun < isFinish - (isCameraOne(cameraId) ? 1 : 0)) {
+ startRecord(CameraId);
+// } else {
+// if (isLastCamera(CameraId))
+// isRecordStart(true);
+// }
+ if (isError || !isSave) {
+ isRun = 0;
+// isFinish = 0;
+ isRecord = false;
+ ((TextView) Objects.requireNonNull(getActivity()).findViewById(R.id.record_status)).setText("Error");
+ }
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ errorMessage("Camera " + CameraId + " stopRecord error. <============ Crash here", true, e);
+ }
+ }
+
+ @SuppressLint("SetTextI18n")
+ private void stopRecord(boolean reset) {
+ try {
+ if (!isError && isSave) { // noError, isSave
+// if (!reset) {
+// Objects.requireNonNull(getActivity()).runOnUiThread(() -> {
+// if (getFail() + getReset() == 0) {
+// videoLogList.add(new mLogMsg("#Pass"));
+// ((TextView) getActivity().findViewById(R.id.record_status)).setText("Pass");
+// } else {
+// videoLogList.add(new mLogMsg("#Fail"));
+// ((TextView) getActivity().findViewById(R.id.record_status)).setText("Fail " + getFail() + getReset());
+// }
+// });
+// new Handler(getMainLooper()).postDelayed(() -> showDialogLog(true), delay_3);
+// }
+ for (String CameraId : allCamera) { // 遍例Camera
+ if (isOpenCamera.get(Integer.parseInt(CameraId))) { // 檢查OpenCamera
+ videoLogList.add(new mLogMsg("#stopRecord " + CameraId, mLog.v));
+ Log.e(TAG, isRun + " stopRecord " + CameraId);
+ if (isCameraOne(CameraId))
+ Objects.requireNonNull(getActivity()).runOnUiThread(() -> {
+ if (mTimer != null) {
+ mTimer.cancel();
+ mTimer = null;
+ }
+ ((TextView) getActivity().findViewById(R.id.record_status)).setText("Stop");
+ });
+ codeDate.set(Integer.parseInt(CameraId), getCalendarTime());
+ closeMediaRecorder(CameraId);
+ checkAndClear(CameraId);
+ }
+ }
+ }
+ isRun = 0;
+// isFinish = 0;
+ isRecord = false;
+ videoLogList.add(new mLogMsg("#Complete"));
+ videoLogList.add(new mLogMsg("#------------------------------", mLog.v));
+ saveLog(getContext(), false, false);
+ if (!reset) {
+ extraRecordStatus = false;
+ }
+ if (preview) {
+ takePreview();
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ errorMessage("stopRecord all camera error. <============ Crash here", true, e);
+ }
+ }
+
+ private void checkAndClear(String CameraId) {
+ int id = Integer.parseInt(CameraId);
+ try {
+ if (isRecord)
+ if (isOpenCamera.get(id) && null != cameraFilePath.get(id)) {
+ for (String f : cameraFilePath.get(id)) {
+ checkFile(f);
+ }
+ cameraFilePath.get(id).clear();
+ }
+ gc();
+ } catch (Exception e) {
+ videoLogList.add(new mLogMsg("CheckFile " + CameraId + " error.", mLog.e));
+ }
+ }
+
+ private void takePreview() {
+ if (!isError && isSave) {
+ for (String CameraId : allCamera) {
+ if (isOpenCamera.get(Integer.parseInt(CameraId)))
+ takePreview(CameraId);
+ }
+ } else {
+ stopRecordAndSaveLog(false);
+ showDialogLog(false);
+ }
+ }
+
+ private void showDialogLog(boolean end) {
+ videoLogList.add(new mLogMsg("#Log_show", mLog.v));
+ View view = LayoutInflater.from(getContext()).inflate(R.layout.layout_getlog, null);
+ final AlertDialog dialog = new AlertDialog.Builder(getContext(), android.R.style.Theme_Black_NoTitleBar_Fullscreen)
+ .setView(view).setCancelable(true).create();
+
+ view.findViewById(R.id.dialog_button_2).setOnClickListener((View vs) -> { // ok
+ videoLogList.add(new mLogMsg("@Log_ok", mLog.v));
+ dialog.dismiss();
+ });
+ ArrayList list = new ArrayList<>();
+ if (isSave)
+ if (end)
+ list.add("CheckFile -> video_success/fail:(" + getSuccess() + "/" + getFail() + ") app_reset:(" + getReset() + ")");
+ else
+ list.add("App Version:" + this.getString(R.string.app_name));
+ else list.add(NO_SD_CARD);
+
+ if (!errorMessage.equals(""))
+ list.add(errorMessage);
+ else {
+ for (String CameraId : allCamera) {
+ int id = Integer.parseInt(CameraId);
+ if (isOpenCamera.get(id) && !isCameraOpened.get(id))
+ list.add("Camera Access error, Please check camera " + CameraId + ". <============ Crash here");
+ }
+ }
+ if (list.size() > 0) {
+ ArrayList items = new ArrayList<>();
+ for (String s : list) {
+ @SuppressLint("InflateParams") View item_layout = LayoutInflater.from(getContext()).inflate(R.layout.style_text_item, null);
+ ((CustomTextView) item_layout.findViewById(R.id.customTextView)).setText(s);
+ items.add(item_layout);
+ }
+ ((ListView) view.findViewById(R.id.dialog_listview)).setAdapter(new mListAdapter(items));
+ ((ListView) view.findViewById(R.id.dialog_listview)).setSelection(items.size() - 1);
+ }
+ dialog.show();
+ }
+
+ boolean checkFile(String file, AtomicReferenceArray list) {
+ if (file.equals(list.get(0)))
+ return false;
+ else if (file.equals(list.get(1)))
+ return false;
+ return !file.equals(list.get(2));
+ }
+
+ @Override
+ public void onDestroy() {
+ super.onDestroy();
+ try {
+ for (String CameraId : allCamera) {
+ int id = Integer.parseInt(CameraId);
+ if (isOpenCamera.get(id)) {
+ closeStateCallback(CameraId);
+ closePreviewSession(CameraId);
+ closeMediaRecorder(CameraId);
+ }
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ errorMessage("onDestroy error.", false, e);
+ }
+ try {
+ if (null != home)
+ home.stop();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ new Handler(getMainLooper()).post(() -> stopRecordAndSaveLog(false));
+ }
+
+ private void stopRecordAndSaveLog(boolean kill) {
+ if (isRecord)
+ new Handler(getMainLooper()).post(() -> stopRecord(true));
+ saveLog(getContext(), false, kill);
+ }
+
+ @SuppressLint("HandlerLeak")
+ private void setCamera(String CameraId) {
+ int id = Integer.parseInt(CameraId);
+ if (getOpen() == 1)
+ textureView.set(id, Objects.requireNonNull(getActivity()).findViewById(id_textView.get(0)));
+ else
+ textureView.set(id, Objects.requireNonNull(getActivity()).findViewById(id_textView.get(id)));
+ cameraFilePath.set(id, new ArrayList<>());
+ codeDate.set(id, getCalendarTime());
+ stateCallback.set(id, setCallback(CameraId));
+ videoLogList.add(new mLogMsg("setCallback " + CameraId + ".", mLog.w));
+ recordHandler.set(id, new Handler(getMainLooper()) {
+ public void handleMessage(Message msg) {
+ try {
+ startRecord(CameraId);
+ videoLogList.add(new mLogMsg("startRecord " + CameraId + ".", mLog.w));
+ } catch (Exception e) {
+ videoLogList.add(new mLogMsg("startRecord " + CameraId + " is error.", mLog.w));
+ e.printStackTrace();
+ }
+ }
+ });
+ stopRecordHandler.set(id, new Handler(getMainLooper()) {
+ public void handleMessage(Message msg) {
+ if (isRecord)
+ try {
+ stopRecord(msg.obj.toString(), CameraId);
+ videoLogList.add(new mLogMsg("stopRecord " + CameraId + ".", mLog.w));
+ } catch (Exception e) {
+ videoLogList.add(new mLogMsg("stopRecord " + CameraId + " is error.", mLog.w));
+ e.printStackTrace();
+ }
+ }
+ });
+ }
+
+ private CameraDevice.StateCallback setCallback(String CameraId) {
+ CameraDevice.StateCallback callback;
+ try {
+ callback = new CameraDevice.StateCallback() {
+ final int id = Integer.parseInt(CameraId);
+
+ public void onOpened(@NonNull CameraDevice cameraDevice) {
+ Log.e(TAG, "onOpened Camera " + CameraId);
+ try {
+ isCameraOpened.set(id, true);
+ com.d160.thermal.Utils.cameraDevice.set(id, cameraDevice);
+ takePreview(CameraId);
+ videoLogList.add(new mLogMsg("Camera " + CameraId + " is opened.", mLog.i));
+ } catch (Exception e) {
+ e.printStackTrace();
+ errorMessage("closeCameraDevices " + CameraId + " close error.", true, e);
+ }
+ }
+
+ public void onDisconnected(@NonNull CameraDevice cameraDevice) {
+ Log.e(TAG, "onDisconnected Camera " + CameraId);
+ try {
+ isCameraOpened.set(id, false);
+ com.d160.thermal.Utils.cameraDevice.get(id).close();
+ videoLogList.add(new mLogMsg("Camera " + CameraId + " is disconnected.", mLog.w));
+ } catch (Exception e) {
+ e.printStackTrace();
+ errorMessage("closeCameraDevices " + CameraId + " close error.", true, e);
+ }
+ }
+
+ public void onError(@NonNull CameraDevice cameraDevice, int error) {
+ Log.e(TAG, "onError Camera " + CameraId);
+ try {
+ isCameraOpened.set(id, false);
+ com.d160.thermal.Utils.cameraDevice.get(id).close();
+ videoLogList.add(new mLogMsg("Camera " + CameraId + " is disconnected.", mLog.w));
+ } catch (Exception e) {
+ e.printStackTrace();
+ errorMessage("closeCameraDevices " + CameraId + " close error.", true, e);
+ }
+ errorMessage("Camera " + CameraId + " is error. <============ Crash here", true, null);
+ }
+ };
+ return callback;
+ } catch (Exception e) {
+ e.printStackTrace();
+ errorMessage("closeCameraDevices " + CameraId + " close error.", true, e);
+ }
+ return null;
+ }
+
+ @SuppressLint("SetTextI18n")
+ private void errorMessage(String msg, boolean reset, Exception e) {
+ if (e != null)
+ Log.e(TAG, e.toString());
+ isSave = !getSDPath().equals("");
+ isError = true;
+ isRecord = false;
+ Objects.requireNonNull(getActivity()).runOnUiThread(() ->
+ ((TextView) getActivity().findViewById(R.id.record_status)).setText("Error"));
+ if (null != videoLogList)
+ videoLogList.add(new mLogMsg(msg, mLog.e));
+ errorMessage = msg;
+ new Handler(getMainLooper()).post(() -> stopRecordAndSaveLog(false));
+ if (reset) {
+ new Handler(getMainLooper()).postDelayed(this::restartApp, delay_3);
+ }
+ }
+
+ private void restartApp() {
+ onRestart = true;
+ onReset++;
+ Context context = getContext();
+ Intent intent = RestartActivity.createIntent(Objects.requireNonNull(context));
+ intent.putExtra(EXTRA_VIDEO_RUN, onRun);
+ intent.putExtra(EXTRA_VIDEO_FAIL, onFail);
+ intent.putExtra(EXTRA_VIDEO_RESET, onReset);
+ intent.putExtra(EXTRA_VIDEO_SUCCESS, onSuccess);
+ intent.putExtra(EXTRA_VIDEO_RECORD, extraRecordStatus);
+ context.startActivity(intent);
+ }
+
+ private void closeCameraDevice(String CameraId) {
+ int id = Integer.parseInt(CameraId);
+ try {
+ if (null != cameraDevice.get(id)) {
+ cameraDevice.get(id).close();
+ cameraDevice.set(id, null);
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ videoLogList.add(new mLogMsg("closeCameraDevice " + CameraId + " is error."));
+ }
+ }
+
+ private void closeStateCallback(String CameraId) {
+ int id = Integer.parseInt(CameraId);
+ try {
+ if (null != stateCallback.get(id)) {
+ stateCallback.get(id).onDisconnected(cameraDevice.get(id));
+ stateCallback.set(id, null);
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ errorMessage("closeStateCallback" + CameraId + " is error.", true, e);
+ }
+ }
+
+ private void closePreviewSession(String CameraId) {
+ int id = Integer.parseInt(CameraId);
+ try {
+ if (null != previewSession.get(id)) {
+ previewSession.get(id).close();
+ previewSession.set(id, null);
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ errorMessage("closePreviewSession" + CameraId + " is error.", false, e);
+ }
+ }
+
+ private void closeMediaRecorder(String CameraId) {
+ int id = Integer.parseInt(CameraId);
+ if (null != mediaRecorder.get(id)) {
+ try {
+ try {
+ mediaRecorder.get(id).stop();
+ mediaRecorder.get(id).release();
+ } catch (RuntimeException stopException) {
+ // handle cleanup here
+ }
+ mediaRecorder.set(id, null);
+ videoLogList.add(new mLogMsg("Record " + CameraId + " finish."));
+ } catch (Exception e) {
+ e.printStackTrace();
+ videoLogList.add(new mLogMsg("closeMediaRecorder " + CameraId + " is error."));
+ }
+ }
+ }
+
+ private MediaRecorder setUpMediaRecorder(String CameraId) {
+ int id = Integer.parseInt(CameraId);
+ String file;
+ MediaRecorder mediaRecorder = null;
+ try {
+ if (!getSDPath().equals("")) {
+ String name = getCalendarTime(CameraId) + ".mp4";
+ file = getSDPath() + name;
+ videoLogList.add(new mLogMsg("Create: " + name, mLog.w));
+ cameraFile.set(id, file + "");
+ cameraFilePath.get(id).add(file);
+ CamcorderProfile profile = CamcorderProfile.get(CamcorderProfile.QUALITY_1080P);
+ if (Open_Audio && isCameraOne(CameraId))
+ videoLogList.add(new mLogMsg("#audio"));
+ mediaRecorder = new MediaRecorder();
+ if (Open_Audio && isCameraOne(CameraId))
+ mediaRecorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
+ mediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
+ mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
+ if (Open_Audio && isCameraOne(CameraId))
+ mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
+ mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
+ mediaRecorder.setVideoSize(profile.videoFrameWidth, profile.videoFrameHeight);
+ if (Open_Audio && isCameraOne(CameraId))
+ mediaRecorder.setAudioEncodingBitRate(96000);
+ mediaRecorder.setVideoEncodingBitRate(2000000);
+ if (Open_Audio && isCameraOne(CameraId)) {
+ mediaRecorder.setAudioChannels(2);
+ mediaRecorder.setAudioSamplingRate(44100);
+ }
+ mediaRecorder.setVideoFrameRate(50);
+ mediaRecorder.setOutputFile(file);
+ mediaRecorder.prepare();
+ } else {
+ errorMessage("MediaRecorder error. " + NO_SD_CARD + " <============ Crash here", false, null);
+ return null;
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ errorMessage("MediaRecorder " + CameraId + " error. <============ Crash here", false, e);
+ }
+ return mediaRecorder;
+ }
+
+ private void showToast(final String text) {
+ final Activity activity = getActivity();
+ if (activity != null) {
+ activity.runOnUiThread(() -> Toast.makeText(activity, text, Toast.LENGTH_SHORT).show());
+ }
+ }
+
+ private void checkSdCardFromFileList() {
+ isSave = !getSDPath().equals("");
+ if (isSave) {
+ try {
+ StatFs stat = new StatFs(getSDPath());
+ long sdAvailSize = stat.getAvailableBlocksLong() * stat.getBlockSizeLong();
+ double gigaAvailable = (sdAvailSize >> 30);
+ if (gigaAvailable < sdData) {
+ videoLogList.add(new mLogMsg("SD Card is Full."));
+ ArrayList tmp = new ArrayList<>();
+ File[] fileList = new File(getSDPath()).listFiles();
+ for (File file : fileList != null ? fileList : new File[0]) {
+ if (!file.isDirectory() && Utils.getFileExtension(file.toString()).equals("mp4"))
+ if (checkFile(file.toString(), cameraFile))
+ tmp.add(file.toString());
+ }
+ if (tmp.size() >= 6) {
+ Object[] list = tmp.toArray();
+ Arrays.sort(list);
+ for (int i = 0; i < 6; i++)
+ delete((String) list[i], SD_Mode);
+ checkSdCardFromFileList();
+ } else {
+ isError = true;
+ videoLogList.add(new mLogMsg("MP4 video file not found. <============ Crash here"));
+ errorMessage("error: At least " + sdData + "gb memory needs to be available to record, please check the SD Card free space.", false, null);
+ }
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ if (!getSDPath().equals("")) {
+ errorMessage("error: At least " + sdData + "gb memory needs to be available to record, please check the SD Card free space.", false, null);
+ } else {
+ errorMessage(NO_SD_CARD, false, null);
+ }
+ }
+ } else {
+ errorMessage(NO_SD_CARD, false, null);
+ }
+ }
+
+ private void setHomeListener() {
+ try {
+ home = new HomeListen(getContext());
+ home.setOnHomeBtnPressListener(new HomeListen.OnHomeBtnPressListener() {
+ public void onHomeBtnPress() {
+ videoLogList.add(new mLogMsg("@home", mLog.v));
+ stopRecordAndSaveLog(true);
+ }
+
+ public void onHomeBtnLongPress() {
+ videoLogList.add(new mLogMsg("@recent", mLog.v));
+ stopRecordAndSaveLog(true);
+ }
+ });
+ home.start();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ private class mTimerTask extends TimerTask {
+ @SuppressLint("SetTextI18n")
+ public void run() {
+ // mHandlerを通じてUI Threadへ処理をキューイング
+ Objects.requireNonNull(getActivity()).runOnUiThread(() -> {
+ //実行間隔分を加算処理
+ value += 0.1d;
+ //計算にゆらぎがあるので小数点第1位で丸める
+ BigDecimal bi = new BigDecimal(value);
+ float outputValue = bi.setScale(1, BigDecimal.ROUND_HALF_UP).floatValue();
+ if (autoStopRecord && outputValue >= 65) {
+ errorMessage("Application has timed out.", true, null);
+ }
+ //現在のLapTime
+ ((TextView) getActivity().findViewById(R.id.record_timer)).setText(Float.toString(outputValue));
+ });
+ }
+ }
+
+ private class mSurfaceTextureListener implements TextureView.SurfaceTextureListener {
+ String CameraId;
+
+ public mSurfaceTextureListener(String CameraId) {
+ this.CameraId = CameraId;
+ }
+
+ public void onSurfaceTextureAvailable(SurfaceTexture texture, int width, int height) {
+ openCamera(CameraId);
+ }
+
+ public void onSurfaceTextureSizeChanged(SurfaceTexture texture, int width, int height) {
+
+ }
+
+ public boolean onSurfaceTextureDestroyed(SurfaceTexture texture) {
+ return true;
+ }
+
+ public void onSurfaceTextureUpdated(SurfaceTexture texture) {
+ }
+ }
+}
diff --git a/app/src/main/java/com/askey/record/restartActivity.java b/app/src/main/java/com/d160/thermal/RestartActivity.java
similarity index 79%
rename from app/src/main/java/com/askey/record/restartActivity.java
rename to app/src/main/java/com/d160/thermal/RestartActivity.java
index 5b8c41d..d639115 100644
--- a/app/src/main/java/com/askey/record/restartActivity.java
+++ b/app/src/main/java/com/d160/thermal/RestartActivity.java
@@ -1,11 +1,10 @@
-package com.askey.record;
+package com.d160.thermal;
-import android.app.Activity;
-import android.content.Context;
-import android.content.Intent;
-import android.os.Bundle;
+import android.app.*;
+import android.content.*;
+import android.os.*;
-public class restartActivity extends Activity {
+public class RestartActivity extends Activity {
public static final String EXTRA_MAIN_PID = "RestartActivity.main_pid";
public static final String EXTRA_VIDEO_RUN = "RestartActivity.run";
public static final String EXTRA_VIDEO_FAIL = "RestartActivity.fail";
@@ -15,37 +14,36 @@ public class restartActivity extends Activity {
public static Intent createIntent(Context context) {
Intent intent = new Intent();
- intent.setClassName(context.getPackageName(), restartActivity.class.getName());
+ intent.setClassName(context.getPackageName(), RestartActivity.class.getName());
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- // メインプロセスの PID を Intent に保存しておく
intent.putExtra(EXTRA_MAIN_PID, android.os.Process.myPid());
return intent;
}
-
+
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- // 1. メインプロセスを Kill する
Intent intent = getIntent();
int mainPid = intent.getIntExtra(EXTRA_MAIN_PID, -1);
int EXTRA_RUN = intent.getIntExtra(EXTRA_VIDEO_RUN, 0);
int EXTRA_RESET = intent.getIntExtra(EXTRA_VIDEO_RESET, 0);
int EXTRA_FAIL = getIntent().getIntExtra(EXTRA_VIDEO_FAIL, 0);
int EXTRA_SUCCESS = getIntent().getIntExtra(EXTRA_VIDEO_SUCCESS, 0);
+
boolean EXTRA_RECORD = intent.getBooleanExtra(EXTRA_VIDEO_RECORD, false);
android.os.Process.killProcess(mainPid);
// 2. MainActivity を再起動する
Context context = getApplicationContext();
Intent restartIntent = new Intent(Intent.ACTION_MAIN);
- restartIntent.setClassName(context.getPackageName(), VideoRecordActivity.class.getName());
+ restartIntent.setClassName(context.getPackageName(), CameraActivity.class.getName());
restartIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
restartIntent.putExtra(EXTRA_VIDEO_RUN, EXTRA_RUN);
restartIntent.putExtra(EXTRA_VIDEO_RESET, EXTRA_RESET);
restartIntent.putExtra(EXTRA_VIDEO_FAIL, EXTRA_FAIL);
restartIntent.putExtra(EXTRA_VIDEO_SUCCESS, EXTRA_SUCCESS);
+
restartIntent.putExtra(EXTRA_VIDEO_RECORD, EXTRA_RECORD);
context.startActivity(restartIntent);
- // 3. RestartActivity を終了する
finish();
android.os.Process.killProcess(android.os.Process.myPid());
}
diff --git a/app/src/main/java/com/d160/thermal/Utils.java b/app/src/main/java/com/d160/thermal/Utils.java
new file mode 100644
index 0000000..7ec281b
--- /dev/null
+++ b/app/src/main/java/com/d160/thermal/Utils.java
@@ -0,0 +1,194 @@
+package com.d160.thermal;
+
+import android.annotation.*;
+import android.hardware.camera2.*;
+import android.media.*;
+import android.os.Handler;
+import android.os.HandlerThread;
+import android.view.*;
+
+import com.d160.view.*;
+
+import java.io.*;
+import java.text.*;
+import java.util.*;
+import java.util.concurrent.atomic.*;
+
+import static android.os.Environment.*;
+import static com.d160.thermal.CameraFragment.*;
+
+@SuppressLint("StaticFieldLeak")
+public class Utils {
+ //-------------------------------------------------------------------------------
+ public static final String EXTRA_VIDEO_RUN = "RestartActivity.run";
+ public static final String EXTRA_VIDEO_FAIL = "RestartActivity.fail";
+ public static final String EXTRA_VIDEO_RESET = "RestartActivity.reset";
+ public static final String EXTRA_VIDEO_RECORD = "RestartActivity.record";
+ public static final String EXTRA_VIDEO_SUCCESS = "RestartActivity.success";
+ public static final String NO_SD_CARD = "SD card is not available!";
+ public static final String logName = "ThermalTestLog.ini";
+ public static final String LOG_TITLE = "[CDR9030_Thermal_Test]";
+ public static final double sdData = 3;
+ public static int isRun = 0, Success = 0, Fail = 0;
+ public static ArrayList videoLogList = null;
+ public static boolean isInitReady = false, isCameraReady = false, isRecord = false,
+ isError = false, isSave = false;
+ public static String errorMessage = "";
+ //-------------------------------------------------------------------------------
+ public static List allCamera = Arrays.asList(firstCamera, secondCamera, thirdCamera);
+ public static AtomicReferenceArray isOpenCamera = new AtomicReferenceArray<>(new Boolean[]{Open_f_Camera, Open_s_Camera, Open_t_Camera});
+ public static AtomicIntegerArray id_textView = new AtomicIntegerArray(new int[]{R.id.textureView0, R.id.textureView1, R.id.textureView2});
+ public static AtomicReferenceArray threadString = new AtomicReferenceArray<>(new String[]{"CameraPreview0", "CameraPreview1", "CameraPreview2"});
+ public static AtomicReferenceArray cameraFile = new AtomicReferenceArray<>(new String[]{"", "", ""});
+ public static AtomicReferenceArray isCameraOpened = new AtomicReferenceArray<>(new Boolean[]{false, false, false});
+ public static AtomicReferenceArray> cameraFilePath = new AtomicReferenceArray<>(new ArrayList[3]);
+ public static AtomicReferenceArray codeDate = new AtomicReferenceArray<>(new String[3]);
+ public static AtomicReferenceArray textureView = new AtomicReferenceArray<>(new TextureView[3]);
+ public static AtomicReferenceArray cameraDevice = new AtomicReferenceArray<>(new CameraDevice[3]);
+ public static AtomicReferenceArray previewSession = new AtomicReferenceArray<>(new CameraCaptureSession[3]);
+ public static AtomicReferenceArray stateCallback = new AtomicReferenceArray<>(new CameraDevice.StateCallback[3]);
+ public static AtomicReferenceArray mediaRecorder = new AtomicReferenceArray<>(new MediaRecorder[3]);
+ public static AtomicReferenceArray thread = new AtomicReferenceArray<>(new HandlerThread[3]);
+ public static AtomicReferenceArray backgroundHandler = new AtomicReferenceArray<>(new Handler[3]);
+ public static AtomicReferenceArray recordHandler = new AtomicReferenceArray<>(new Handler[3]);
+ public static AtomicReferenceArray stopRecordHandler = new AtomicReferenceArray<>(new Handler[3]);
+ //-------------------------------------------------------------------------------
+
+ public static String getLogPath() {
+ return getPath()+ "DCIM/";
+ }
+
+ //TODO Default Path
+ @SuppressLint("NewApi")
+ public static String getPath() {
+ return getStorageDirectory().getPath() + "/emulated/0/";
+ }
+
+ public static String getSDPath() {
+ String path = "";
+ if (SD_Mode) {
+ try {
+ long start = (System.currentTimeMillis() / 1000) % 60;
+ long end = start + 10;
+ Runtime run = Runtime.getRuntime();
+ String cmd = "ls /storage";
+ Process pr = run.exec(cmd);
+ InputStreamReader input = new InputStreamReader(pr.getInputStream());
+ BufferedReader buf = new BufferedReader(input);
+ String line;
+ while ((line = buf.readLine()) != null) {
+ if (!line.equals("self") && !line.equals("emulated") && !line.equals("enterprise") && !line.contains("sdcard")) {
+ path = "/storage/" + line + "/";
+ break;
+ }
+ if ((System.currentTimeMillis() / 1000) % 60 > end) {
+ videoLogList.add(new mLogMsg("getSDPath time out.", mLog.e));
+ break;
+ }
+ }
+ buf.close();
+ input.close();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ } else {
+ path = getPath();
+ }
+ return path;
+ }
+
+ public static int getOpen(){
+ int OpenCamera = 0;
+ for (int i = 0; i < isOpenCamera.length(); i++) {
+ if (isOpenCamera.get(i)) {
+ OpenCamera++;
+ }
+ }
+ return OpenCamera;
+ }
+
+ public static int getIsRun() {
+ return isRun;
+ }
+
+ public static int getSuccess() {
+ return Success;
+ }
+
+ public static int getFail() {
+ return Fail;
+ }
+
+ public static int getReset() {
+ return onReset;
+ }
+
+ @SuppressLint({"DefaultLocale", "SimpleDateFormat"})
+ public static String getCalendarTime() {
+ Calendar calendar = Calendar.getInstance();
+ return new SimpleDateFormat("HHmmss").format(calendar.getTime()) + "";
+ }
+
+ @SuppressLint({"DefaultLocale", "SimpleDateFormat"})
+ public static String getCalendarTime(String cameraId) {
+ Calendar calendar = Calendar.getInstance();
+ String cm = "c";
+ switch (cameraId) {
+ case firstCamera:
+ cm = "f";
+ break;
+ case secondCamera:
+ cm = "s";
+ break;
+ case thirdCamera:
+ cm = "t";
+ break;
+ }
+ return "v" + new SimpleDateFormat("yyyyMMddHHmmss").format(calendar.getTime()) + cm;
+ }
+
+ public static String getFileExtension(String fullName) {
+ String fileName = new File(fullName).getName();
+ int dotIndex = fileName.lastIndexOf('.');
+ return (dotIndex == -1) ? "" : fileName.substring(dotIndex + 1);
+ }
+
+ public static boolean isCameraOne(String cameraId) {
+ if (isOpenCamera.get(0))
+ return cameraId.equals(allCamera.get(0));
+ else if (isOpenCamera.get(1))
+ return cameraId.equals(allCamera.get(1));
+ else
+ return cameraId.equals(allCamera.get(2));
+ }
+
+ public static boolean isLastCamera(String cameraId) {
+ if (isOpenCamera.get(2))
+ return cameraId.equals(allCamera.get(2));
+ else if (isOpenCamera.get(1))
+ return cameraId.equals(allCamera.get(1));
+ else
+ return cameraId.equals(allCamera.get(0));
+ }
+
+ public static void delete(String path, boolean SdMode) {
+ File video = new File(path);
+ try {
+ if (!path.equals("")) {
+ if (video.exists()) {
+ if (SdMode)
+ videoLogList.add(new mLogMsg("Delete: " + path.split("/")[3], mLog.w));
+ else
+ videoLogList.add(new mLogMsg("Delete: " + path.split("/")[5], mLog.w));
+ boolean del = video.delete();
+ if (!del)
+ videoLogList.add(new mLogMsg("Video delete failed.", mLog.e));
+ } else {
+ videoLogList.add(new mLogMsg("Video not find.", mLog.e));
+ }
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/app/src/main/java/com/askey/widget/CustomTextView.java b/app/src/main/java/com/d160/view/CustomTextView.java
old mode 100755
new mode 100644
similarity index 79%
rename from app/src/main/java/com/askey/widget/CustomTextView.java
rename to app/src/main/java/com/d160/view/CustomTextView.java
index e6bee87..847ba31
--- a/app/src/main/java/com/askey/widget/CustomTextView.java
+++ b/app/src/main/java/com/d160/view/CustomTextView.java
@@ -1,13 +1,13 @@
-package com.askey.widget;
+package com.d160.view;
-import android.annotation.SuppressLint;
-import android.content.Context;
-import android.content.res.TypedArray;
-import android.graphics.Typeface;
-import android.util.AttributeSet;
-import android.widget.TextView;
+import android.annotation.*;
+import android.content.*;
+import android.content.res.*;
+import android.graphics.*;
+import android.util.*;
+import android.widget.*;
-import com.askey.record.R;
+import com.d160.thermal.R;
@SuppressLint("AppCompatCustomView")
public class CustomTextView extends TextView {
diff --git a/app/src/main/java/com/askey/widget/HomeListen.java b/app/src/main/java/com/d160/view/HomeListen.java
similarity index 77%
rename from app/src/main/java/com/askey/widget/HomeListen.java
rename to app/src/main/java/com/d160/view/HomeListen.java
index 7c99b04..72bb5b5 100644
--- a/app/src/main/java/com/askey/widget/HomeListen.java
+++ b/app/src/main/java/com/d160/view/HomeListen.java
@@ -1,9 +1,6 @@
-package com.askey.widget;
+package com.d160.view;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
+import android.content.*;
/**
* Home按键监听类 使用说明: 1、初始化HomeListen HomeListen homeListen = new HomeListen( this
@@ -18,9 +15,10 @@
*/
public class HomeListen {
+ private boolean isRun = false;
private Context mContext = null;
private IntentFilter mHomeBtnIntentFilter = null;
- private OnHomeBtnPressLitener mOnHomeBtnPressListener = null;
+ private OnHomeBtnPressListener mOnHomeBtnPressListener = null;
private HomeBtnReceiver mHomeBtnReceiver = null;
public HomeListen(Context context) {
@@ -29,24 +27,27 @@ public HomeListen(Context context) {
mHomeBtnIntentFilter = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
}
- public void setOnHomeBtnPressListener(OnHomeBtnPressLitener onHomeBtnPressListener) {
+ public void setOnHomeBtnPressListener(OnHomeBtnPressListener onHomeBtnPressListener) {
mOnHomeBtnPressListener = onHomeBtnPressListener;
}
public void start() {
- try{
+ isRun = true;
+ try {
mContext.registerReceiver(mHomeBtnReceiver, mHomeBtnIntentFilter);
- }catch (Exception e){
-
+ } catch (Exception e) {
+ e.printStackTrace();
}
}
public void stop() {
- try{
- mContext.unregisterReceiver(mHomeBtnReceiver);
- }catch (Exception e){
-
+ try {
+ if (null != mHomeBtnReceiver && isRun)
+ mContext.unregisterReceiver(mHomeBtnReceiver);
+ } catch (Exception e) {
+ e.printStackTrace();
}
+ isRun = false;
}
public void receive(Intent intent) {
@@ -67,7 +68,7 @@ public void receive(Intent intent) {
}
}
- public interface OnHomeBtnPressLitener {
+ public interface OnHomeBtnPressListener {
void onHomeBtnPress();
void onHomeBtnLongPress();
diff --git a/app/src/main/java/com/askey/widget/mListAdapter.java b/app/src/main/java/com/d160/view/mListAdapter.java
similarity index 82%
rename from app/src/main/java/com/askey/widget/mListAdapter.java
rename to app/src/main/java/com/d160/view/mListAdapter.java
index fdfb05d..d0bf404 100644
--- a/app/src/main/java/com/askey/widget/mListAdapter.java
+++ b/app/src/main/java/com/d160/view/mListAdapter.java
@@ -1,8 +1,7 @@
-package com.askey.widget;
+package com.d160.view;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.BaseAdapter;
+import android.view.*;
+import android.widget.*;
import java.util.ArrayList;
diff --git a/app/src/main/java/com/askey/widget/mLog.java b/app/src/main/java/com/d160/view/mLog.java
similarity index 60%
rename from app/src/main/java/com/askey/widget/mLog.java
rename to app/src/main/java/com/d160/view/mLog.java
index fa6ee4d..4a44b27 100644
--- a/app/src/main/java/com/askey/widget/mLog.java
+++ b/app/src/main/java/com/d160/view/mLog.java
@@ -1,4 +1,4 @@
-package com.askey.widget;
+package com.d160.view;
public enum mLog {
v, d, i, w, e
diff --git a/app/src/main/java/com/d160/view/mLogMsg.java b/app/src/main/java/com/d160/view/mLogMsg.java
new file mode 100644
index 0000000..dbe4ae3
--- /dev/null
+++ b/app/src/main/java/com/d160/view/mLogMsg.java
@@ -0,0 +1,26 @@
+package com.d160.view;
+
+import com.d160.thermal.*;
+
+import java.time.*;
+
+public class mLogMsg {
+ public int run;
+ public LocalDateTime date; //Added in API level 26
+ public String msg;
+ public mLog type;
+
+ public mLogMsg(String msg) {
+ this.run = Utils.getIsRun();
+ this.date = LocalDateTime.now();
+ this.msg = msg;
+ this.type = mLog.d;
+ }
+
+ public mLogMsg(String msg, mLog type) {
+ this.run = Utils.getIsRun();
+ this.date = LocalDateTime.now();
+ this.msg = msg;
+ this.type = type;
+ }
+}
diff --git a/app/src/main/res/layout/activity_camera.xml b/app/src/main/res/layout/activity_camera.xml
new file mode 100644
index 0000000..10826c5
--- /dev/null
+++ b/app/src/main/res/layout/activity_camera.xml
@@ -0,0 +1,7 @@
+
diff --git a/app/src/main/res/layout/activity_video_record.xml b/app/src/main/res/layout/activity_video_record.xml
deleted file mode 100644
index 04cf1ff..0000000
--- a/app/src/main/res/layout/activity_video_record.xml
+++ /dev/null
@@ -1,192 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/layout/fragment_camera.xml b/app/src/main/res/layout/fragment_camera.xml
new file mode 100644
index 0000000..66c1b00
--- /dev/null
+++ b/app/src/main/res/layout/fragment_camera.xml
@@ -0,0 +1,116 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/fragment_camera_2.xml b/app/src/main/res/layout/fragment_camera_2.xml
new file mode 100644
index 0000000..c469e4d
--- /dev/null
+++ b/app/src/main/res/layout/fragment_camera_2.xml
@@ -0,0 +1,123 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/fragment_camera_3.xml b/app/src/main/res/layout/fragment_camera_3.xml
new file mode 100644
index 0000000..a0d838c
--- /dev/null
+++ b/app/src/main/res/layout/fragment_camera_3.xml
@@ -0,0 +1,123 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/style_setting_item.xml b/app/src/main/res/layout/style_setting_item.xml
old mode 100755
new mode 100644
index a64e085..33e498b
--- a/app/src/main/res/layout/style_setting_item.xml
+++ b/app/src/main/res/layout/style_setting_item.xml
@@ -13,7 +13,7 @@
android:background="@drawable/bg_rounded_white"
android:gravity="center">
-
-
-
- CDR9020_QTR(v1.7.6)
+ CDR9030_Thermal(v1.1)
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
deleted file mode 100644
index 1243d8f..0000000
--- a/app/src/main/res/values/styles.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
-
-
diff --git a/build.gradle b/build.gradle
index dfd946d..c8a10bd 100755
--- a/build.gradle
+++ b/build.gradle
@@ -4,10 +4,10 @@ buildscript {
repositories {
google()
jcenter()
-
+
}
dependencies {
- //noinspection GradleDependency
+ //noinspection AndroidGradlePluginVersion,GradleDependency
classpath 'com.android.tools.build:gradle:3.5.3'
}
}
@@ -16,7 +16,6 @@ allprojects {
repositories {
google()
jcenter()
-
}
}
diff --git a/gradle.properties b/gradle.properties
index 82618ce..df358a1 100755
--- a/gradle.properties
+++ b/gradle.properties
@@ -1,15 +1,3 @@
-# Project-wide Gradle settings.
-# IDE (e.g. Android Studio) users:
-# Gradle settings configured through the IDE *will override*
-# any settings specified in this file.
-# For more details on how to configure your build environment visit
-# http://www.gradle.org/docs/current/userguide/build_environment.html
-# Specifies the JVM arguments used for the daemon process.
-# The setting is particularly useful for tweaking memory settings.
org.gradle.jvmargs=-Xmx1536m
-# When configured, Gradle will run in incubating parallel mode.
-# This option should only be used with decoupled projects. More details, visit
-# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
-# org.gradle.parallel=true
-
-
+org.gradle.parallel=true
+android.useAndroidX=true
\ No newline at end of file
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index 62e02ba..ba34cc6 100755
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,5 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip
+