From f67c8857fe378ed89f2a97090246a8da38562e40 Mon Sep 17 00:00:00 2001 From: BlueMatthew Date: Wed, 29 Nov 2023 11:16:14 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8B=8D=E7=85=A7=E5=8F=82=E6=95=B0=E4=BB=8E?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E6=96=87=E4=BB=B6=E4=B8=AD=E8=AF=BB=E5=8F=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 14 ++- app/src/main/cpp/CMakeLists.txt | 2 + app/src/main/cpp/PhoneDevice.cpp | 24 +++-- app/src/main/cpp/PhoneDevice.h | 2 +- app/src/main/cpp/camera2/ndkcamera.cpp | 61 ++++++------ app/src/main/cpp/camera2/ndkcamera.h | 13 ++- .../java/com/xypower/mpapp/AlarmUtil.java | 93 ++++++++++++++++++ .../xypower/mpapp/BootBroadcastReceiver.java | 14 +-- .../java/com/xypower/mpapp/MainActivity.java | 95 ++++++++++++------- .../com/xypower/mpapp/MicroPhotoService.java | 7 +- 10 files changed, 240 insertions(+), 85 deletions(-) create mode 100644 app/src/main/java/com/xypower/mpapp/AlarmUtil.java diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 32347289..ecfe7e9f 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -52,11 +52,13 @@ android:exported="true" > + + @@ -68,10 +70,14 @@ - - - - + + + + + diff --git a/app/src/main/cpp/CMakeLists.txt b/app/src/main/cpp/CMakeLists.txt index 7e19c71f..ecb7ddc6 100644 --- a/app/src/main/cpp/CMakeLists.txt +++ b/app/src/main/cpp/CMakeLists.txt @@ -290,6 +290,7 @@ add_library( # Sets the name of the library. ${TERM_CORE_ROOT}/SpecData_I1_SHX.cpp ${TERM_CORE_ROOT}/SpecData_XY.cpp ${TERM_CORE_ROOT}/SpecData_ZJ.cpp + ${TERM_CORE_ROOT}/SpecData_NW.cpp ${TERM_CORE_ROOT}/Timer.cpp ${TERM_CORE_ROOT}/TimerThread.cpp ${TERM_CORE_ROOT}/Template.cpp @@ -302,6 +303,7 @@ add_library( # Sets the name of the library. ${TERM_CORE_ROOT}/Client/Terminal_HEN.cpp ${TERM_CORE_ROOT}/Client/Terminal_SHX.cpp ${TERM_CORE_ROOT}/Client/Terminal_JS.cpp + ${TERM_CORE_ROOT}/Client/Terminal_NW.cpp ${TERM_CORE_ROOT}/Client/UpgradeReceiver.cpp ) diff --git a/app/src/main/cpp/PhoneDevice.cpp b/app/src/main/cpp/PhoneDevice.cpp index b4c2fafa..3619d161 100644 --- a/app/src/main/cpp/PhoneDevice.cpp +++ b/app/src/main/cpp/PhoneDevice.cpp @@ -136,7 +136,7 @@ static inline uint32_t YUV2RGB(int nY, int nU, int nV) { return 0xff000000 | (nR << 16) | (nG << 8) | nB; } -CPhoneDevice::CPhoneCamera::CPhoneCamera(CPhoneDevice* dev, int32_t width, int32_t height) : NdkCamera(width, height), m_dev(dev) +CPhoneDevice::CPhoneCamera::CPhoneCamera(CPhoneDevice* dev, int32_t width, int32_t height, const NdkCamera::CAMERA_PARAMS& params) : NdkCamera(width, height, params), m_dev(dev) { } @@ -606,8 +606,16 @@ bool CPhoneDevice::TakePhoto(const IDevice::PHOTO_INFO& photoInfo, const vector< mPath = path; mOsds = osds; - mCamera = new CPhoneCamera(this, photoInfo.width, photoInfo.height); - if (mCamera->open(to_string(photoInfo.channel - 1).c_str()) == 0) + NdkCamera::CAMERA_PARAMS params; + params.hdrMode = mPhotoInfo.hdrMode; + params.nightMode = mPhotoInfo.nightMode; + params.autoFocus = mPhotoInfo.autoFocus; + params.autoExposure = mPhotoInfo.autoExposure; + params.exposureTime = mPhotoInfo.exposureTime; + params.sensibility = mPhotoInfo.sensibility; + + mCamera = new CPhoneCamera(this, photoInfo.width, photoInfo.height, params); + if (mCamera->open(to_string(mPhotoInfo.cameraId).c_str()) == 0) { } else @@ -654,7 +662,7 @@ bool CPhoneDevice::OnImageReady(const cv::Mat& mat) int thickness2 = 1 * ratio; if (thickness2 == 0) thickness2 = 1; - int thickness1 = thickness2 + 3; + int thickness1 = thickness2 + 2; cv::Scalar scalar1(0, 0, 0); // black cv::Scalar scalar2(255, 255, 255); // white @@ -666,8 +674,8 @@ bool CPhoneDevice::OnImageReady(const cv::Mat& mat) { continue; } - textSize = cv::getTextSize(it->text, cv::FONT_HERSHEY_SIMPLEX, fontScale, thickness1, &baseline); - textSize2 = cv::getTextSize(it->text, cv::FONT_HERSHEY_SIMPLEX, fontScale, thickness2, &baseline); + textSize = cv::getTextSize(it->text, cv::FONT_HERSHEY_TRIPLEX, fontScale, thickness1, &baseline); + textSize2 = cv::getTextSize(it->text, cv::FONT_HERSHEY_TRIPLEX, fontScale, thickness2, &baseline); if (it->alignment == OSD_ALIGNMENT_TOP_LEFT) { @@ -700,8 +708,8 @@ bool CPhoneDevice::OnImageReady(const cv::Mat& mat) ALOGE("putText: fontScale=%f w1=%d w2=%d tn=%d/%d", fontScale, textSize.width, textSize2.width, thickness1, thickness2); - cv::putText(mat, it->text, pt1, cv::FONT_HERSHEY_COMPLEX, fontScale, scalar1, thickness1,cv::LINE_AA); - cv::putText(mat, it->text, pt1, cv::FONT_HERSHEY_COMPLEX, fontScale, scalar2, thickness2,cv::LINE_AA); + cv::putText(mat, it->text, pt1, cv::FONT_HERSHEY_TRIPLEX, fontScale, scalar1, thickness1,cv::LINE_AA); + cv::putText(mat, it->text, pt1, cv::FONT_HERSHEY_TRIPLEX, fontScale, scalar2, thickness2,cv::LINE_AA); } diff --git a/app/src/main/cpp/PhoneDevice.h b/app/src/main/cpp/PhoneDevice.h index f62f1d99..62418bba 100644 --- a/app/src/main/cpp/PhoneDevice.h +++ b/app/src/main/cpp/PhoneDevice.h @@ -31,7 +31,7 @@ public: class CPhoneCamera : public NdkCamera { public: - CPhoneCamera(CPhoneDevice* dev, int32_t width, int32_t height); + CPhoneCamera(CPhoneDevice* dev, int32_t width, int32_t height, const NdkCamera::CAMERA_PARAMS& params); virtual bool on_image(const cv::Mat& rgb); virtual void on_error(const std::string& msg); diff --git a/app/src/main/cpp/camera2/ndkcamera.cpp b/app/src/main/cpp/camera2/ndkcamera.cpp index 0a701e4a..b75c70b5 100644 --- a/app/src/main/cpp/camera2/ndkcamera.cpp +++ b/app/src/main/cpp/camera2/ndkcamera.cpp @@ -74,11 +74,12 @@ void onCaptureCompleted(void* context, ACameraCaptureSession* session, ACaptureR ((NdkCamera*)context)->onCaptureCompleted(session, request, result); } -NdkCamera::NdkCamera(int32_t width, int32_t height) +NdkCamera::NdkCamera(int32_t width, int32_t height, const NdkCamera::CAMERA_PARAMS& params) { camera_facing = 0; camera_orientation = 0; + m_params = params; m_firstFrame = true; mWidth = width; mHeight = height; @@ -344,50 +345,57 @@ int NdkCamera::open(const char* cameraId) { int32_t fpsRange[2] = {10,30}; res = ACaptureRequest_setEntry_i32(capture_request, ACAMERA_CONTROL_AE_TARGET_FPS_RANGE,2,fpsRange); - bool usingAE = true; - - if (usingAE) { + if (m_params.autoExposure) { uint8_t aeMode = ACAMERA_CONTROL_AE_MODE_ON; res = ACaptureRequest_setEntry_u8(capture_request, ACAMERA_CONTROL_AE_MODE, 1, &aeMode); // ACaptureRequest_setEntry_i32(capture_request, ACAMERA_SENSOR_SENSITIVITY, 1, &sensitivity_); - uint8_t aeLockOff = ACAMERA_CONTROL_AE_LOCK_OFF; // ACaptureRequest_setEntry_u8(capture_request, ACAMERA_CONTROL_AE_LOCK, 1, &aeLockOff); } else { uint8_t aeMode = ACAMERA_CONTROL_AE_MODE_OFF; res = ACaptureRequest_setEntry_u8(capture_request, ACAMERA_CONTROL_AE_MODE, 1, &aeMode); - uint8_t hdrMode = ACAMERA_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_HDR10; // ACAMERA_CONTROL_SCENE_MODE_HDR - res = ACaptureRequest_setEntry_u8(capture_request, ACAMERA_CONTROL_SCENE_MODE_HDR, 1, &hdrMode); - - int32_t sensitivity = sensitivityRange.value(2); - res = ACaptureRequest_setEntry_i32(capture_request,ACAMERA_SENSOR_SENSITIVITY, 1, &sensitivity); - int64_t exposureTime = exposureRange.value(5); - res = ACaptureRequest_setEntry_i64(capture_request, ACAMERA_SENSOR_EXPOSURE_TIME, 1, &exposureTime); + if (hdrSupported && m_params.hdrMode) { + uint8_t hdrMode = ACAMERA_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_HDR10; // ACAMERA_CONTROL_SCENE_MODE_HDR + // res = ACaptureRequest_setEntry_u8(capture_request, ACAMERA_CONTROL_SCENE_MODE_HDR, 1,&hdrMode); + } + if (m_params.sensibility > 0) { + int32_t sensitivity = m_params.sensibility; + res = ACaptureRequest_setEntry_i32(capture_request, ACAMERA_SENSOR_SENSITIVITY, 1, + &sensitivity); + } + if (m_params.exposureTime > 0) { + int64_t exposureTime = m_params.exposureTime * 1000000; + res = ACaptureRequest_setEntry_i64(capture_request, ACAMERA_SENSOR_EXPOSURE_TIME, 1, + &exposureTime); + } } - // uint8_t afMode = ACAMERA_CONTROL_AF_MODE_CONTINUOUS_VIDEO; - uint8_t afMode = ACAMERA_CONTROL_AF_MODE_CONTINUOUS_PICTURE; - res = ACaptureRequest_setEntry_u8(capture_request, ACAMERA_CONTROL_AF_MODE, 1, &afMode); + if (afSupported && m_params.autoFocus) { + // uint8_t afMode = ACAMERA_CONTROL_AF_MODE_CONTINUOUS_VIDEO; + uint8_t afMode = ACAMERA_CONTROL_AF_MODE_CONTINUOUS_PICTURE; + res = ACaptureRequest_setEntry_u8(capture_request, ACAMERA_CONTROL_AF_MODE, 1, &afMode); + } uint8_t awbMode = ACAMERA_CONTROL_AWB_MODE_AUTO; // res = ACaptureRequest_setEntry_u8(capture_request, ACAMERA_CONTROL_AWB_MODE, 1, &awbMode); - if (hdrSupported) { + if (hdrSupported && m_params.hdrMode) { + // uint8_t hdrMode = ACAMERA_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_HDR10; // ACAMERA_CONTROL_SCENE_MODE_HDR uint8_t hdrMode = ACAMERA_CONTROL_SCENE_MODE_HDR; // ACAMERA_CONTROL_SCENE_MODE_HDR - // res = ACaptureRequest_setEntry_u8(capture_request, ACAMERA_CONTROL_SCENE_MODE_HDR, 1, &hdrMode); - res = ACaptureRequest_setEntry_u8(capture_request, ACAMERA_CONTROL_SCENE_MODE, 1, &hdrMode); - + res = ACaptureRequest_setEntry_u8(capture_request, ACAMERA_CONTROL_SCENE_MODE_HDR, 1,&hdrMode); } - if (nightModeSupported) { - uint8_t modeEnabled = 1; // ACAMERA_CONTROL_SCENE_MODE_HDR - // res = ACaptureRequest_setEntry_u8(capture_request, ACAMERA_CONTROL_SCENE_MODE_NIGHT, 1, &modeEnabled); - } - if (nightPortraitModeSupported) { - uint8_t modeEnabled = 1; // ACAMERA_CONTROL_SCENE_MODE_HDR - // res = ACaptureRequest_setEntry_u8(capture_request, ACAMERA_CONTROL_SCENE_MODE_NIGHT_PORTRAIT, 1, &modeEnabled); + if (m_params.nightMode) { + if (nightModeSupported) { + uint8_t modeEnabled = 1; // ACAMERA_CONTROL_SCENE_MODE_HDR + // res = ACaptureRequest_setEntry_u8(capture_request, ACAMERA_CONTROL_SCENE_MODE_NIGHT, 1, &modeEnabled); + } + if (nightPortraitModeSupported) { + uint8_t modeEnabled = 1; // ACAMERA_CONTROL_SCENE_MODE_HDR + // res = ACaptureRequest_setEntry_u8(capture_request, ACAMERA_CONTROL_SCENE_MODE_NIGHT_PORTRAIT, 1, &modeEnabled); + } } res = ACameraOutputTarget_create(image_reader_surface, &image_reader_target); @@ -622,7 +630,6 @@ void NdkCamera::on_image(const unsigned char* nv21, int nv21_width, int nv21_hei rotate_type = camera_facing == 0 ? 7 : 8; } - cv::Mat nv21_rotated(h + h / 2, w, CV_8UC1); ncnn::kanna_rotate_yuv420sp(nv21, nv21_width, nv21_height, nv21_rotated.data, w, h, rotate_type); diff --git a/app/src/main/cpp/camera2/ndkcamera.h b/app/src/main/cpp/camera2/ndkcamera.h index 5965bb90..e9fabc3b 100644 --- a/app/src/main/cpp/camera2/ndkcamera.h +++ b/app/src/main/cpp/camera2/ndkcamera.h @@ -37,8 +37,16 @@ class NdkCamera { public: - - NdkCamera(int32_t width, int32_t height); + struct CAMERA_PARAMS { + unsigned int hdrMode : 1; + unsigned int nightMode : 1; + unsigned int autoFocus : 1; + unsigned int autoExposure : 1; + unsigned int exposureTime; // ms + unsigned int sensibility; + }; + + NdkCamera(int32_t width, int32_t height, const CAMERA_PARAMS& params); virtual ~NdkCamera(); // facing 0=front 1=back @@ -55,6 +63,7 @@ public: public: + CAMERA_PARAMS m_params; int camera_facing; int camera_orientation; bool m_firstFrame; diff --git a/app/src/main/java/com/xypower/mpapp/AlarmUtil.java b/app/src/main/java/com/xypower/mpapp/AlarmUtil.java new file mode 100644 index 00000000..3b666446 --- /dev/null +++ b/app/src/main/java/com/xypower/mpapp/AlarmUtil.java @@ -0,0 +1,93 @@ +package com.xypower.mpapp; + +import static android.content.Context.ALARM_SERVICE; + +import android.app.AlarmManager; +import android.app.PendingIntent; +import android.content.Context; +import android.content.Intent; +import android.text.format.DateFormat; +import android.util.Log; + +import java.util.Date; +import java.util.List; + +public class AlarmUtil { + + public final static String TAG = "MPLOG"; + public final static long MASK_CHANNEL = 0xFF00L; + public final static long MASK_PRESET = 0xFF0000L; + public final static long MASK_SCHEDULE_TIME = 0xFFFFFF000000L; + + public final static int SHIFT_CHANNEL = 8; + public final static int SHIFT_PRESET = 16; + public final static int SHIFT_SCHEDULE_TIME = 24; + + private static final String ACTION_TAKE_PHOTO = "ACT_TP"; + + private static final String EXTRA_PARAM_CHANNEL = "Channel"; + private static final String EXTRA_PARAM_PRESET = "Preset"; + private static final String EXTRA_PARAM_PHOTO_OR_VIDEO = "PhotoOrVideo"; + private static final String EXTRA_PARAM_SCHEDULES = "Schedules"; + private static final String EXTRA_PARAM_SCHEDULE = "Schedule_"; + + private static final String EXTRA_PARAM_TIME = "Time"; + + public static void registerPhotoTimer(Context context, int channel, int preset, long ts, long timeout, List schedules) { + + // 创建延迟意图 + Intent alarmIntent = new Intent(); + alarmIntent.setAction(ACTION_TAKE_PHOTO); + int cnt = schedules.size(); + alarmIntent.putExtra(EXTRA_PARAM_SCHEDULES, cnt); + String channelStr = ""; + for (int idx = 0; idx < cnt; idx++) { + long val = schedules.get(idx).longValue(); + alarmIntent.putExtra(EXTRA_PARAM_SCHEDULE + idx, schedules.get(idx).longValue()); + channelStr += "CH=" + ((val & 0XFF0000) >> 16) + "-PR=" + ((val & 0XFF00) >> 8) + " "; + } + + alarmIntent.putExtra(EXTRA_PARAM_TIME, ts); + + PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT); + + AlarmManager alarmManager = (AlarmManager) context.getSystemService(ALARM_SERVICE); + + long currentTimeMillis = System.currentTimeMillis(); + Date date = new Date(currentTimeMillis + timeout); + String dateStr = (String) DateFormat.format("MM-dd kk:mm:ss", date); + Log.d(TAG, "PhotoTimer Reg: " + dateStr + " currentTimeMillis=" + currentTimeMillis + " timeout=" + timeout + " Channels=" + channelStr); + + alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + timeout, pendingIntent); + } + + public static boolean parseTakingPhotoAlarm(Intent intent) { + + long ts = intent.getLongExtra(EXTRA_PARAM_TIME, 0); + int cnt = intent.getIntExtra(EXTRA_PARAM_SCHEDULES, 0); + if (cnt > 0) { + for (int idx = 0; idx < cnt; idx++) { + long val = intent.getLongExtra(EXTRA_PARAM_SCHEDULE + idx, 0); + + int channel = (int) ((val & 0xFF0000L) >> 16); + int preset = (int) ((val & 0xFF00L) >> 8); + + Log.i(TAG, "PhotoTimer Fired: CH=" + channel + " PR=" + preset); + // mService.notifyToTakePhoto(mService.mNativeHandle, channel, preset, ts, mService.buildPhotoDir(mService.getApplicationContext(), channel), mService.buildPhotoFileName(channel, preset, ts), true); + } + } + + // Register Next Photo Timer + Date date = new Date(); + long nowTs = date.getTime() / 1000; + date.setHours(0); + date.setMinutes(0); + date.setSeconds(0); + long startTime = date.getTime() / 1000; + long baseTime = nowTs - startTime; + + return true; + } + + +} diff --git a/app/src/main/java/com/xypower/mpapp/BootBroadcastReceiver.java b/app/src/main/java/com/xypower/mpapp/BootBroadcastReceiver.java index 6c0adede..6ead8443 100644 --- a/app/src/main/java/com/xypower/mpapp/BootBroadcastReceiver.java +++ b/app/src/main/java/com/xypower/mpapp/BootBroadcastReceiver.java @@ -11,13 +11,11 @@ public class BootBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { - // Log.e("接收广播", "onReceive: "); - // Log.e("接收广播", "onReceive: " + intent.getAction()); - //开机启动 + + Log.i("BootBroadcastReceiver", intent.getAction()); + if (ACTION.equals(intent.getAction())) { - // Log.e("接收广播", "onReceive: 启动了。。。"); - Log.i("BootBroadcastReceiver", "Start MainActivity"); /* Intent mainIntent = new Intent(context, MainActivity.class); @@ -31,6 +29,10 @@ public class BootBroadcastReceiver extends BroadcastReceiver { } */ + MainActivity.AppConfig appConfig = MainActivity.getAppConfig(context); + + MainActivity.startMicroPhotoService(context, appConfig); + /* Intent mainIntent = new Intent(context, MainActivity.class); mainIntent.putExtra("reboot", 1); //Intent.FLAG_ACTIVITY_NEW_TASK @@ -38,7 +40,7 @@ public class BootBroadcastReceiver extends BroadcastReceiver { mainIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(mainIntent); -// context.startService(mainIntent); + */ } } } diff --git a/app/src/main/java/com/xypower/mpapp/MainActivity.java b/app/src/main/java/com/xypower/mpapp/MainActivity.java index 98a22d5d..a35d6ae9 100644 --- a/app/src/main/java/com/xypower/mpapp/MainActivity.java +++ b/app/src/main/java/com/xypower/mpapp/MainActivity.java @@ -113,15 +113,8 @@ public class MainActivity extends AppCompatActivity { } - @Override - protected void onDestroy() { - if (mLogFileObserver != null) { - mLogFileObserver.stopWatching(); - } - super.onDestroy(); - } - protected class AppConfig { + public static class AppConfig { public String cmdid; public String server; public int port; @@ -144,7 +137,7 @@ public class MainActivity extends AppCompatActivity { binding.logs.setText(""); binding.logs.setMovementMethod(ScrollingMovementMethod.getInstance()); binding.logs.setScrollbarFadingEnabled(false); - + // binding.logs.setMaxLines(16); mHandler = new Handler(Looper.myLooper()) { @Override @@ -200,11 +193,6 @@ public class MainActivity extends AppCompatActivity { }; mMessenger = new Messenger(new Handler()); - String logFilePath = MicroPhotoService.buildAppDir(this.getApplicationContext()); - logFilePath += "logs/log.txt"; - mLogFileObserver = new LogFileObserver(logFilePath); - mLogFileObserver.startWatching(); - WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE); Display defaultDisplay = windowManager.getDefaultDisplay(); int width = defaultDisplay.getWidth(); @@ -260,29 +248,9 @@ public class MainActivity extends AppCompatActivity { return; } - int channel = 2; - String path = buildPhotoDir(channel); - String fileName = buildPhotoFileName(channel, 255); - AppConfig curAppConfig = retrieveAndSaveAppConfig(); - if (TextUtils.isEmpty(curAppConfig.cmdid) || TextUtils.isEmpty(curAppConfig.server) || curAppConfig.port == 0) { - return; - } - Intent intent = new Intent(MainActivity.this, MicroPhotoService.class); - intent.setAction(MicroPhotoService.ACTION_START); - intent.putExtra("cmdid", curAppConfig.cmdid); - intent.putExtra("server", curAppConfig.server); - intent.putExtra("port", curAppConfig.port); - intent.putExtra("protocol", curAppConfig.protocol); - intent.putExtra("networkProtocol", curAppConfig.networkProtocol); - intent.putExtra("messenger", mMessenger); - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - MainActivity.this.startForegroundService(intent); - } else { - MainActivity.this.startService(intent); - } + startMicroPhotoService(MainActivity.this, appConfig); binding.startServBtn.setEnabled(false); binding.stopServBtn.setEnabled(true); @@ -478,6 +446,57 @@ public class MainActivity extends AppCompatActivity { } + public static void startMicroPhotoService(Context context, AppConfig curAppConfig) { + + if (TextUtils.isEmpty(curAppConfig.cmdid) || TextUtils.isEmpty(curAppConfig.server) || curAppConfig.port == 0) { + return; + } + Intent intent = new Intent(context, MicroPhotoService.class); + intent.setAction(MicroPhotoService.ACTION_START); + intent.putExtra("cmdid", curAppConfig.cmdid); + intent.putExtra("server", curAppConfig.server); + intent.putExtra("port", curAppConfig.port); + intent.putExtra("protocol", curAppConfig.protocol); + intent.putExtra("networkProtocol", curAppConfig.networkProtocol); + // intent.putExtra("messenger", mMessenger); + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + context.startForegroundService(intent); + } else { + context.startService(intent); + } + } + + @Override + protected void onStart() { + // call the superclass method first + super.onStart(); + + String logFilePath = MicroPhotoService.buildAppDir(this.getApplicationContext()); + logFilePath += "logs/log.txt"; + + mLogFileObserver = new LogFileObserver(logFilePath); + mLogFileObserver.startWatching(); + } + + @Override + protected void onStop() { + // call the superclass method first + super.onStop(); + + if (mLogFileObserver != null) { + mLogFileObserver.stopWatching(); + mLogFileObserver = null; + } + } + + + @Override + protected void onDestroy() { + + super.onDestroy(); + } + private void setDefaultDataSubId(int subId) { SubscriptionManager subscriptionManager = (SubscriptionManager) getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE); try { @@ -512,10 +531,14 @@ public class MainActivity extends AppCompatActivity { } private AppConfig getAppConfig() { + return getAppConfig(this.getApplicationContext()); + } + + public static AppConfig getAppConfig(Context context) { AppConfig appConfig = new AppConfig(); - String appPath = MicroPhotoService.buildAppDir(this.getApplicationContext()); + String appPath = MicroPhotoService.buildAppDir(context); InputStreamReader inputStreamReader = null; BufferedReader bufferedReader = null; diff --git a/app/src/main/java/com/xypower/mpapp/MicroPhotoService.java b/app/src/main/java/com/xypower/mpapp/MicroPhotoService.java index 2df4a6b0..2cc5b714 100644 --- a/app/src/main/java/com/xypower/mpapp/MicroPhotoService.java +++ b/app/src/main/java/com/xypower/mpapp/MicroPhotoService.java @@ -69,6 +69,7 @@ public class MicroPhotoService extends Service { private static final String ALARM_EVENT = "com.xinyingpower.mp.MicroPhotoService.AlarmReceiver"; public static final int NOTIFICATION_ID_FOREGROUND_SERVICE = 8466503; + // public static final int NOTIFICATION_ID_FOREGROUND_SERVICE = 0; public static final String ACTION_START = "ACT_START"; public static final String ACTION_STOP = "ACT_STOP"; public static final String ACTION_MAIN = "ACT_MAIN"; @@ -180,6 +181,8 @@ public class MicroPhotoService extends Service { mStateService = STATE_SERVICE.NOT_CONNECTED; + Log.w(TAG, "MicroPhotoService::onDestroy called"); + uninit(mNativeHandle); mNativeHandle = 0; @@ -512,7 +515,9 @@ public class MicroPhotoService extends Service { connect(); registerReceiver(mScreenaAtionReceiver, mScreenaAtionReceiver.getFilter()); - mMessenger = intent.getParcelableExtra("messenger"); + if (intent.hasExtra("messenger")) { + mMessenger = intent.getParcelableExtra("messenger"); + } String appPath = buildAppDir(this.getApplicationContext());