From eacbd1cd4837effb6eb05bd4cb3f534fac601777 Mon Sep 17 00:00:00 2001 From: Matthew Date: Tue, 12 Sep 2023 14:28:04 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=96=B9=E5=90=91/=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0wakelock=E6=8E=A7=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/cpp/PhoneDevice.cpp | 20 ++- app/src/main/cpp/PhoneDevice.h | 1 + app/src/main/cpp/camera2/ndkcamera.cpp | 18 +-- .../xinyingpower/microphoto/MainActivity.java | 136 ++++++++++++++---- .../microphoto/MicroPhotoService.java | 16 +-- app/src/main/res/layout/activity_main.xml | 13 ++ 6 files changed, 147 insertions(+), 57 deletions(-) diff --git a/app/src/main/cpp/PhoneDevice.cpp b/app/src/main/cpp/PhoneDevice.cpp index 6af7054d..9d2acf2a 100644 --- a/app/src/main/cpp/PhoneDevice.cpp +++ b/app/src/main/cpp/PhoneDevice.cpp @@ -468,18 +468,24 @@ bool CPhoneDevice::OnImageReady(const cv::Mat& mat) const compression_params.push_back(mPhotoInfo.quality); ALOGI("Will write photo: %s", mPath.c_str()); - bool res = cv::imwrite(mPath.c_str(), mat, compression_params); - if (!res) + if (!std::filesystem::exists(std::filesystem::path(mPath))) { - ALOGE("Failed to write photo: %s", mPath.c_str()); + bool res = cv::imwrite(mPath.c_str(), mat, compression_params); + if (!res) + { + ALOGE("Failed 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(); - - TakePhotoCb(res, mPhotoInfo, mPath, time(NULL)); - // delete mCamera; // mCamera = NULL; - return res; + return true; } void CPhoneDevice::onError(const std::string& msg) const diff --git a/app/src/main/cpp/PhoneDevice.h b/app/src/main/cpp/PhoneDevice.h index dde8e781..ab7ba5a8 100644 --- a/app/src/main/cpp/PhoneDevice.h +++ b/app/src/main/cpp/PhoneDevice.h @@ -11,6 +11,7 @@ #include #include +#include #include #include diff --git a/app/src/main/cpp/camera2/ndkcamera.cpp b/app/src/main/cpp/camera2/ndkcamera.cpp index ece74ec7..e61bcb23 100644 --- a/app/src/main/cpp/camera2/ndkcamera.cpp +++ b/app/src/main/cpp/camera2/ndkcamera.cpp @@ -91,8 +91,6 @@ NdkCamera::NdkCamera(int32_t width, int32_t height) capture_session_output_container = 0; capture_session_output = 0; capture_session = 0; - - } NdkCamera::~NdkCamera() @@ -289,8 +287,8 @@ int NdkCamera::open(const char* cameraId) camera_capture_session_capture_callbacks.onCaptureSequenceAborted = onCaptureSequenceAborted; camera_capture_session_capture_callbacks.onCaptureBufferLost = 0; - ACameraCaptureSession_setRepeatingRequest(capture_session, &camera_capture_session_capture_callbacks, 1, &capture_request, nullptr); - // ACameraCaptureSession_capture(capture_session, &camera_capture_session_capture_callbacks, 1, &capture_request,nullptr); + // ACameraCaptureSession_setRepeatingRequest(capture_session, &camera_capture_session_capture_callbacks, 1, &capture_request, nullptr); + ACameraCaptureSession_capture(capture_session, &camera_capture_session_capture_callbacks, 1, &capture_request,nullptr); } return 0; @@ -454,6 +452,7 @@ void NdkCamera::on_error(const std::string& msg) const bool NdkCamera::on_image(const cv::Mat& rgb) const { + return false; } void NdkCamera::on_image(const unsigned char* nv21, int nv21_width, int nv21_height) const @@ -464,7 +463,8 @@ void NdkCamera::on_image(const unsigned char* nv21, int nv21_width, int nv21_hei int h = 0; int rotate_type = 0; // TODO !!!??? - int co = camera_orientation > 0 ? camera_orientation - 90 : camera_orientation; + // int co = camera_orientation > 0 ? camera_orientation + 90 : camera_orientation; + int co = (camera_orientation + 90) % 360; // int co = 0; if (co == 0) { @@ -512,12 +512,6 @@ void NdkCamera::on_image(const unsigned char* nv21, int nv21_width, int nv21_hei // cv::Mat rgb(h, w, CV_8UC3); // ncnn::yuv420sp2rgb_nv12(nv21, w, h, rgb.data); - if (on_image(rgb)) - { - if (capture_session) - { - ACameraCaptureSession_stopRepeating(capture_session); - } - } + on_image(rgb); } diff --git a/app/src/main/java/com/xinyingpower/microphoto/MainActivity.java b/app/src/main/java/com/xinyingpower/microphoto/MainActivity.java index 0bc9881a..d88e7f1e 100644 --- a/app/src/main/java/com/xinyingpower/microphoto/MainActivity.java +++ b/app/src/main/java/com/xinyingpower/microphoto/MainActivity.java @@ -27,14 +27,24 @@ import android.view.WindowManager; import com.dowse.camera.client.DSCameraManager; import com.xinyingpower.microphoto.databinding.ActivityMainBinding; +import java.io.BufferedReader; import java.io.File; +import java.io.FileInputStream; import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.OutputStreamWriter; +import java.io.UnsupportedEncodingException; import java.lang.reflect.Method; import java.text.SimpleDateFormat; import java.util.Date; import android.content.SharedPreferences; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + public class MainActivity extends AppCompatActivity { @@ -54,32 +64,43 @@ public class MainActivity extends AppCompatActivity { super.onDestroy(); } + protected class AppConfig { + public String cmdid; + public String server; + public int port; + public int protocol; + } + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = ActivityMainBinding.inflate(getLayoutInflater()); setContentView(binding.getRoot()); - getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); + // getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE); Display defaultDisplay = windowManager.getDefaultDisplay(); int width = defaultDisplay.getWidth(); int height = defaultDisplay.getHeight(); + Log.d(TAG, "Screen Size: " + width + " x " + height); - SharedPreferences sp = MainActivity.this.getApplicationContext().getSharedPreferences("xymp", Context.MODE_PRIVATE); - binding.cmdid.setText(sp.getString("cmdid", "XY-ANDROIDSIM-001")); - binding.server.setText(sp.getString("server", "47.96.238.157")); - binding.port.setText(sp.getString("port", "6891")); + String cmdid = "0123456789ABCDEFG"; + String server = "47.96.238.157"; + Integer port = new Integer(6891); + Integer protocol = new Integer(0xFF00); // 0xFF00 + + AppConfig appConfig = getAppConfig(); + binding.cmdid.setText(appConfig.cmdid); + binding.server.setText(appConfig.server); + binding.port.setText(Integer.toString(appConfig.port)); this.binding.startServBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { - - String[] accessPermissions = new String[]{ Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE, @@ -109,19 +130,19 @@ public class MainActivity extends AppCompatActivity { String fileName = buildPhotoFileName(channel, 255); // MainActivity.this.takePhoto(channel, 255, path, fileName); - SharedPreferences sp = MainActivity.this.getApplicationContext().getSharedPreferences("xymp", Context.MODE_PRIVATE); - SharedPreferences.Editor editor = sp.edit(); - editor.putString("cmdid", MainActivity.this.binding.cmdid.getText().toString()); - editor.putString("server", MainActivity.this.binding.server.getText().toString()); - editor.putString("port", MainActivity.this.binding.port.getText().toString()); - editor.commit(); + String cmdid = MainActivity.this.binding.cmdid.getText().toString(); + String server = MainActivity.this.binding.server.getText().toString(); + int port = Integer.parseInt(MainActivity.this.binding.port.getText().toString()); + int protocol = 0xFF00; + + MainActivity.this.saveAppConfig(cmdid, server, port, protocol); Intent intent = new Intent(MainActivity.this, MicroPhotoService.class); intent.setAction(MicroPhotoService.ACTION_START); - intent.putExtra("cmdid", MainActivity.this.binding.cmdid.getText().toString()); - intent.putExtra("server", MainActivity.this.binding.server.getText().toString()); - String port = MainActivity.this.binding.port.getText().toString(); - intent.putExtra("port", Integer.parseInt(port)); + intent.putExtra("cmdid", cmdid); + intent.putExtra("server", server); + intent.putExtra("port", port); + intent.putExtra("protocol", protocol); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { MainActivity.this.startForegroundService(intent); @@ -131,10 +152,7 @@ public class MainActivity extends AppCompatActivity { binding.startServBtn.setEnabled(false); binding.stopServBtn.setEnabled(true); - } - - }); this.binding.takePhotoBtn.setOnClickListener(new View.OnClickListener() { @@ -181,11 +199,8 @@ public class MainActivity extends AppCompatActivity { binding.startServBtn.setEnabled(true); binding.stopServBtn.setEnabled(false); } - - }); - binding.simchange.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { @@ -218,7 +233,6 @@ public class MainActivity extends AppCompatActivity { } }; handler.postDelayed(runnable, 1000); - } private void setDefaultDataSubId(int subId) { @@ -232,7 +246,81 @@ public class MainActivity extends AppCompatActivity { } catch (Exception e) { Log.e(TAG, "wjz debug setDefaultDataSubId: error is " + e.getMessage()); } + } + + private AppConfig getAppConfig() { + + AppConfig appConfig = new AppConfig(); + + String appPath = MicroPhotoService.buildAppDir(this.getApplicationContext()); + + InputStreamReader inputStreamReader = null; + try { + inputStreamReader = new InputStreamReader(new FileInputStream(new File(appPath + "App.json")), "UTF-8"); + BufferedReader bufferedReader = new BufferedReader(inputStreamReader); + String line; + StringBuilder stringBuilder = new StringBuilder(); + while((line = bufferedReader.readLine()) != null) { + stringBuilder.append(line); + } + bufferedReader.close(); + + JSONObject jsonObject = new JSONObject(stringBuilder.toString()); + appConfig.cmdid = jsonObject.getString("CMDID"); + appConfig.server = jsonObject.getString("Server"); + appConfig.port = jsonObject.getInt("Port"); + appConfig.protocol = jsonObject.getInt("Protocol"); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } catch (JSONException e) { + e.printStackTrace(); + } + finally { + if (inputStreamReader != null) { + try { + inputStreamReader.close(); + } catch (Exception ex) { + } + + } + } + + return appConfig; + } + private void saveAppConfig(String cmdid, String server, int port, int protocol) { + + String appPath = MicroPhotoService.buildAppDir(this.getApplicationContext()); + + OutputStreamWriter outputStreamWriter = null; + try { + + JSONObject jsonObject = new JSONObject(); + jsonObject.put("CMDID", cmdid); + jsonObject.put("Server", server); + jsonObject.put("Port", port); + jsonObject.put("Protocol", protocol); + + outputStreamWriter = new OutputStreamWriter(new FileOutputStream(new File(appPath + "App.json")), "UTF-8"); + outputStreamWriter.write(jsonObject.toString()); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } catch (JSONException e) { + e.printStackTrace(); + } + finally { + if (outputStreamWriter != null) { + try { + outputStreamWriter.close(); + } catch (Exception ex) { + } + + } + } } private int getDefaultDataSubId() { diff --git a/app/src/main/java/com/xinyingpower/microphoto/MicroPhotoService.java b/app/src/main/java/com/xinyingpower/microphoto/MicroPhotoService.java index 273420cc..bf6c4867 100644 --- a/app/src/main/java/com/xinyingpower/microphoto/MicroPhotoService.java +++ b/app/src/main/java/com/xinyingpower/microphoto/MicroPhotoService.java @@ -94,8 +94,6 @@ public class MicroPhotoService extends Service { private NotificationManager mNotificationManager; - private PowerManager.WakeLock wakeLock = null; - private Map mWakeLocks = new HashMap<>(); private int mHeartbeatDuration = 0; // 5m: 5 * 60 * 1000 @@ -117,11 +115,6 @@ public class MicroPhotoService extends Service { public void onCreate() { super.onCreate(); - PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE); - wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, - "MicroPhoto::MyWakelockTag"); - wakeLock.acquire(); - mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); stateService = STATE_SERVICE.NOT_CONNECTED; @@ -166,11 +159,6 @@ public class MicroPhotoService extends Service { unregisterReceiver(alarmReceiver); - if (wakeLock != null) { - wakeLock.release(); - wakeLock = null; - } - for(Map.Entry entry : mWakeLocks.entrySet()) { entry.getValue().release(); } @@ -597,7 +585,7 @@ public class MicroPhotoService extends Service { } - public String buildAppDir(Context contxt) { + public static String buildAppDir(Context contxt) { File[] paths = contxt.getExternalFilesDirs(null); @@ -617,7 +605,7 @@ public class MicroPhotoService extends Service { return p; } - public String buildPhotoDir(Context contxt, int channel) { + public static String buildPhotoDir(Context contxt, int channel) { // File path = new File(Environment.getExternalStorageDirectory(), "com.xinyingpower.mp/photos/"); String appDir = buildAppDir(contxt); diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 93a913d9..194944ea 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -29,6 +29,17 @@ app:layout_constraintLeft_toRightOf="@+id/textViewCmdId" app:layout_constraintTop_toTopOf="parent" /> + + + + \ No newline at end of file