以线程启动和停止服务

serial
BlueMatthew 1 year ago
parent c021076d1e
commit 9ffddf0f85

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

@ -169,6 +169,7 @@ public class MicroPhotoService extends Service {
intentFilter.addAction(ACTION_HEARTBEAT_MANUALLY);
intentFilter.addAction(ACTION_MSG_BROADCAST);
intentFilter.addAction(ACTION_VIDEO_FINISHED);
intentFilter.addAction(ACTION_STOP);
getApplicationContext().registerReceiver(mAlarmReceiver, intentFilter);
// IntentFilter intentFilter2 = new IntentFilter(ACTION_MSG_BROADCAST);
@ -214,8 +215,10 @@ public class MicroPhotoService extends Service {
Log.w(TAG, "MicroPhotoService::onDestroy called");
uninit(mNativeHandle);
mNativeHandle = 0;
if (mNativeHandle != 0) {
uninit(mNativeHandle);
mNativeHandle = 0;
}
getApplicationContext().unregisterReceiver(mAlarmReceiver);
unregisterReceiver(mScreenaAtionReceiver);
@ -406,6 +409,8 @@ public class MicroPhotoService extends Service {
Log.i(TAG, "Recording received(" + Long.toString(videoId) + "):" + path);
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;
case ACTION_STOP:
unregisterReceiver(mScreenaAtionReceiver);
try {
unregisterReceiver(mScreenaAtionReceiver);
} catch (Exception ex) {
}
stopForeground(true);
stopSelf();
break;
@ -727,44 +735,95 @@ public class MicroPhotoService extends Service {
private void startTerminalService(Intent intent) {
String appPath = MicroPhotoContext.buildAppDir(this.getApplicationContext());
if (MicroPhotoService.this.mNativeHandle != 0) {
return;
}
String server = intent.getStringExtra("server");
int port = intent.getIntExtra("port", 0);
String cmdid = intent.getStringExtra("cmdid");
int protocol = intent.getIntExtra("protocol", 0);
int networkProtocol = intent.getIntExtra("networkProtocol", 0);
final String appPath = MicroPhotoContext.buildAppDir(this.getApplicationContext());
if (!InetAddressUtils.isIPv4Address(server) && !InetAddressUtils.isIPv6Address(server)) {
// It is a domain
InetAddress addr = null;
try {
addr = InetAddress.getByName(server);
} catch (Exception e) {
e.printStackTrace();
}
if (addr != null) {
server = addr.getHostAddress();
final String server = intent.getStringExtra("server");
final int port = intent.getIntExtra("port", 0);
final String cmdid = intent.getStringExtra("cmdid");
final int protocol = intent.getIntExtra("protocol", 0);
final int networkProtocol = intent.getIntExtra("networkProtocol", 0);
Runnable runnable = new Runnable() {
public void run() {
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) {
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;
public void stopTerminalService() {
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) {

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

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

@ -6,5 +6,5 @@
<dimen name="activity_vertical_margin_small">4dp</dimen>
<dimen name="activity_horizontal_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>

@ -1,5 +1,7 @@
package com.xypower.common;
import android.text.TextUtils;
import java.util.regex.Pattern;
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})*)?)$");
public static boolean isIPv4Address(final String input) {
if (TextUtils.isEmpty(input)) {
return false;
}
return IPV4_PATTERN.matcher(input).matches();
}
public static boolean isIPv6StdAddress(final String input) {
if (TextUtils.isEmpty(input)) {
return false;
}
return IPV6_STD_PATTERN.matcher(input).matches();
}
public static boolean isIPv6HexCompressedAddress(final String input) {
if (TextUtils.isEmpty(input)) {
return false;
}
return IPV6_HEX_COMPRESSED_PATTERN.matcher(input).matches();
}
public static boolean isIPv6Address(final String input) {
if (TextUtils.isEmpty(input)) {
return false;
}
return isIPv6StdAddress(input) || isIPv6HexCompressedAddress(input);
}
}

Loading…
Cancel
Save