From bd77fa8ac29f420fe5a5a39d0a2be3f02288c74b Mon Sep 17 00:00:00 2001 From: Matthew Date: Sat, 14 Oct 2023 12:31:36 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=8B=8D=E7=85=A7=E8=B5=84?= =?UTF-8?q?=E6=BA=90=E9=87=8A=E6=94=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/cpp/PhoneDevice.cpp | 47 +++++++++++++------ app/src/main/cpp/PhoneDevice.h | 25 +++++----- app/src/main/cpp/camera2/ndkcamera.cpp | 10 ++-- app/src/main/cpp/camera2/ndkcamera.h | 6 +-- .../xinyingpower/microphoto/MainActivity.java | 2 +- .../microphoto/MicroPhotoService.java | 3 +- sign.pwd.txt | 1 + 7 files changed, 58 insertions(+), 36 deletions(-) create mode 100644 sign.pwd.txt diff --git a/app/src/main/cpp/PhoneDevice.cpp b/app/src/main/cpp/PhoneDevice.cpp index ddc75b94..d5be5008 100644 --- a/app/src/main/cpp/PhoneDevice.cpp +++ b/app/src/main/cpp/PhoneDevice.cpp @@ -136,7 +136,7 @@ CPhoneDevice::CPhoneCamera::CPhoneCamera(CPhoneDevice* dev, int32_t width, int32 { } -bool CPhoneDevice::CPhoneCamera::on_image(const cv::Mat& rgb) const +bool CPhoneDevice::CPhoneCamera::on_image(const cv::Mat& rgb) { if (m_dev != NULL) { @@ -146,7 +146,7 @@ bool CPhoneDevice::CPhoneCamera::on_image(const cv::Mat& rgb) const return false; } -void CPhoneDevice::CPhoneCamera::on_error(const std::string& msg) const +void CPhoneDevice::CPhoneCamera::on_error(const std::string& msg) { if (m_dev != NULL) { @@ -353,7 +353,7 @@ bool CPhoneDevice::EnableGPS(bool enabled) if (!res) { ALOGE("Failed to get JNI Env"); - return 0; + return false; } jboolean jenabled = enabled ? JNI_TRUE : JNI_FALSE; env->CallVoidMethod(m_javaService, mEnableGpsMid, jenabled); @@ -361,6 +361,8 @@ bool CPhoneDevice::EnableGPS(bool enabled) { m_vm->DetachCurrentThread(); } + + return true; } bool CPhoneDevice::RequestPosition() @@ -371,7 +373,7 @@ bool CPhoneDevice::RequestPosition() if (!res) { ALOGE("Failed to get JNI Env"); - return 0; + return false; } jboolean ret = env->CallBooleanMethod(m_javaService, mRequestPositionMid); @@ -579,15 +581,23 @@ bool CPhoneDevice::TakePhoto(const IDevice::PHOTO_INFO& photoInfo, const vector< bool CPhoneDevice::CloseCamera() { - if (mCamera != NULL) + // if (mCamera != NULL) { - delete mCamera; - mCamera = NULL; + // mCamera->close(); + // delete mCamera; + // mCamera = NULL; } return true; } -bool CPhoneDevice::OnImageReady(const cv::Mat& mat) const +void CPhoneDevice::CloseCamera2(CPhoneDevice::CPhoneCamera* camera) +{ + std::this_thread::sleep_for(std::chrono::milliseconds(16)); + camera->close(); + delete camera; +} + +bool CPhoneDevice::OnImageReady(const cv::Mat& mat) { int baseline = 0; cv::Size textSize, textSize2; @@ -640,6 +650,7 @@ bool CPhoneDevice::OnImageReady(const cv::Mat& mat) const compression_params.push_back(cv::IMWRITE_JPEG_QUALITY); compression_params.push_back(mPhotoInfo.quality); + bool res = false; if (!std::filesystem::exists(std::filesystem::path(mPath))) { bool res = cv::imwrite(mPath.c_str(), mat, compression_params); @@ -652,27 +663,33 @@ bool CPhoneDevice::OnImageReady(const cv::Mat& mat) const ALOGI("Succeeded to write photo: %s", mPath.c_str()); } TakePhotoCb(res, mPhotoInfo, mPath, time(NULL)); - return res; } else { ALOGI("Photo file exists: %s", mPath.c_str()); } - // mCamera->close(); - // delete mCamera; - // mCamera = NULL; - return true; + CPhoneCamera* pCamera = mCamera; + mCamera = NULL; + + std::thread closeThread(&CPhoneDevice::CloseCamera2, pCamera); + closeThread.detach(); + + return res; } -void CPhoneDevice::onError(const std::string& msg) const +void CPhoneDevice::onError(const std::string& msg) { // XFLOG(XFLOG_SEVERITY_ERROR, "Failed to Take Photo: %s", msg.c_str()); ALOGE("Failed to Take Photo: %s", msg.c_str()); - // mCamera->close(); + CPhoneCamera* pCamera = mCamera; + mCamera = NULL; TakePhotoCb(false, mPhotoInfo, mPath, 0); + + std::thread closeThread(&CPhoneDevice::CloseCamera2, pCamera); + closeThread.detach(); } std::string CPhoneDevice::GetFileName() const diff --git a/app/src/main/cpp/PhoneDevice.h b/app/src/main/cpp/PhoneDevice.h index f2b2b58a..522e294c 100644 --- a/app/src/main/cpp/PhoneDevice.h +++ b/app/src/main/cpp/PhoneDevice.h @@ -28,6 +28,17 @@ class CPhoneDevice : public IDevice { public: + + class CPhoneCamera : public NdkCamera { + public: + CPhoneCamera(CPhoneDevice* dev, int32_t width, int32_t height); + virtual bool on_image(const cv::Mat& rgb); + virtual void on_error(const std::string& msg); + + protected: + CPhoneDevice* m_dev; + }; + CPhoneDevice(JavaVM* vm, jobject service); virtual ~CPhoneDevice(); @@ -70,9 +81,10 @@ protected: void QueryPowerInfo(std::map& powerInfo); - bool OnImageReady(const cv::Mat& mat) const; - void onError(const std::string& msg) const; + bool OnImageReady(const cv::Mat& mat); + void onError(const std::string& msg); + static void CloseCamera2(CPhoneCamera* camera); protected: JavaVM* m_vm; @@ -101,15 +113,6 @@ protected: atomic_ulong m_wakelockIdFeed; std::map mTimers; - class CPhoneCamera : public NdkCamera { - public: - CPhoneCamera(CPhoneDevice* dev, int32_t width, int32_t height); - virtual bool on_image(const cv::Mat& rgb) const; - virtual void on_error(const std::string& msg) const; - - protected: - CPhoneDevice* m_dev; - }; mutable CPhoneCamera* mCamera; diff --git a/app/src/main/cpp/camera2/ndkcamera.cpp b/app/src/main/cpp/camera2/ndkcamera.cpp index 9305fc62..16071117 100644 --- a/app/src/main/cpp/camera2/ndkcamera.cpp +++ b/app/src/main/cpp/camera2/ndkcamera.cpp @@ -414,8 +414,6 @@ int NdkCamera::open(const char* cameraId) { void NdkCamera::close() { - __android_log_print(ANDROID_LOG_WARN, "NdkCamera", "DBG::close %s", mCameraId.c_str()); - if (capture_session) { ACameraCaptureSession_stopRepeating(capture_session); @@ -457,6 +455,8 @@ void NdkCamera::close() { ACameraManager_delete(camera_manager); camera_manager = 0; + + __android_log_print(ANDROID_LOG_WARN, "NdkCamera", "DBG::close %s", mCameraId.c_str()); } } @@ -562,16 +562,16 @@ void NdkCamera::onImageAvailable(AImageReader* reader) AImage_delete(image); } -void NdkCamera::on_error(const std::string& msg) const +void NdkCamera::on_error(const std::string& msg) { } -bool NdkCamera::on_image(const cv::Mat& rgb) const +bool NdkCamera::on_image(const cv::Mat& rgb) { return false; } -void NdkCamera::on_image(const unsigned char* nv21, int nv21_width, int nv21_height) const +void NdkCamera::on_image(const unsigned char* nv21, int nv21_width, int nv21_height) { __android_log_print(ANDROID_LOG_WARN, "NdkCamera", "nv21 size: %d x %d", nv21_width, nv21_height); // rotate nv21 diff --git a/app/src/main/cpp/camera2/ndkcamera.h b/app/src/main/cpp/camera2/ndkcamera.h index 14e41d1b..c74454bf 100644 --- a/app/src/main/cpp/camera2/ndkcamera.h +++ b/app/src/main/cpp/camera2/ndkcamera.h @@ -46,10 +46,10 @@ public: void close(); void onImageAvailable(AImageReader* reader); - virtual bool on_image(const cv::Mat& rgb) const; - virtual void on_error(const std::string& msg) const; + virtual bool on_image(const cv::Mat& rgb); + virtual void on_error(const std::string& msg); - virtual void on_image(const unsigned char* nv21, int nv21_width, int nv21_height) const; + virtual void on_image(const unsigned char* nv21, int nv21_width, int nv21_height); void onCaptureCompleted(ACameraCaptureSession* session, ACaptureRequest* request, const ACameraMetadata* result); diff --git a/app/src/main/java/com/xinyingpower/microphoto/MainActivity.java b/app/src/main/java/com/xinyingpower/microphoto/MainActivity.java index 98279642..921ea955 100644 --- a/app/src/main/java/com/xinyingpower/microphoto/MainActivity.java +++ b/app/src/main/java/com/xinyingpower/microphoto/MainActivity.java @@ -101,7 +101,7 @@ public class MainActivity extends AppCompatActivity { AppConfig appConfig = getAppConfig(); binding.cmdid.setText(appConfig.cmdid); binding.server.setText(appConfig.server); - binding.port.setText(Integer.toString(appConfig.port)); + binding.port.setText(appConfig.port != 0 ? Integer.toString(appConfig.port) : ""); this.binding.startServBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { diff --git a/app/src/main/java/com/xinyingpower/microphoto/MicroPhotoService.java b/app/src/main/java/com/xinyingpower/microphoto/MicroPhotoService.java index 463ee952..9cda62d5 100644 --- a/app/src/main/java/com/xinyingpower/microphoto/MicroPhotoService.java +++ b/app/src/main/java/com/xinyingpower/microphoto/MicroPhotoService.java @@ -629,7 +629,8 @@ public class MicroPhotoService extends Service { private String buildPhotoFileName(int channel, int preset, long ts) { - String date = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")); + LocalDateTime nowDT = LocalDateTime.now(); + String date = nowDT.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss.S")); String photoFile = "img_" + Integer.toString(channel) + "_" + Integer.toHexString(preset).toUpperCase() + "_" + date + ".jpg"; return photoFile; } diff --git a/sign.pwd.txt b/sign.pwd.txt new file mode 100644 index 00000000..ca04a8d7 --- /dev/null +++ b/sign.pwd.txt @@ -0,0 +1 @@ +XyMpApp \ No newline at end of file