以线程启动和停止服务

serial
BlueMatthew 1 year ago
parent c021076d1e
commit 9ffddf0f85

@ -222,7 +222,7 @@ public class MainActivity extends AppCompatActivity {
binding.network.setSelection(appConfig.network); binding.network.setSelection(appConfig.network);
} }
this.binding.startServBtn.setOnClickListener(new View.OnClickListener() { this.binding.btnStartServ.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View view) { public void onClick(View view) {
@ -242,16 +242,17 @@ public class MainActivity extends AppCompatActivity {
return; return;
} }
binding.logs.setText("");
MicroPhotoContext.AppConfig curAppConfig = retrieveAndSaveAppConfig(); MicroPhotoContext.AppConfig curAppConfig = retrieveAndSaveAppConfig();
startMicroPhotoService(MainActivity.this, appConfig, mMessenger); startMicroPhotoService(MainActivity.this, appConfig, mMessenger);
binding.startServBtn.setEnabled(false); binding.btnStartServ.setEnabled(false);
binding.stopServBtn.setEnabled(true); binding.btnStopServ.setEnabled(true);
} }
}); });
this.binding.saveCfg.setOnClickListener(new View.OnClickListener() { this.binding.btnSaveCfg.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View view) { public void onClick(View view) {
@ -259,25 +260,25 @@ public class MainActivity extends AppCompatActivity {
} }
}); });
this.binding.takePhotoBtn.setOnClickListener(new View.OnClickListener() { this.binding.btnTakePhoto.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View view) { public void onClick(View view) {
MicroPhotoService.takePhoto(view.getContext().getApplicationContext(), 1, 255, true); MicroPhotoService.takePhoto(view.getContext().getApplicationContext(), 1, 255, true);
} }
}); });
this.binding.takePhotoBtn2.setOnClickListener(new View.OnClickListener() { this.binding.btnTakePhoto2.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View view) { public void onClick(View view) {
MicroPhotoService.takePhoto(view.getContext().getApplicationContext(), 2, 255, true); MicroPhotoService.takePhoto(view.getContext().getApplicationContext(), 2, 255, true);
} }
}); });
this.binding.takePhotoBtn3.setOnClickListener(new View.OnClickListener() { this.binding.btnTakePhoto3.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View view) { public void onClick(View view) {
MicroPhotoService.takePhoto(view.getContext().getApplicationContext(), 3, 255, true); MicroPhotoService.takePhoto(view.getContext().getApplicationContext(), 3, 255, true);
} }
}); });
this.binding.takePhotoBtn4.setOnClickListener(new View.OnClickListener() { this.binding.btnTakePhoto4.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View view) { public void onClick(View view) {
MicroPhotoService.takePhoto(view.getContext().getApplicationContext(), 4, 255, true); MicroPhotoService.takePhoto(view.getContext().getApplicationContext(), 4, 255, true);
@ -309,17 +310,19 @@ public class MainActivity extends AppCompatActivity {
} }
}); });
this.binding.stopServBtn.setOnClickListener(new View.OnClickListener() { this.binding.btnStopServ.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View view) { public void onClick(View view) {
Intent intent = new Intent(MainActivity.this, MicroPhotoService.class); // Intent intent = new Intent(MainActivity.this, MicroPhotoService.class);
intent.setAction(MicroPhotoService.ACTION_STOP); // intent.setAction(MicroPhotoService.ACTION_STOP);
MainActivity.this.stopService(intent); // MainActivity.this.stopService(intent);
binding.startServBtn.setEnabled(true); MicroPhotoService.stopTerminalService(getApplicationContext());
binding.stopServBtn.setEnabled(false);
binding.btnStartServ.setEnabled(true);
binding.btnStopServ.setEnabled(false);
} }
}); });
@ -407,8 +410,8 @@ public class MainActivity extends AppCompatActivity {
Runnable runnable = new Runnable() { Runnable runnable = new Runnable() {
@Override @Override
public void run() { public void run() {
if (binding.startServBtn.isEnabled()) { if (binding.btnStartServ.isEnabled()) {
binding.startServBtn.performClick(); binding.btnStartServ.performClick();
} }
} }
}; };

@ -169,6 +169,7 @@ public class MicroPhotoService extends Service {
intentFilter.addAction(ACTION_HEARTBEAT_MANUALLY); intentFilter.addAction(ACTION_HEARTBEAT_MANUALLY);
intentFilter.addAction(ACTION_MSG_BROADCAST); intentFilter.addAction(ACTION_MSG_BROADCAST);
intentFilter.addAction(ACTION_VIDEO_FINISHED); intentFilter.addAction(ACTION_VIDEO_FINISHED);
intentFilter.addAction(ACTION_STOP);
getApplicationContext().registerReceiver(mAlarmReceiver, intentFilter); getApplicationContext().registerReceiver(mAlarmReceiver, intentFilter);
// IntentFilter intentFilter2 = new IntentFilter(ACTION_MSG_BROADCAST); // IntentFilter intentFilter2 = new IntentFilter(ACTION_MSG_BROADCAST);
@ -214,8 +215,10 @@ public class MicroPhotoService extends Service {
Log.w(TAG, "MicroPhotoService::onDestroy called"); Log.w(TAG, "MicroPhotoService::onDestroy called");
uninit(mNativeHandle); if (mNativeHandle != 0) {
mNativeHandle = 0; uninit(mNativeHandle);
mNativeHandle = 0;
}
getApplicationContext().unregisterReceiver(mAlarmReceiver); getApplicationContext().unregisterReceiver(mAlarmReceiver);
unregisterReceiver(mScreenaAtionReceiver); unregisterReceiver(mScreenaAtionReceiver);
@ -406,6 +409,8 @@ public class MicroPhotoService extends Service {
Log.i(TAG, "Recording received(" + Long.toString(videoId) + "):" + path); Log.i(TAG, "Recording received(" + Long.toString(videoId) + "):" + path);
mService.recordingFinished(mService.mNativeHandle, result, path, videoId); mService.recordingFinished(mService.mNativeHandle, result, path, videoId);
} else if (TextUtils.equals(ACTION_STOP, action)) {
mService.stopTerminalService();
} }
} }
} }
@ -712,8 +717,11 @@ public class MicroPhotoService extends Service {
break; break;
case ACTION_STOP: case ACTION_STOP:
unregisterReceiver(mScreenaAtionReceiver); try {
unregisterReceiver(mScreenaAtionReceiver);
} catch (Exception ex) {
}
stopForeground(true); stopForeground(true);
stopSelf(); stopSelf();
break; break;
@ -727,44 +735,95 @@ public class MicroPhotoService extends Service {
private void startTerminalService(Intent intent) { private void startTerminalService(Intent intent) {
String appPath = MicroPhotoContext.buildAppDir(this.getApplicationContext()); if (MicroPhotoService.this.mNativeHandle != 0) {
return;
}
String server = intent.getStringExtra("server"); final String appPath = MicroPhotoContext.buildAppDir(this.getApplicationContext());
int port = intent.getIntExtra("port", 0);
String cmdid = intent.getStringExtra("cmdid");
int protocol = intent.getIntExtra("protocol", 0);
int networkProtocol = intent.getIntExtra("networkProtocol", 0);
if (!InetAddressUtils.isIPv4Address(server) && !InetAddressUtils.isIPv6Address(server)) { final String server = intent.getStringExtra("server");
// It is a domain final int port = intent.getIntExtra("port", 0);
InetAddress addr = null; final String cmdid = intent.getStringExtra("cmdid");
try { final int protocol = intent.getIntExtra("protocol", 0);
addr = InetAddress.getByName(server); final int networkProtocol = intent.getIntExtra("networkProtocol", 0);
} catch (Exception e) {
e.printStackTrace(); Runnable runnable = new Runnable() {
} public void run() {
if (addr != null) {
server = addr.getHostAddress(); String ip = server;
if (!InetAddressUtils.isIPv4Address(ip) && !InetAddressUtils.isIPv6Address(ip)) {
// It is a domain
InetAddress addr = null;
try {
addr = InetAddress.getByName(server);
} catch (Exception e) {
e.printStackTrace();
}
if (addr != null) {
ip = addr.getHostAddress();
}
}
Log.i(TAG, "AppPath=" + appPath + " Server=" + ip + ":" + port + " cmdid=" + cmdid + " Protocol=" + protocol + " Network=" + networkProtocol);
MicroPhotoService service = MicroPhotoService.this;
service.mNativeHandle = init(appPath, server, port, cmdid, protocol, networkProtocol, 0);
if (service.mNativeHandle !=0) {
service.mCmdid = cmdid;
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;
service.registerCaptureSchedule(startTime, baseTime);
}
} }
} };
Log.i(TAG, "AppPath=" + appPath + " Server=" + server + ":" + port + " cmdid=" + cmdid + " Protocol=" + protocol + " Network=" + networkProtocol);
Thread th = new Thread(runnable);
th.start();
}
public static void stopTerminalService(Context context) {
MicroPhotoService service = MicroPhotoService.this; Intent alarmIntent = new Intent();
alarmIntent.setPackage(context.getPackageName());
alarmIntent.setAction(ACTION_STOP);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, alarmIntent, 0);
service.mNativeHandle = init(appPath, server, port, cmdid, protocol, networkProtocol, 0); AlarmManager alarmManager = (AlarmManager) context.getSystemService(ALARM_SERVICE);
alarmManager.setExactAndAllowWhileIdle(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + 100, pendingIntent);
}
if (service.mNativeHandle !=0) { public void stopTerminalService() {
service.mCmdid = cmdid;
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;
service.registerCaptureSchedule(startTime, baseTime); if (mNativeHandle == 0) {
return;
} }
Runnable runnable = new Runnable() {
public void run() {
uninit(mNativeHandle);
mNativeHandle = 0;
try {
unregisterReceiver(mScreenaAtionReceiver);
} catch (Exception ex) {
}
stopForeground(true);
stopSelf();
}
};
Thread thread = new Thread(runnable);
thread.start();
} }
public void requestWakelock(String name, long timeout) { public void requestWakelock(String name, long timeout) {

@ -11,7 +11,7 @@
android:id="@+id/textViewCmdId" android:id="@+id/textViewCmdId"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginLeft="8dp" android:layout_marginLeft="@dimen/activity_horizontal_margin"
android:text="CMDID" android:text="CMDID"
app:layout_constraintBottom_toBottomOf="@+id/cmdid" app:layout_constraintBottom_toBottomOf="@+id/cmdid"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
@ -21,8 +21,8 @@
android:id="@+id/cmdid" android:id="@+id/cmdid"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginLeft="4dp" android:layout_marginLeft="@dimen/activity_horizontal_margin_small"
android:layout_marginTop="8dp" android:layout_marginTop="@dimen/activity_vertical_margin"
android:ems="10" android:ems="10"
android:imeOptions="actionDone" android:imeOptions="actionDone"
android:inputType="text" android:inputType="text"
@ -44,10 +44,9 @@
app:layout_constraintTop_toTopOf="@+id/cmdid" /> app:layout_constraintTop_toTopOf="@+id/cmdid" />
<TextView <TextView
android:id="@+id/textView" android:id="@+id/textViewServer"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:text="Server" android:text="Server"
app:layout_constraintBottom_toBottomOf="@+id/server" app:layout_constraintBottom_toBottomOf="@+id/server"
app:layout_constraintStart_toStartOf="@id/textViewCmdId" app:layout_constraintStart_toStartOf="@id/textViewCmdId"
@ -57,7 +56,6 @@
android:id="@+id/server" android:id="@+id/server"
android:layout_width="128dp" android:layout_width="128dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="4dp"
android:maxLines="1" android:maxLines="1"
android:lines="1" android:lines="1"
android:singleLine="true" android:singleLine="true"
@ -93,7 +91,6 @@
android:id="@+id/textViewHeartbeat" android:id="@+id/textViewHeartbeat"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:text="@string/main_heartbeat" android:text="@string/main_heartbeat"
app:layout_constraintBottom_toBottomOf="@+id/heartbeat" app:layout_constraintBottom_toBottomOf="@+id/heartbeat"
app:layout_constraintStart_toStartOf="@id/textViewCmdId" app:layout_constraintStart_toStartOf="@id/textViewCmdId"
@ -103,8 +100,8 @@
android:id="@+id/heartbeat" android:id="@+id/heartbeat"
android:layout_width="48dp" android:layout_width="48dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="8dp" android:layout_marginStart="@dimen/activity_horizontal_margin"
android:layout_marginTop="4dp" android:layout_marginTop="0dp"
android:ems="10" android:ems="10"
android:inputType="none|number" android:inputType="none|number"
android:imeOptions="actionDone" android:imeOptions="actionDone"
@ -118,8 +115,7 @@
android:id="@+id/textViewPacketSize" android:id="@+id/textViewPacketSize"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="8dp" android:layout_marginStart="@dimen/activity_horizontal_margin"
android:layout_marginTop="4dp"
android:text="@string/main_packet_size" android:text="@string/main_packet_size"
app:layout_constraintBottom_toBottomOf="@+id/packetSize" app:layout_constraintBottom_toBottomOf="@+id/packetSize"
app:layout_constraintStart_toEndOf="@+id/heartbeat" app:layout_constraintStart_toEndOf="@+id/heartbeat"
@ -129,8 +125,7 @@
android:id="@+id/packetSize" android:id="@+id/packetSize"
android:layout_width="64dp" android:layout_width="64dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginLeft="8dp" android:layout_marginLeft="@dimen/activity_horizontal_margin"
android:layout_marginTop="4dp"
android:ems="10" android:ems="10"
android:inputType="none|number" android:inputType="none|number"
android:imeOptions="actionDone" android:imeOptions="actionDone"
@ -138,7 +133,7 @@
android:text="2048" android:text="2048"
android:hint="@string/main_packet_size_default" android:hint="@string/main_packet_size_default"
app:layout_constraintLeft_toRightOf="@+id/textViewPacketSize" app:layout_constraintLeft_toRightOf="@+id/textViewPacketSize"
app:layout_constraintTop_toBottomOf="@+id/server" /> app:layout_constraintTop_toTopOf="@+id/heartbeat" />
<Spinner <Spinner
android:id="@+id/network" android:id="@+id/network"
@ -147,114 +142,114 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:entries="@array/networks" android:entries="@array/networks"
android:spinnerMode="dropdown" android:spinnerMode="dropdown"
android:layout_marginLeft="8dp" android:layout_marginLeft="@dimen/activity_horizontal_margin"
app:layout_constraintLeft_toRightOf="@+id/packetSize" app:layout_constraintLeft_toRightOf="@+id/packetSize"
app:layout_constraintTop_toTopOf="@+id/heartbeat" /> app:layout_constraintTop_toTopOf="@+id/heartbeat" />
<Button <Button
android:id="@+id/startServBtn" android:id="@+id/btnStartServ"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginLeft="8dp" android:layout_marginLeft="@dimen/activity_horizontal_margin"
android:layout_marginTop="8dp" android:layout_marginTop="@dimen/activity_vertical_margin_small"
android:text="Start" android:text="Start"
android:minWidth="@dimen/activity_min_width" android:minWidth="@dimen/activity_btn_min_width"
app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toBottomOf="@+id/heartbeat" app:layout_constraintTop_toBottomOf="@+id/heartbeat"
/> />
<Button <Button
android:id="@+id/stopServBtn" android:id="@+id/btnStopServ"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="8dp" android:layout_marginStart="@dimen/activity_horizontal_margin"
android:layout_marginTop="8dp" android:layout_marginTop="@dimen/activity_vertical_margin"
android:minWidth="@dimen/activity_min_width" android:minWidth="@dimen/activity_btn_min_width"
android:enabled="false" android:enabled="false"
android:text="Stop" android:text="Stop"
app:layout_constraintStart_toEndOf="@+id/startServBtn" app:layout_constraintStart_toEndOf="@+id/btnStartServ"
app:layout_constraintTop_toBottomOf="@+id/heartbeat" /> app:layout_constraintTop_toBottomOf="@+id/heartbeat" />
<Button <Button
android:id="@+id/saveCfg" android:id="@+id/btnSaveCfg"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="8dp" android:layout_marginStart="@dimen/activity_horizontal_margin"
android:minWidth="@dimen/activity_min_width" android:minWidth="@dimen/activity_btn_min_width"
android:text="Save" android:text="Save"
app:layout_constraintStart_toEndOf="@+id/stopServBtn" app:layout_constraintStart_toEndOf="@+id/btnStopServ"
app:layout_constraintTop_toTopOf="@+id/startServBtn" /> app:layout_constraintTop_toTopOf="@+id/btnStartServ" />
<Button <Button
android:id="@+id/btnChannels" android:id="@+id/btnChannels"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="8dp" android:layout_marginStart="@dimen/activity_horizontal_margin"
android:minWidth="@dimen/activity_min_width" android:minWidth="@dimen/activity_btn_min_width"
android:text="通道设置" android:text="通道设置"
app:layout_constraintStart_toEndOf="@+id/saveCfg" app:layout_constraintStart_toEndOf="@+id/btnSaveCfg"
app:layout_constraintTop_toTopOf="@+id/startServBtn" /> app:layout_constraintTop_toTopOf="@+id/btnStartServ" />
<Button <Button
android:id="@+id/takePhotoBtn" android:id="@+id/btnTakePhoto"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="8dp" android:layout_marginTop="@dimen/activity_vertical_margin"
android:layout_marginStart="8dp" android:layout_marginStart="@dimen/activity_horizontal_margin"
android:minWidth="@dimen/activity_min_width" android:minWidth="@dimen/activity_btn_min_width"
android:text="@string/btn_tp_ch1" android:text="@string/btn_tp_ch1"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/startServBtn" /> app:layout_constraintTop_toBottomOf="@+id/btnStartServ" />
<Button <Button
android:id="@+id/takePhotoBtn2" android:id="@+id/btnTakePhoto2"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="8dp" android:layout_marginStart="@dimen/activity_horizontal_margin"
android:minWidth="@dimen/activity_min_width" android:minWidth="@dimen/activity_btn_min_width"
android:text="@string/btn_tp_ch2" android:text="@string/btn_tp_ch2"
app:layout_constraintStart_toEndOf="@+id/takePhotoBtn" app:layout_constraintStart_toEndOf="@+id/btnTakePhoto"
app:layout_constraintTop_toTopOf="@+id/takePhotoBtn" /> app:layout_constraintTop_toTopOf="@+id/btnTakePhoto" />
<Button <Button
android:id="@+id/takePhotoBtn3" android:id="@+id/btnTakePhoto3"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="8dp" android:layout_marginStart="@dimen/activity_horizontal_margin"
android:minWidth="@dimen/activity_min_width" android:minWidth="@dimen/activity_btn_min_width"
android:text="@string/btn_tp_ch3" android:text="@string/btn_tp_ch3"
app:layout_constraintStart_toEndOf="@+id/takePhotoBtn2" app:layout_constraintStart_toEndOf="@+id/btnTakePhoto2"
app:layout_constraintTop_toTopOf="@+id/takePhotoBtn" /> app:layout_constraintTop_toTopOf="@+id/btnTakePhoto" />
<Button <Button
android:id="@+id/takePhotoBtn4" android:id="@+id/btnTakePhoto4"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="8dp" android:layout_marginStart="@dimen/activity_horizontal_margin"
android:minWidth="@dimen/activity_min_width" android:minWidth="@dimen/activity_btn_min_width"
android:text="@string/btn_tp_ch4" android:text="@string/btn_tp_ch4"
app:layout_constraintStart_toEndOf="@+id/takePhotoBtn3" app:layout_constraintStart_toEndOf="@+id/btnTakePhoto3"
app:layout_constraintTop_toTopOf="@+id/takePhotoBtn" /> app:layout_constraintTop_toTopOf="@+id/btnTakePhoto" />
<Button <Button
android:id="@+id/takeVideoBtn" android:id="@+id/takeVideoBtn"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="8dp" android:layout_marginStart="@dimen/activity_horizontal_margin"
android:layout_marginTop="8dp" android:layout_marginTop="@dimen/activity_vertical_margin_small"
android:minWidth="@dimen/activity_min_width" android:minWidth="@dimen/activity_btn_min_width"
android:text="@string/btn_tv_ch1" android:text="@string/btn_tv_ch1"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/takePhotoBtn" /> app:layout_constraintTop_toBottomOf="@+id/btnTakePhoto" />
<Button <Button
android:id="@+id/takeVideoBtn2" android:id="@+id/takeVideoBtn2"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="8dp" android:layout_marginStart="@dimen/activity_horizontal_margin"
android:minWidth="@dimen/activity_min_width" android:minWidth="@dimen/activity_btn_min_width"
android:text="@string/btn_tv_ch2" android:text="@string/btn_tv_ch2"
app:layout_constraintStart_toEndOf="@+id/takeVideoBtn" app:layout_constraintStart_toEndOf="@+id/takeVideoBtn"
app:layout_constraintTop_toTopOf="@+id/takeVideoBtn" /> app:layout_constraintTop_toTopOf="@+id/takeVideoBtn" />
@ -263,8 +258,8 @@
android:id="@+id/takeVideoBtn3" android:id="@+id/takeVideoBtn3"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="8dp" android:layout_marginStart="@dimen/activity_horizontal_margin"
android:minWidth="@dimen/activity_min_width" android:minWidth="@dimen/activity_btn_min_width"
android:text="@string/btn_tv_ch3" android:text="@string/btn_tv_ch3"
app:layout_constraintStart_toEndOf="@+id/takeVideoBtn2" app:layout_constraintStart_toEndOf="@+id/takeVideoBtn2"
app:layout_constraintTop_toTopOf="@+id/takeVideoBtn" /> app:layout_constraintTop_toTopOf="@+id/takeVideoBtn" />
@ -273,8 +268,8 @@
android:id="@+id/takeVideoBtn4" android:id="@+id/takeVideoBtn4"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="8dp" android:layout_marginStart="@dimen/activity_horizontal_margin"
android:minWidth="@dimen/activity_min_width" android:minWidth="@dimen/activity_btn_min_width"
android:text="@string/btn_tv_ch4" android:text="@string/btn_tv_ch4"
app:layout_constraintStart_toEndOf="@+id/takeVideoBtn3" app:layout_constraintStart_toEndOf="@+id/takeVideoBtn3"
app:layout_constraintTop_toTopOf="@+id/takeVideoBtn" /> app:layout_constraintTop_toTopOf="@+id/takeVideoBtn" />
@ -284,9 +279,9 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/main_send_hb" android:text="@string/main_send_hb"
android:layout_marginStart="8dp" android:layout_marginStart="@dimen/activity_horizontal_margin"
android:layout_marginTop="8dp" android:layout_marginTop="@dimen/activity_vertical_margin_small"
android:minWidth="@dimen/activity_min_width" android:minWidth="@dimen/activity_btn_min_width"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/takeVideoBtn" /> app:layout_constraintTop_toBottomOf="@+id/takeVideoBtn" />
@ -295,8 +290,8 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/main_restart_app" android:text="@string/main_restart_app"
android:layout_marginStart="8dp" android:layout_marginStart="@dimen/activity_horizontal_margin"
android:minWidth="@dimen/activity_min_width" android:minWidth="@dimen/activity_btn_min_width"
app:layout_constraintStart_toEndOf="@+id/btnSendHb" app:layout_constraintStart_toEndOf="@+id/btnSendHb"
app:layout_constraintTop_toTopOf="@+id/btnSendHb" /> app:layout_constraintTop_toTopOf="@+id/btnSendHb" />
@ -305,8 +300,8 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/main_reboot" android:text="@string/main_reboot"
android:layout_marginStart="8dp" android:layout_marginStart="@dimen/activity_horizontal_margin"
android:minWidth="@dimen/activity_min_width" android:minWidth="@dimen/activity_btn_min_width"
app:layout_constraintStart_toEndOf="@+id/btnRestartApp" app:layout_constraintStart_toEndOf="@+id/btnRestartApp"
app:layout_constraintTop_toTopOf="@+id/btnSendHb" /> app:layout_constraintTop_toTopOf="@+id/btnSendHb" />
@ -320,7 +315,7 @@
android:text="sim卡获取" android:text="sim卡获取"
android:visibility="gone" android:visibility="gone"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/startServBtn" /> app:layout_constraintTop_toBottomOf="@+id/btnStartServ" />
<Button <Button
android:id="@+id/simchange2" android:id="@+id/simchange2"
@ -331,7 +326,7 @@
android:text="切换sim2" android:text="切换sim2"
android:visibility="gone" android:visibility="gone"
app:layout_constraintStart_toEndOf="@+id/simchange" app:layout_constraintStart_toEndOf="@+id/simchange"
app:layout_constraintTop_toBottomOf="@+id/startServBtn" /> app:layout_constraintTop_toBottomOf="@+id/btnStartServ" />
@ -397,7 +392,7 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
app:barrierDirection="right" app:barrierDirection="right"
app:constraint_referenced_ids="textViewCmdId,cmdid,protocol,networkProtocol,saveCfg,takePhotoBtn4,btnChannels,network,takeVideoBtn4" app:constraint_referenced_ids="textViewCmdId,cmdid,protocol,networkProtocol,btnSaveCfg,btnTakePhoto4,btnChannels,network,takeVideoBtn4"
tools:layout_editor_absoluteX="46dp" /> tools:layout_editor_absoluteX="46dp" />

@ -39,7 +39,7 @@
app:layout_constraintTop_toTopOf="@+id/cmdid" /> app:layout_constraintTop_toTopOf="@+id/cmdid" />
<TextView <TextView
android:id="@+id/textView" android:id="@+id/textViewServer"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="8dp" android:layout_marginTop="8dp"
@ -143,7 +143,7 @@
app:layout_constraintTop_toTopOf="@+id/heartbeat" /> app:layout_constraintTop_toTopOf="@+id/heartbeat" />
<Button <Button
android:id="@+id/startServBtn" android:id="@+id/btnStartServ"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginLeft="8dp" android:layout_marginLeft="8dp"
@ -153,25 +153,25 @@
app:layout_constraintTop_toBottomOf="@+id/heartbeat" /> app:layout_constraintTop_toBottomOf="@+id/heartbeat" />
<Button <Button
android:id="@+id/stopServBtn" android:id="@+id/btnStopServ"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="8dp" android:layout_marginStart="8dp"
android:layout_marginTop="8dp" android:layout_marginTop="8dp"
android:enabled="false" android:enabled="false"
android:text="Stop" android:text="Stop"
app:layout_constraintStart_toEndOf="@+id/startServBtn" app:layout_constraintStart_toEndOf="@+id/btnStartServ"
app:layout_constraintTop_toBottomOf="@+id/heartbeat" /> app:layout_constraintTop_toBottomOf="@+id/heartbeat" />
<Button <Button
android:id="@+id/saveCfg" android:id="@+id/btnSaveCfg"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="8dp" android:layout_marginStart="8dp"
android:layout_marginTop="0dp" android:layout_marginTop="0dp"
android:text="Save" android:text="Save"
app:layout_constraintStart_toEndOf="@+id/stopServBtn" app:layout_constraintStart_toEndOf="@+id/btnStopServ"
app:layout_constraintTop_toTopOf="@+id/startServBtn" /> app:layout_constraintTop_toTopOf="@+id/btnStartServ" />
<Button <Button
android:id="@+id/simchange" android:id="@+id/simchange"
@ -181,7 +181,7 @@
android:layout_marginTop="8dp" android:layout_marginTop="8dp"
android:text="sim卡获取" android:text="sim卡获取"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/startServBtn" /> app:layout_constraintTop_toBottomOf="@+id/btnStartServ" />
<Button <Button
android:id="@+id/simchange2" android:id="@+id/simchange2"
@ -191,7 +191,7 @@
android:layout_marginTop="8dp" android:layout_marginTop="8dp"
android:text="切换sim2" android:text="切换sim2"
app:layout_constraintStart_toEndOf="@+id/simchange" app:layout_constraintStart_toEndOf="@+id/simchange"
app:layout_constraintTop_toBottomOf="@+id/startServBtn" /> app:layout_constraintTop_toBottomOf="@+id/btnStartServ" />
<Button <Button
android:id="@+id/btnChannels" android:id="@+id/btnChannels"
@ -201,10 +201,10 @@
android:layout_marginTop="8dp" android:layout_marginTop="8dp"
android:text="通道设置" android:text="通道设置"
app:layout_constraintStart_toEndOf="@+id/simchange2" app:layout_constraintStart_toEndOf="@+id/simchange2"
app:layout_constraintTop_toBottomOf="@+id/startServBtn" /> app:layout_constraintTop_toBottomOf="@+id/btnStartServ" />
<Button <Button
android:id="@+id/takePhotoBtn" android:id="@+id/btnTakePhoto"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="8dp" android:layout_marginTop="8dp"
@ -214,33 +214,33 @@
app:layout_constraintTop_toBottomOf="@+id/simchange" /> app:layout_constraintTop_toBottomOf="@+id/simchange" />
<Button <Button
android:id="@+id/takePhotoBtn2" android:id="@+id/btnTakePhoto2"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="4dp" android:layout_marginStart="4dp"
android:layout_marginTop="8dp" android:layout_marginTop="8dp"
android:text="TP 2" android:text="TP 2"
app:layout_constraintStart_toEndOf="@+id/takePhotoBtn" app:layout_constraintStart_toEndOf="@+id/btnTakePhoto"
app:layout_constraintTop_toBottomOf="@+id/simchange" /> app:layout_constraintTop_toBottomOf="@+id/simchange" />
<Button <Button
android:id="@+id/takePhotoBtn3" android:id="@+id/btnTakePhoto3"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="4dp" android:layout_marginStart="4dp"
android:layout_marginTop="8dp" android:layout_marginTop="8dp"
android:text="TP 3" android:text="TP 3"
app:layout_constraintStart_toEndOf="@+id/takePhotoBtn2" app:layout_constraintStart_toEndOf="@+id/btnTakePhoto2"
app:layout_constraintTop_toBottomOf="@+id/simchange" /> app:layout_constraintTop_toBottomOf="@+id/simchange" />
<Button <Button
android:id="@+id/takePhotoBtn4" android:id="@+id/btnTakePhoto4"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="4dp" android:layout_marginStart="4dp"
android:layout_marginTop="8dp" android:layout_marginTop="8dp"
android:text="TP 4" android:text="TP 4"
app:layout_constraintStart_toEndOf="@+id/takePhotoBtn3" app:layout_constraintStart_toEndOf="@+id/btnTakePhoto3"
app:layout_constraintTop_toBottomOf="@+id/simchange" /> app:layout_constraintTop_toBottomOf="@+id/simchange" />
<Button <Button
@ -249,17 +249,17 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="8dp" android:layout_marginStart="8dp"
android:layout_marginTop="8dp" android:layout_marginTop="8dp"
android:minWidth="@dimen/activity_min_width" android:minWidth="@dimen/activity_btn_min_width"
android:text="@string/btn_tv_ch1" android:text="@string/btn_tv_ch1"
app:layout_constraintStart_toEndOf="parent" app:layout_constraintStart_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@+id/takePhotoBtn" /> app:layout_constraintTop_toBottomOf="@+id/btnTakePhoto" />
<Button <Button
android:id="@+id/takeVideoBtn2" android:id="@+id/takeVideoBtn2"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="8dp" android:layout_marginStart="8dp"
android:minWidth="@dimen/activity_min_width" android:minWidth="@dimen/activity_btn_min_width"
android:text="@string/btn_tv_ch2" android:text="@string/btn_tv_ch2"
app:layout_constraintStart_toEndOf="@+id/takeVideoBtn" app:layout_constraintStart_toEndOf="@+id/takeVideoBtn"
app:layout_constraintTop_toTopOf="@+id/takeVideoBtn" /> app:layout_constraintTop_toTopOf="@+id/takeVideoBtn" />
@ -269,7 +269,7 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="8dp" android:layout_marginStart="8dp"
android:minWidth="@dimen/activity_min_width" android:minWidth="@dimen/activity_btn_min_width"
android:text="@string/btn_tv_ch3" android:text="@string/btn_tv_ch3"
app:layout_constraintStart_toEndOf="@+id/takeVideoBtn2" app:layout_constraintStart_toEndOf="@+id/takeVideoBtn2"
app:layout_constraintTop_toTopOf="@+id/takeVideoBtn" /> app:layout_constraintTop_toTopOf="@+id/takeVideoBtn" />
@ -279,7 +279,7 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="8dp" android:layout_marginStart="8dp"
android:minWidth="@dimen/activity_min_width" android:minWidth="@dimen/activity_btn_min_width"
android:text="@string/btn_tv_ch4" android:text="@string/btn_tv_ch4"
app:layout_constraintStart_toEndOf="@+id/takeVideoBtn3" app:layout_constraintStart_toEndOf="@+id/takeVideoBtn3"
app:layout_constraintTop_toTopOf="@+id/takeVideoBtn" /> app:layout_constraintTop_toTopOf="@+id/takeVideoBtn" />
@ -300,7 +300,7 @@
android:text="@string/main_restart_app" android:text="@string/main_restart_app"
android:layout_marginStart="8dp" android:layout_marginStart="8dp"
app:layout_constraintStart_toEndOf="@+id/btnSendHb" app:layout_constraintStart_toEndOf="@+id/btnSendHb"
app:layout_constraintTop_toBottomOf="@+id/takePhotoBtn" /> app:layout_constraintTop_toBottomOf="@+id/btnTakePhoto" />
<Button <Button
android:id="@+id/btnReboot" android:id="@+id/btnReboot"
@ -309,7 +309,7 @@
android:text="@string/main_reboot" android:text="@string/main_reboot"
android:layout_marginStart="4dp" android:layout_marginStart="4dp"
app:layout_constraintStart_toEndOf="@+id/btnRestartApp" app:layout_constraintStart_toEndOf="@+id/btnRestartApp"
app:layout_constraintTop_toBottomOf="@+id/takePhotoBtn" /> app:layout_constraintTop_toBottomOf="@+id/btnTakePhoto" />
<Button <Button
android:id="@+id/gps" android:id="@+id/gps"
@ -356,14 +356,14 @@
app:flow_horizontalGap="20dp" app:flow_horizontalGap="20dp"
app:flow_wrapMode="chain" app:flow_wrapMode="chain"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/takePhotoBtn4" /> app:layout_constraintTop_toBottomOf="@+id/btnTakePhoto4" />
<androidx.constraintlayout.widget.Barrier <androidx.constraintlayout.widget.Barrier
android:id="@+id/leftBarrier" android:id="@+id/leftBarrier"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
app:barrierDirection="right" app:barrierDirection="right"
app:constraint_referenced_ids="textViewCmdId,cmdid,protocol,networkProtocol,saveCfg,takePhotoBtn4,btnChannels" app:constraint_referenced_ids="textViewCmdId,cmdid,protocol,networkProtocol,btnSaveCfg,btnTakePhoto4,btnChannels"
tools:layout_editor_absoluteX="46dp" /> tools:layout_editor_absoluteX="46dp" />
<TextView <TextView
@ -381,7 +381,7 @@
android:textIsSelectable="true" android:textIsSelectable="true"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/takePhotoBtn4" app:layout_constraintStart_toEndOf="@+id/btnTakePhoto4"
app:layout_constraintTop_toTopOf="parent" /> app:layout_constraintTop_toTopOf="parent" />
<SurfaceView <SurfaceView

@ -6,5 +6,5 @@
<dimen name="activity_vertical_margin_small">4dp</dimen> <dimen name="activity_vertical_margin_small">4dp</dimen>
<dimen name="activity_horizontal_spacing">8dp</dimen> <dimen name="activity_horizontal_spacing">8dp</dimen>
<dimen name="activity_vertical_spacing">8dp</dimen> <dimen name="activity_vertical_spacing">8dp</dimen>
<dimen name="activity_min_width">72dp</dimen> <dimen name="activity_btn_min_width">72dp</dimen>
</resources> </resources>

@ -1,5 +1,7 @@
package com.xypower.common; package com.xypower.common;
import android.text.TextUtils;
import java.util.regex.Pattern; import java.util.regex.Pattern;
public class InetAddressUtils { public class InetAddressUtils {
@ -11,18 +13,30 @@ public class InetAddressUtils {
private static final Pattern IPV6_HEX_COMPRESSED_PATTERN = Pattern.compile("^((?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)?)::((?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)?)$"); private static final Pattern IPV6_HEX_COMPRESSED_PATTERN = Pattern.compile("^((?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)?)::((?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)?)$");
public static boolean isIPv4Address(final String input) { public static boolean isIPv4Address(final String input) {
if (TextUtils.isEmpty(input)) {
return false;
}
return IPV4_PATTERN.matcher(input).matches(); return IPV4_PATTERN.matcher(input).matches();
} }
public static boolean isIPv6StdAddress(final String input) { public static boolean isIPv6StdAddress(final String input) {
if (TextUtils.isEmpty(input)) {
return false;
}
return IPV6_STD_PATTERN.matcher(input).matches(); return IPV6_STD_PATTERN.matcher(input).matches();
} }
public static boolean isIPv6HexCompressedAddress(final String input) { public static boolean isIPv6HexCompressedAddress(final String input) {
if (TextUtils.isEmpty(input)) {
return false;
}
return IPV6_HEX_COMPRESSED_PATTERN.matcher(input).matches(); return IPV6_HEX_COMPRESSED_PATTERN.matcher(input).matches();
} }
public static boolean isIPv6Address(final String input) { public static boolean isIPv6Address(final String input) {
if (TextUtils.isEmpty(input)) {
return false;
}
return isIPv6StdAddress(input) || isIPv6HexCompressedAddress(input); return isIPv6StdAddress(input) || isIPv6HexCompressedAddress(input);
} }
} }

Loading…
Cancel
Save