From fc9232b0a6d98b992eecdc455c2a1437edaa1b91 Mon Sep 17 00:00:00 2001 From: Matthew Date: Wed, 18 Oct 2023 11:02:45 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8D=8F=E8=AE=AE=E5=8F=AF=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 7 +- app/release/output-metadata.json | 20 ++++++ app/src/main/AndroidManifest.xml | 1 - app/src/main/cpp/MicroPhoto.cpp | 7 +- app/src/main/cpp/camera2/ndkcamera.cpp | 15 +++++ app/src/main/cpp/camera2/ndkcamera.h | 1 + .../xinyingpower/microphoto/MainActivity.java | 67 +++++++++++++++---- .../microphoto/MicroPhotoService.java | 7 +- app/src/main/res/layout/activity_main.xml | 66 ++++++++++++------ app/src/main/res/values/networkProtocols.xml | 7 ++ app/src/main/res/values/protocols.xml | 9 +++ 11 files changed, 165 insertions(+), 42 deletions(-) create mode 100644 app/release/output-metadata.json create mode 100644 app/src/main/res/values/networkProtocols.xml create mode 100644 app/src/main/res/values/protocols.xml diff --git a/app/build.gradle b/app/build.gradle index 68931b0e..72750593 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -2,8 +2,8 @@ plugins { id 'com.android.application' } -def AppVersionName = "1.0.11" -def AppVersionCode = ((1 * 100 + 1) * 100 + 0) * 10 + 11 +def AppVersionName = "1.0.12" +def AppVersionCode = ((1 * 100 + 1) * 100 + 0) * 10 + 12 android { namespace 'com.xinyingpower.microphoto' @@ -83,6 +83,9 @@ dependencies { // implementation project(path: ':opencv') implementation files('libs/devapi.aar') + // https://mvnrepository.com/artifact/com.quickbirdstudios/opencv + implementation 'com.quickbirdstudios:opencv:4.5.3.0' + // implementation group: 'io.netty', name: 'netty-all', version: '4.1.96.Final' // implementation 'io.netty:netty-all:4.1.23.Final' // implementation 'org.apache.logging.log4j:log4j-api:2.14.0' diff --git a/app/release/output-metadata.json b/app/release/output-metadata.json new file mode 100644 index 00000000..2366273b --- /dev/null +++ b/app/release/output-metadata.json @@ -0,0 +1,20 @@ +{ + "version": 3, + "artifactType": { + "type": "APK", + "kind": "Directory" + }, + "applicationId": "com.xinyingpower.microphoto", + "variantName": "release", + "elements": [ + { + "type": "SINGLE", + "filters": [], + "attributes": [], + "versionCode": 101010, + "versionName": "1.0.10", + "outputFile": "app-release.apk" + } + ], + "elementType": "File" +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index bc51bfd4..c88fe9cc 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -33,7 +33,6 @@ - GetStringUTFChars(appPath, 0); const char *ipStr = env->GetStringUTFChars(ip, 0); const char *cmdidStr = env->GetStringUTFChars(cmdid, 0); @@ -110,12 +111,12 @@ Java_com_xinyingpower_microphoto_MicroPhotoService_init( // CTerminalDevice* device = new CTerminalDevice(vm, pThis); // CPhoneDevice2* device = new CPhoneDevice2(vm, pThis); - CTerminal* pTerminal = NewTerminal(GetCurrentProtocol()); + CTerminal* pTerminal = NewTerminal(protocol); CPhoneDevice* device = new CPhoneDevice(vm, pThis); device->SetListener(pTerminal); - pTerminal->InitServerInfo(appPathStr, cmdidStr, ipStr, port); + pTerminal->InitServerInfo(appPathStr, cmdidStr, ipStr, port, udpOrTcp); pTerminal->SetPacketSize(1 * 1024); // 1K bool res = pTerminal->Startup(device); diff --git a/app/src/main/cpp/camera2/ndkcamera.cpp b/app/src/main/cpp/camera2/ndkcamera.cpp index 16071117..ee8203e2 100644 --- a/app/src/main/cpp/camera2/ndkcamera.cpp +++ b/app/src/main/cpp/camera2/ndkcamera.cpp @@ -227,6 +227,21 @@ int NdkCamera::open(const char* cameraId) { } } + { + ACameraMetadata_const_entry val = {0}; + camera_status_t status = ACameraMetadata_getConstEntry(camera_metadata, + ACAMERA_CONTROL_AE_COMPENSATION_RANGE, + &val); + if (status == ACAMERA_OK) { + aeCompensationRange.min_ = val.data.i32[0]; + aeCompensationRange.max_ = val.data.i32[1]; + + } else { + ALOGW("Unsupported ACAMERA_CONTROL_AE_COMPENSATION_RANGE"); + aeCompensationRange.min_ = aeCompensationRange.max_ = 0l; + } + } + { ACameraMetadata_const_entry val = {0}; camera_status_t status = ACameraMetadata_getConstEntry(camera_metadata, diff --git a/app/src/main/cpp/camera2/ndkcamera.h b/app/src/main/cpp/camera2/ndkcamera.h index c74454bf..5965bb90 100644 --- a/app/src/main/cpp/camera2/ndkcamera.h +++ b/app/src/main/cpp/camera2/ndkcamera.h @@ -71,6 +71,7 @@ public: RangeValue exposureRange; // int32_t sensitivity_; RangeValue sensitivityRange; + RangeValue aeCompensationRange; diff --git a/app/src/main/java/com/xinyingpower/microphoto/MainActivity.java b/app/src/main/java/com/xinyingpower/microphoto/MainActivity.java index 921ea955..178c5f0b 100644 --- a/app/src/main/java/com/xinyingpower/microphoto/MainActivity.java +++ b/app/src/main/java/com/xinyingpower/microphoto/MainActivity.java @@ -58,6 +58,8 @@ public class MainActivity extends AppCompatActivity { public static final String TAG = "MainActivity"; private static int MY_PERMISSIONS_REQUEST_FOREGROUND_SERVICE = 100; + public final static int DEFAULT_PROTOCOL = 0xFF00; + // Used to load the 'microphoto' library on application startup. static { System.loadLibrary("microphoto"); @@ -76,6 +78,7 @@ public class MainActivity extends AppCompatActivity { public String server; public int port; public int protocol; + public int networkProtocol; } @Override @@ -96,12 +99,21 @@ public class MainActivity extends AppCompatActivity { String cmdid = "0123456789ABCDEFG"; String server = "47.96.238.157"; Integer port = new Integer(6891); - Integer protocol = new Integer(0xFF00); // 0xFF00 + Integer protocol = new Integer(DEFAULT_PROTOCOL); // 0xFF00 AppConfig appConfig = getAppConfig(); binding.cmdid.setText(appConfig.cmdid); binding.server.setText(appConfig.server); binding.port.setText(appConfig.port != 0 ? Integer.toString(appConfig.port) : ""); + String protocolStr = appConfig.protocol + "-"; + for (int idx = 0; idx < binding.protocol.getCount(); idx++) { + String item = binding.protocol.getItemAtPosition(idx).toString(); + if (item.startsWith(protocolStr)) { + binding.protocol.setSelection(idx); + break; + } + } + this.binding.startServBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { @@ -125,21 +137,16 @@ public class MainActivity extends AppCompatActivity { int channel = 2; String path = buildPhotoDir(channel); String fileName = buildPhotoFileName(channel, 255); - // MainActivity.this.takePhoto(channel, 255, path, fileName); - - 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); + AppConfig curAppConfig = retrieveAndSaveAppConfig(); Intent intent = new Intent(MainActivity.this, MicroPhotoService.class); intent.setAction(MicroPhotoService.ACTION_START); - intent.putExtra("cmdid", cmdid); - intent.putExtra("server", server); - intent.putExtra("port", port); - intent.putExtra("protocol", protocol); + 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); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { MainActivity.this.startForegroundService(intent); @@ -151,6 +158,15 @@ public class MainActivity extends AppCompatActivity { binding.stopServBtn.setEnabled(true); } }); + + this.binding.saveCfg.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + + retrieveAndSaveAppConfig(); + } + }); + this.binding.takePhotoBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { @@ -345,6 +361,25 @@ public class MainActivity extends AppCompatActivity { } } + private AppConfig retrieveAndSaveAppConfig() { + AppConfig appConfig = new AppConfig(); + + appConfig.cmdid = MainActivity.this.binding.cmdid.getText().toString(); + appConfig.server = MainActivity.this.binding.server.getText().toString(); + appConfig.port = Integer.parseInt(MainActivity.this.binding.port.getText().toString()); + String protocolStr = MainActivity.this.binding.protocol.getSelectedItem().toString(); + appConfig.protocol = DEFAULT_PROTOCOL; + String[] parts = protocolStr.split("-"); + if (parts != null) { + appConfig.protocol = Integer.parseInt(parts[0]); + } + appConfig.networkProtocol = MainActivity.this.binding.networkProtocol.getSelectedItemPosition(); + + saveAppConfig(appConfig.cmdid, appConfig.server, appConfig.port, appConfig.protocol, appConfig.networkProtocol); + + return appConfig; + } + private AppConfig getAppConfig() { AppConfig appConfig = new AppConfig(); @@ -367,6 +402,11 @@ public class MainActivity extends AppCompatActivity { appConfig.server = jsonObject.getString("Server"); appConfig.port = jsonObject.getInt("Port"); appConfig.protocol = jsonObject.getInt("Protocol"); + appConfig.networkProtocol = jsonObject.getInt("NetworkProtocol"); + + if (appConfig.protocol == 0) { + appConfig.protocol = DEFAULT_PROTOCOL; + } } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (IOException e) { @@ -386,7 +426,7 @@ public class MainActivity extends AppCompatActivity { return appConfig; } - private void saveAppConfig(String cmdid, String server, int port, int protocol) { + private void saveAppConfig(String cmdid, String server, int port, int protocol, int networkProtocol) { String appPath = MicroPhotoService.buildAppDir(this.getApplicationContext()); @@ -398,6 +438,7 @@ public class MainActivity extends AppCompatActivity { jsonObject.put("Server", server); jsonObject.put("Port", port); jsonObject.put("Protocol", protocol); + jsonObject.put("NetworkProtocol", networkProtocol); outputStreamWriter = new OutputStreamWriter(new FileOutputStream(new File(appPath + "data/App.json")), "UTF-8"); outputStreamWriter.write(jsonObject.toString()); diff --git a/app/src/main/java/com/xinyingpower/microphoto/MicroPhotoService.java b/app/src/main/java/com/xinyingpower/microphoto/MicroPhotoService.java index 9cda62d5..0c3dc7ba 100644 --- a/app/src/main/java/com/xinyingpower/microphoto/MicroPhotoService.java +++ b/app/src/main/java/com/xinyingpower/microphoto/MicroPhotoService.java @@ -444,9 +444,10 @@ public class MicroPhotoService extends Service { int port = intent.getIntExtra("port", 0); String cmdid = intent.getStringExtra("cmdid"); int protocol = intent.getIntExtra("protocol", 0); + int networkProtocol = intent.getIntExtra("networkProtocol", 0); - Log.i(TAG, "AppPath=" + appPath + " Server=" + ip + ":" + port + " cmdid=" + cmdid + " protocol" + protocol); - mHandler = init(appPath, ip, port, cmdid, protocol); + Log.i(TAG, "AppPath=" + appPath + " Server=" + ip + ":" + port + " cmdid=" + cmdid + " protocol" + protocol + " Network=" + networkProtocol); + mHandler = init(appPath, ip, port, cmdid, protocol, networkProtocol); // Start the locker receiver @@ -735,7 +736,7 @@ CellSignalStrengthGsm cellSignalStrengthGsm = cellInfoGsm.getCellSignalStrength( cellSignalStrengthGsm.getDbm(); */ - protected native long init(String appPath, String ip, int port, String cmdid, int protocol); + protected native long init(String appPath, String ip, int port, String cmdid, int protocol, int networkProtocl); protected native long getHeartbeatDuration(long handler); protected native long[] getPhotoTimeData(long handler); // protected native long[] getNextScheduleItem(long handler); diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index f3378c95..9ef2f95b 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -12,7 +12,7 @@ android:id="@+id/textViewCmdId" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginLeft="20dp" + android:layout_marginLeft="8dp" android:text="CMDID" app:layout_constraintBottom_toBottomOf="@+id/cmdid" app:layout_constraintStart_toStartOf="parent" @@ -22,8 +22,8 @@ android:id="@+id/cmdid" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginLeft="20dp" - android:layout_marginTop="20dp" + android:layout_marginLeft="8dp" + android:layout_marginTop="8dp" android:ems="10" android:text="XY-ANDROIDSIM-001" app:layout_constraintLeft_toRightOf="@+id/textViewCmdId" @@ -35,7 +35,8 @@ android:layout_height="wrap_content" android:layout_marginLeft="4dp" android:layout_marginRight="4dp" - + style="@style/Widget.AppCompat.Spinner.Underlined" + android:entries="@array/protocols" app:layout_constraintLeft_toRightOf="@+id/cmdid" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="@+id/cmdid" /> @@ -44,7 +45,7 @@ android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginTop="20dp" + android:layout_marginTop="8dp" android:text="Server" app:layout_constraintBottom_toBottomOf="@+id/server" app:layout_constraintStart_toStartOf="@id/textViewCmdId" @@ -54,7 +55,7 @@ android:id="@+id/server" android:layout_width="160dp" android:layout_height="wrap_content" - android:layout_marginTop="8dp" + android:layout_marginTop="4dp" android:ems="10" android:inputType="" android:text="47.96.238.157" @@ -72,12 +73,24 @@ app:layout_constraintLeft_toRightOf="@+id/server" app:layout_constraintTop_toTopOf="@+id/server" /> + +