diff --git a/app/src/main/java/com/xypower/mpremote/DeviceActivity.java b/app/src/main/java/com/xypower/mpremote/DeviceActivity.java
index 3e6c687..2df1eb5 100644
--- a/app/src/main/java/com/xypower/mpremote/DeviceActivity.java
+++ b/app/src/main/java/com/xypower/mpremote/DeviceActivity.java
@@ -364,7 +364,7 @@ public class DeviceActivity extends AppCompatActivity implements View.OnClickLis
@Override
public void run() {
if (photoOrVideo) {
- showPhoto(file.getAbsolutePath(),dirPath);
+ showPhoto(file.getAbsolutePath(), dirPath);
} else {
showVideo(file.getAbsolutePath());
}
@@ -459,7 +459,6 @@ public class DeviceActivity extends AppCompatActivity implements View.OnClickLis
// photoDialog = AlertDialogUtils.show(this, "照片或视频获取中");
-
showStreaming(channel, channel - 1, "rtmp://" + mDeviceIp + "/live/0", localIp);
// showStreaming(channel, channel - 1, "rtsp://61.169.135.146:1554/live/11", localIp);
return 0;
@@ -530,7 +529,7 @@ public class DeviceActivity extends AppCompatActivity implements View.OnClickLis
*/
}
- private void showPhoto(final String filePath,String path) {
+ private void showPhoto(final String filePath, String path) {
Intent intent = new Intent(this, ImageActivity.class);
intent.putExtra("path", filePath);
intent.putExtra("cmdid", TextUtils.isEmpty(mAppConfig.cmdid) ? "" : mAppConfig.cmdid);
@@ -552,6 +551,7 @@ public class DeviceActivity extends AppCompatActivity implements View.OnClickLis
int usb = 0;
int netCamera = 0;
int vendor = 0;
+ int selfTestingTime = 0;
Integer chVal = Integer.valueOf(channel);
if (mChannelCfgs.containsKey(chVal)) {
JSONObject jsonChannel = mChannelCfgs.get(chVal);
@@ -560,7 +560,7 @@ public class DeviceActivity extends AppCompatActivity implements View.OnClickLis
int orientation = jsonChannel.optInt("orientation", 0);
if (orientation > 0) {
rotation = (orientation - 1) * 90;
- } else if (orientation == 0){
+ } else if (orientation == 0) {
rotation = 90;
}
int cameraType = jsonChannel.optInt("cameraType", 0);
@@ -568,6 +568,7 @@ public class DeviceActivity extends AppCompatActivity implements View.OnClickLis
netCamera = (cameraType == 2 || cameraType == 4) ? 1 : 0;
vendor = jsonChannel.optInt("vendor", 0);
+ selfTestingTime = jsonChannel.optInt("selfTestingTime", 0);
}
}
@@ -582,7 +583,7 @@ public class DeviceActivity extends AppCompatActivity implements View.OnClickLis
intent.putExtra("vendor", vendor);
intent.putExtra("usb", usb);
intent.putExtra("cmdid", TextUtils.isEmpty(mAppConfig.cmdid) ? "" : mAppConfig.cmdid);
- // intent.putExtra("info", info);
+ intent.putExtra("selfTestingTime", selfTestingTime);
startActivity(intent);
}
@@ -709,11 +710,7 @@ public class DeviceActivity extends AppCompatActivity implements View.OnClickLis
finish();
break;
case R.id.refresh:
-// loadDeviceInfo(false)
-// ;
- Intent intent = new Intent(this, StreamActivity.class);
- // intent.putExtra("info", info);
- startActivity(intent);
+ loadDeviceInfo(false);
break;
}
}
diff --git a/app/src/main/java/com/xypower/mpremote/StreamActivity.java b/app/src/main/java/com/xypower/mpremote/StreamActivity.java
index a83bef1..01b48f8 100644
--- a/app/src/main/java/com/xypower/mpremote/StreamActivity.java
+++ b/app/src/main/java/com/xypower/mpremote/StreamActivity.java
@@ -13,11 +13,14 @@ import android.os.Looper;
import android.os.Message;
import android.text.TextUtils;
import android.util.Log;
+import android.view.View;
+import android.widget.LinearLayout;
import android.widget.Toast;
import com.xypower.mpremote.databinding.ActivityStreamBinding;
import com.xypower.mpremote.utils.AdbUtils;
import com.xypower.mpremote.utils.AlertDialogUtils;
+import com.xypower.mpremote.utils.CountdownAlertDialog;
import org.videolan.libvlc.LibVLC;
import org.videolan.libvlc.Media;
@@ -36,7 +39,7 @@ import androidx.core.content.ContextCompat;
import dadb.AdbShellResponse;
import dadb.Dadb;
-public class StreamActivity extends AppCompatActivity implements IVLCVout.Callback, TextureView.SurfaceTextureListener {
+public class StreamActivity extends AppCompatActivity implements IVLCVout.Callback, TextureView.SurfaceTextureListener, View.OnClickListener {
private static final String TAG = "VLCPlayer";
private static final int PERMISSION_REQUEST_CODE = 1001;
private static String pushUrl = "";
@@ -58,8 +61,11 @@ public class StreamActivity extends AppCompatActivity implements IVLCVout.Callba
private int rotation;
private int netCamera;
private int vendor;
+
+ private int selfTestingTime;
private int channel;
private AlertDialog alertDialog;
+ private LinearLayout back;
@Override
protected void onCreate(Bundle savedInstanceState) {
@@ -71,9 +77,7 @@ public class StreamActivity extends AppCompatActivity implements IVLCVout.Callba
initHandler();
initEvent();
// 检查并请求权限
- if (checkPermissions()) {
-// initializePlayer();
- } else {
+ if (!checkPermissions()) {
requestPermissions();
}
}
@@ -86,6 +90,9 @@ public class StreamActivity extends AppCompatActivity implements IVLCVout.Callba
case 1:
AlertDialogUtils.dismiss(alertDialog);
break;
+ case 2:
+ CountdownAlertDialog.dismiss();
+ break;
}
}
};
@@ -94,11 +101,10 @@ public class StreamActivity extends AppCompatActivity implements IVLCVout.Callba
private void initView() {
textureView = binding.textureView;
textureView.setSurfaceTextureListener(this);
-
-
+ back = binding.toolbar.back;
+ back.setOnClickListener(this);
}
-
private void initIntent() {
Intent intent = getIntent();
mDeviceIp = intent.getStringExtra("deviceIp");
@@ -107,30 +113,36 @@ public class StreamActivity extends AppCompatActivity implements IVLCVout.Callba
rotation = intent.getIntExtra("rotation", -1);
netCamera = intent.getIntExtra("netCamera", 0);
vendor = intent.getIntExtra("vendor", 0);
+ selfTestingTime = intent.getIntExtra("selfTestingTime", 0);
}
private void initEvent() {
if (netCamera == 0) {
+ alertDialog = AlertDialogUtils.show(this, "视频加载中");
pushUrl = "rtmp://127.0.0.1/live/" + channel;
} else {
+ if (selfTestingTime > 0) {
+ CountdownAlertDialog.show(this, selfTestingTime, new CountdownAlertDialog.OnCountdownFinishedListener() {
+ @Override
+ public void onCountdownFinished() {
+
+ }
+ });
+ }
pushUrl = "rtsp://127.0.0.1:8554/live/" + channel;
}
if (TextUtils.isEmpty(pushUrl)) {
handler.post(() -> Toast.makeText(StreamActivity.this, "未找到推流路径", Toast.LENGTH_LONG).show());
} else {
- String cmd = "am start -n com.xypower.mplive/com.xypower.mplive.MainActivity" + " --ei cameraId " + Integer.toString(cameraId) +" --ei channel " + Integer.toString(channel)+ " --ei rotation " + Integer.toString(rotation) + " --ei netCamera " + Integer.toString(netCamera) + " --ei vendor " + Integer.toString(vendor) + " --ei autoStart 1" + " --es url \"" + pushUrl + "\"";
+ String cmd = "am start -n com.xypower.mplive/com.xypower.mplive.MainActivity" + " --ei cameraId " + Integer.toString(cameraId) + " --ei channel " + Integer.toString(channel) + " --ei rotation " + Integer.toString(rotation) + " --ei netCamera " + Integer.toString(netCamera) + " --ei vendor " + Integer.toString(vendor) + " --ei autoStart 1" + " --es url \"" + pushUrl + "\"";
Runnable runnable = new Runnable() {
@Override
public void run() {
initializePlayer();
}
};
- alertDialog = AlertDialogUtils.show(this, "视频加载中");
startStreaming(cmd, runnable);
-// runOnUiThread(runnable);
-// new Thread(runnable).start();
-
}
}
@@ -166,9 +178,16 @@ public class StreamActivity extends AppCompatActivity implements IVLCVout.Callba
}
if (adbShellResponse != null) {
if (adbShellResponse.getExitCode() == 0) {
- try {
- Thread.sleep(150000);
- } catch (Exception ex) {
+ if (netCamera == 0) {
+ try {
+ Thread.sleep(150);
+ } catch (Exception ex) {
+ }
+ } else {
+ try {
+ Thread.sleep(40000);
+ } catch (Exception ex) {
+ }
}
runOnUiThread(runnable);
}
@@ -230,7 +249,6 @@ public class StreamActivity extends AppCompatActivity implements IVLCVout.Callba
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == PERMISSION_REQUEST_CODE) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
-// initializePlayer();
} else {
Toast.makeText(this, "需要存储权限才能播放视频", Toast.LENGTH_SHORT).show();
finish();
@@ -340,6 +358,14 @@ public class StreamActivity extends AppCompatActivity implements IVLCVout.Callba
}
}
+ @Override
+ public void onClick(View v) {
+ switch (v.getId()) {
+ case R.id.back:
+ finish();
+ break;
+ }
+ }
private String getErrorString(int state) {
switch (state) {
case Media.State.Error:
@@ -436,6 +462,7 @@ public class StreamActivity extends AppCompatActivity implements IVLCVout.Callba
@Override
protected void onDestroy() {
super.onDestroy();
+ CountdownAlertDialog.dismiss();
AlertDialogUtils.dismiss(alertDialog);
releasePlayer();
stopStreaming();
diff --git a/app/src/main/java/com/xypower/mpremote/utils/AlertDialogUtils.java b/app/src/main/java/com/xypower/mpremote/utils/AlertDialogUtils.java
index c17ec91..50b2b3d 100644
--- a/app/src/main/java/com/xypower/mpremote/utils/AlertDialogUtils.java
+++ b/app/src/main/java/com/xypower/mpremote/utils/AlertDialogUtils.java
@@ -23,6 +23,7 @@ public class AlertDialogUtils {
return loadingDialog;
}
+
public static void dismiss(AlertDialog loadingDialog) {
if (loadingDialog != null) {
loadingDialog.dismiss();
diff --git a/app/src/main/java/com/xypower/mpremote/utils/CountdownAlertDialog.java b/app/src/main/java/com/xypower/mpremote/utils/CountdownAlertDialog.java
new file mode 100644
index 0000000..2661403
--- /dev/null
+++ b/app/src/main/java/com/xypower/mpremote/utils/CountdownAlertDialog.java
@@ -0,0 +1,93 @@
+package com.xypower.mpremote.utils;
+
+import android.app.AlertDialog;
+import android.content.Context;
+import android.os.CountDownTimer;
+import android.view.Gravity;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.TextView;
+
+import com.xypower.mpremote.R;
+
+
+public class CountdownAlertDialog {
+
+ private static AlertDialog dialog;
+ private static CountDownTimer countDownTimer;
+ private static OnCountdownFinishedListener listener;
+
+ // 显示对话框(静态方法)
+ public static void show(Context context,
+ int countdownSeconds, OnCountdownFinishedListener listener) {
+ // 先关闭已存在的对话框
+ dismiss();
+ // 创建 AlertDialog
+ AlertDialog.Builder builder = new AlertDialog.Builder(context);
+ View dialogView = LayoutInflater.from(context).inflate(R.layout.dialog_loading, null);
+ TextView viewById = dialogView.findViewById(R.id.tvLoading);
+ viewById.setText("视频加载倒计时: " + countdownSeconds + " 秒");
+ builder.setView(dialogView);
+ builder.setCancelable(true); // 是否允许用户取消
+ dialog = builder.create();
+ dialog.show();
+
+ CountdownAlertDialog.listener = listener;
+ // 创建并显示对话框
+
+ if (countdownSeconds > 0) {
+ // 创建倒计时器
+ countDownTimer = new CountDownTimer(countdownSeconds * 1000, 1000) {
+ public void onTick(long millisUntilFinished) {
+ int secondsLeft = (int) (millisUntilFinished / 1000);
+ viewById.setText("视频加载倒计时: " + secondsLeft + " 秒");
+ }
+
+ public void onFinish() {
+ dismiss();
+ if (CountdownAlertDialog.listener != null) {
+ CountdownAlertDialog.listener.onCountdownFinished();
+ }
+ }
+ }.start();
+ }
+
+ // 设置对话框监听
+ dialog.setOnCancelListener(dialogInterface -> {
+ if (CountdownAlertDialog.listener != null) {
+ CountdownAlertDialog.listener.onCountdownCancelled();
+ }
+ dismiss();
+ });
+
+ dialog.setOnDismissListener(dialogInterface -> dismiss());
+
+ dialog.show();
+ }
+
+ // 关闭对话框(静态方法)
+ public static void dismiss() {
+ if (countDownTimer != null) {
+ countDownTimer.cancel();
+ countDownTimer = null;
+ }
+ if (dialog != null && dialog.isShowing()) {
+ dialog.dismiss();
+ dialog = null;
+ }
+ listener = null;
+ }
+
+ // 检查对话框是否显示中(静态方法)
+ public static boolean isShowing() {
+ return dialog != null && dialog.isShowing();
+ }
+
+ // 回调接口
+ public interface OnCountdownFinishedListener {
+ void onCountdownFinished();
+
+ default void onCountdownCancelled() {
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_device.xml b/app/src/main/res/layout/activity_device.xml
index bfd2006..9d569b2 100644
--- a/app/src/main/res/layout/activity_device.xml
+++ b/app/src/main/res/layout/activity_device.xml
@@ -1,5 +1,5 @@
-
-
+
-
+
-
+
-
+
-
+
-
+
-
+
+
-
\ No newline at end of file
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_stream.xml b/app/src/main/res/layout/activity_stream.xml
index f043c23..374f260 100644
--- a/app/src/main/res/layout/activity_stream.xml
+++ b/app/src/main/res/layout/activity_stream.xml
@@ -19,12 +19,24 @@
-
+
+
+
+
+
+
+
+
+
+
+