package com.example.layoutdome;
import androidx.appcompat.app.AppCompatActivity;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.media.MediaPlayer;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.View;
import android.webkit.JavascriptInterface;
import android.webkit.WebChromeClient;
import android.webkit.WebResourceError;
import android.webkit.WebResourceRequest;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.ImageView;
import android.widget.MediaController;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;
import com.google.android.exoplayer2.MediaItem;
import com.google.android.exoplayer2.SimpleExoPlayer;
import com.google.android.exoplayer2.trackselection.DefaultTrackSelector;
import com.google.android.exoplayer2.trackselection.TrackSelector;
import java.io.File;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;
public class MainActivity3 extends AppCompatActivity implements StyleRequest.OnStyleRequestListener {
private WebView webView, topWebView;
private TextView tvMarqueeBlue,tvMarqueeGreen,tvMarqueePurple;
private FullScreenVideoView videoView;
private String url;
private String topUrl;
private String lastValue = "";//避免不必要的页面加载
private ImageView ivImage;
private RelativeLayout rlBlue, rlGreen, rlPurple;
private Handler handler = new Handler(Looper.getMainLooper());
private Runnable refreshRunnable = new Runnable() {
@Override
public void run() {
// 执行请求
new StyleRequest(MainActivity3.this).execute();
// 每 5 分钟重复执行
handler.postDelayed(this, 10000);
}
};
public static int getDeviceWidthInDp(Context context) {
DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
int widthPixels = displayMetrics.widthPixels;
float density = displayMetrics.density;
return (int) (widthPixels / density);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main3);
webView = findViewById(R.id.web);
topWebView = findViewById(R.id.webView);
ivImage = findViewById(R.id.iv_image_blue);
tvMarqueeBlue = findViewById(R.id.tv_marquee_blue);
tvMarqueeGreen = findViewById(R.id.tv_marquee_green);
tvMarqueePurple = findViewById(R.id.tv_marquee_purple);
videoView = (FullScreenVideoView) findViewById(R.id.video);
// 初始化三个 RelativeLayout
rlBlue = findViewById(R.id.rl_blue);
rlGreen = findViewById(R.id.rl_green);
rlPurple = findViewById(R.id.rl_purple);
// 默认隐藏所有布局
rlBlue.setVisibility(View.GONE);
rlGreen.setVisibility(View.GONE);
rlPurple.setVisibility(View.GONE);
// 从 Intent 获取预加载的 URL
Intent intent = getIntent();
String topUrl = intent.getStringExtra("topUrl");
String mainUrl = intent.getStringExtra("mainUrl");
if (topUrl !=null && mainUrl != null) {
SetUpTopTheWebPageWithUrl(topUrl);
SetUpTheWebPageWithUrl(mainUrl);
}else {
// 如果没有预加载数据,则走原来的逻辑
// 1. 立即执行一次请求
new StyleRequest(this).execute();
// 启动定时任务:每 5 分钟执行一次
handler.postDelayed(refreshRunnable, 10000); // 5 分钟
}
SetUpTheVideo();
int widthDp = getDeviceWidthInDp(this);
Log.d("ScreenInfo", "Device width in dp: " + widthDp);
initTopWebViewClient(); // 只设置一次
}
private void initTopWebViewClient() {
topWebView.setWebViewClient(new WebViewClient() {
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
Log.d("WebView", "开始加载: " + url);
}
@Override
public void onPageFinished(WebView view, String url) {
Log.d("WebView", "页面加载完成: " + url);
view.evaluateJavascript("document.querySelectorAll('img').forEach(img => img.loading = 'lazy');", null);
}
@Override
public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
Log.e("WebView", "加载错误: " + error.toString());
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
Log.d("WebView", "尝试加载: " + url);
view.loadUrl(url);
return true;
}
});
}
@Override
public void onStyleRequest(StyleList styleList) {
String value = styleList.getData().getValue();
if (value != null && !value.equals(lastValue)) {
lastValue = value; // 更新 lastValue
SetUpTheWebPage(value);
SetUpTopTheWebPage(value);
// 切换布局显示
showBulletinByValue(value);
Log.d("MainActivity3", "valuewqeqweqweqweq" + value);
} else {
Log.d("MainActivity3", "value 未发生变化,跳过加载");
}
}
// 根据 value 切换显示哪个布局
@SuppressLint("ResourceAsColor")
public void showBulletinByValue(String value) {
// 先隐藏所有
rlBlue.setVisibility(View.GONE);
rlGreen.setVisibility(View.GONE);
rlPurple.setVisibility(View.GONE);
// 根据 value 显示对应的布局
switch (value) {
case "1":
rlGreen.setVisibility(View.VISIBLE);
SetUpMarquees(tvMarqueeGreen);
tvMarqueeGreen.setTextColor(getColor(R.color.green));
break;
case "2":
SetUpMarquees(tvMarqueePurple);
tvMarqueePurple.setTextColor(getColor(R.color.purple));
rlPurple.setVisibility(View.VISIBLE);
break;
default:
SetUpMarquees(tvMarqueeBlue);
tvMarqueeBlue.setTextColor(getColor(R.color.white));
rlBlue.setVisibility(View.VISIBLE); // 默认显示蓝色
break;
}
}
@SuppressLint("SetJavaScriptEnabled")
private void SetUpTopTheWebPage(String value) {
if (topWebView == null) {
Log.e("SetUpTopTheWebPage", "topWebView 未初始化");
return;
}
WebSettings webSettings = topWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
webSettings.setUseWideViewPort(true);
webSettings.setLoadWithOverviewMode(true);
webSettings.setDomStorageEnabled(true);
webSettings.setCacheMode(WebSettings.LOAD_DEFAULT);
webSettings.setRenderPriority(WebSettings.RenderPriority.HIGH);
webSettings.setJavaScriptCanOpenWindowsAutomatically(false);
webSettings.setSupportMultipleWindows(false);
webSettings.setBuiltInZoomControls(false);
webSettings.setDisplayZoomControls(false);
switch (value) {
case "0":
// 加载网页
topUrl = "http://192.168.2.36:8088/#/header?deviceNo=ES02&type=0";
break;
case "1":
topUrl = "http://192.168.2.36:8088/#/header?deviceNo=ES02&type=1";
break;
case "2":
topUrl = "http://192.168.2.36:8088/#/header?deviceNo=ES02&type=2";
break;
}
// 清除缓存
topWebView.clearCache(true);
topWebView.clearHistory();
Log.i("wangye", "dizhi" + topUrl);
// 添加时间戳防止缓存
String finalUrl = topUrl + "&t=" + System.currentTimeMillis();
// 预加载顶部 WebView
topWebView.loadUrl("about:blank"); // 先加载空白页
// 然后再加载真实 URL
new Handler(Looper.getMainLooper()).postDelayed(() -> {
topWebView.loadUrl(finalUrl);
}, 50);
}
private void SetUpMarquees(TextView textView) {
textView.setText("S3.整理代码需要访问的数据地址S3.整理代码需要访问的数据地址S3.整理代码需要访问的数据地址S3.整理代码需要访问的数据地址S3.整理代码需要访问的数据地址S3.整理代码需要访问的数据地址S3.整");
textView.setSelected(true); // 必须设置为 selected 才能启动 marquee
textView.setFocusable(true);
textView.setFocusableInTouchMode(true);
textView.requestFocus(); // 强制获取焦点
}
private void SetUpTheVideo() {
// 视频文件的路径
String videoPath = "/storage/emulated/0/Download/DEFAULT.mp4";
// 创建 File 对象
File videoFile = new File(videoPath);
// 检查文件是否存在
if (videoFile.exists()) {
// 文件存在
Toast.makeText(this, "文件存在", Toast.LENGTH_SHORT).show();
} else {
// 文件不存在
Toast.makeText(this, "文件不存在", Toast.LENGTH_SHORT).show();
}
// 设置视频路径
videoView.setVideoPath(videoPath);
// 添加控制器
MediaController mediaController = new MediaController(this);
mediaController.setAnchorView(videoView);
videoView.setMediaController(mediaController);
videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
// 播放视频
videoView.start();
}
});
// 检查文件格式和编码是否受支持
videoView.setOnErrorListener(new MediaPlayer.OnErrorListener() {
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
if (what == MediaPlayer.MEDIA_ERROR_UNSUPPORTED) {
}
// 处理不支持的文件格式或编码
Log.e("VideoPlayer", "播放视频时发生错误. what: " + what + ", extra: " + extra);
return false;
}
});
}
@SuppressLint("SetJavaScriptEnabled")
private void SetUpTheWebPage(String value) {
WebSettings webSettings = webView.getSettings();
webSettings.setJavaScriptEnabled(true);
webSettings.setUseWideViewPort(true);
webSettings.setLoadWithOverviewMode(true);
webSettings.setDomStorageEnabled(true);
webSettings.setCacheMode(WebSettings.LOAD_DEFAULT);
webSettings.setRenderPriority(WebSettings.RenderPriority.HIGH);
webSettings.setJavaScriptCanOpenWindowsAutomatically(false);
webSettings.setSupportMultipleWindows(false);
webSettings.setBuiltInZoomControls(false);
webSettings.setDisplayZoomControls(false);
// 注入接口对象
webView.addJavascriptInterface(new JavascriptBroadcastInterfaces(), "broadcast");
Log.d("MainActivity3", "value 发生变化,加载");
Log.i("MainActivity3", "下边距web:" + value);
switch (value) {
case "0":
// 加载网页
url = "http://192.168.2.36:8088/#/electrStation?deviceNo=ES02";
break;
case "1":
url = "http://192.168.2.36:8088/#/electrStation/greenTemp?deviceNo=ES02";
break;
case "2":
url = "http://192.168.2.36:8088/#/electrStation/purpleTemp?deviceNo=ES02";
break;
}
// 设置 WebViewClient 以在应用内打开页面
webView.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url) {
webView.evaluateJavascript("document.querySelectorAll('img').forEach(img => img.loading = 'lazy');", null);
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
});
webView.loadUrl(url);
}
public class JavascriptBroadcastInterfaces {
private String lastBroadcast; // 保存上一次收到的 broadcast
@JavascriptInterface
public void getBroadcast(String broadcast) {
Log.i("Broadcast", "Received broadcast: " + broadcast);
// 如果新值和上次相同,直接返回
if (broadcast != null && broadcast.equals(lastBroadcast)) {
Log.i("Broadcast", "重复的 broadcast,跳过播放");
return;
}
// 更新 lastBroadcast 为新的值
lastBroadcast = broadcast;
// 构造音频 URL
String audioUrl = "http://192.168.3.150:816/mp3?s=" + broadcast;
if (isUrlReachable(audioUrl, MainActivity3.this)) {
// 开始播放音频
Log.e("Broadcast", "音频 URL :" + audioUrl);
playAudioWithExoPlayer(audioUrl);
} else {
Log.e("Broadcast", "音频 URL 不可用");
}
}
SimpleExoPlayer player;
private void playAudioWithExoPlayer(String audioUrl) {
if (player != null) {
player.release();
player = null;
}
TrackSelector trackSelector = new DefaultTrackSelector();
player = new SimpleExoPlayer.Builder(MainActivity3.this).setTrackSelector(trackSelector).build();
MediaItem mediaItem = MediaItem.fromUri(audioUrl);
player.setMediaItem(mediaItem);
player.prepare();
player.play();
}
}
@Override
public void onBackPressed() {
// 如果 WebView 可以返回,则返回上一页
if (webView.canGoBack()) {
webView.goBack();
} else {
super.onBackPressed();
}
}
private boolean isUrlReachable(String audioUrl, Context context) {
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = cm.getActiveNetworkInfo();
if (netInfo == null || !netInfo.isConnected()) {
Log.e("Network", "No network connection");
return false;
}
try {
URL url = new URL(audioUrl);
HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();
urlConn.setConnectTimeout(3000);
urlConn.setRequestMethod("HEAD");
int responseCode = urlConn.getResponseCode();
String contentType = urlConn.getContentType();
Log.d("URLCheck", "Response Code: " + responseCode);
Log.d("URLCheck", "Content-Type: " + contentType);
urlConn.disconnect();
return responseCode == HttpURLConnection.HTTP_OK;
} catch (IOException e) {
Log.e("URLCheck", "URL 不可达", e);
return false;
}
}
@Override
protected void onDestroy() {
super.onDestroy();
// 停止定时任务
handler.removeCallbacks(refreshRunnable);
}
@SuppressLint("SetJavaScriptEnabled")
private void SetUpTopTheWebPageWithUrl(String topUrl) {
WebSettings webSettings = topWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
webSettings.setUseWideViewPort(true);
webSettings.setLoadWithOverviewMode(true);
webSettings.setDomStorageEnabled(true);
webSettings.setCacheMode(WebSettings.LOAD_DEFAULT);
webSettings.setRenderPriority(WebSettings.RenderPriority.HIGH);
topWebView.clearCache(true);
topWebView.clearHistory();
String finalUrl = topUrl + "&t=" + System.currentTimeMillis();
topWebView.loadUrl("about:blank");
new Handler(Looper.getMainLooper()).postDelayed(() -> topWebView.loadUrl(finalUrl), 50);
}
@SuppressLint("SetJavaScriptEnabled")
private void SetUpTheWebPageWithUrl(String mainUrl) {
WebSettings webSettings = webView.getSettings();
webSettings.setJavaScriptEnabled(true);
webSettings.setUseWideViewPort(true);
webSettings.setLoadWithOverviewMode(true);
webSettings.setDomStorageEnabled(true);
webSettings.setCacheMode(WebSettings.LOAD_DEFAULT);
webSettings.setRenderPriority(WebSettings.RenderPriority.HIGH);
webView.addJavascriptInterface(new JavascriptBroadcastInterfaces(), "broadcast");
webView.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url) {
webView.evaluateJavascript("document.querySelectorAll('img').forEach(img => img.loading = 'lazy');", null);
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
});
String finalUrl = mainUrl + "&t=" + System.currentTimeMillis();
webView.loadUrl("about:blank");
new Handler(Looper.getMainLooper()).postDelayed(() -> webView.loadUrl(finalUrl), 50);
}
}这段代码不加package com.example.layoutdome;
import androidx.appcompat.app.AppCompatActivity;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.media.MediaPlayer;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.View;
import android.webkit.JavascriptInterface;
import android.webkit.WebChromeClient;
import android.webkit.WebResourceError;
import android.webkit.WebResourceRequest;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.ImageView;
import android.widget.MediaController;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;
import com.google.android.exoplayer2.MediaItem;
import com.google.android.exoplayer2.SimpleExoPlayer;
import com.google.android.exoplayer2.trackselection.DefaultTrackSelector;
import com.google.android.exoplayer2.trackselection.TrackSelector;
import java.io.File;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;
public class MainActivity3 extends AppCompatActivity implements StyleRequest.OnStyleRequestListener {
private WebView webView, topWebView;
private TextView tvMarqueeBlue,tvMarqueeGreen,tvMarqueePurple;
private FullScreenVideoView videoView;
private String url;
private String topUrl;
private String lastValue = "";//避免不必要的页面加载
private ImageView ivImage;
private RelativeLayout rlBlue, rlGreen, rlPurple;
private Handler handler = new Handler(Looper.getMainLooper());
private Runnable refreshRunnable = new Runnable() {
@Override
public void run() {
// 执行请求
new StyleRequest(MainActivity3.this).execute();
// 每 5 分钟重复执行
handler.postDelayed(this, 10000);
}
};
public static int getDeviceWidthInDp(Context context) {
DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
int widthPixels = displayMetrics.widthPixels;
float density = displayMetrics.density;
return (int) (widthPixels / density);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main3);
webView = findViewById(R.id.web);
topWebView = findViewById(R.id.webView);
ivImage = findViewById(R.id.iv_image_blue);
tvMarqueeBlue = findViewById(R.id.tv_marquee_blue);
tvMarqueeGreen = findViewById(R.id.tv_marquee_green);
tvMarqueePurple = findViewById(R.id.tv_marquee_purple);
videoView = (FullScreenVideoView) findViewById(R.id.video);
// 初始化三个 RelativeLayout
rlBlue = findViewById(R.id.rl_blue);
rlGreen = findViewById(R.id.rl_green);
rlPurple = findViewById(R.id.rl_purple);
// 默认隐藏所有布局
rlBlue.setVisibility(View.GONE);
rlGreen.setVisibility(View.GONE);
rlPurple.setVisibility(View.GONE);
// 从 Intent 获取预加载的 URL
Intent intent = getIntent();
String topUrl = intent.getStringExtra("topUrl");
String mainUrl = intent.getStringExtra("mainUrl");
if (topUrl !=null && mainUrl != null) {
SetUpTopTheWebPageWithUrl(topUrl);
SetUpTheWebPageWithUrl(mainUrl);
}else {
// 如果没有预加载数据,则走原来的逻辑
// 1. 立即执行一次请求
new StyleRequest(this).execute();
// 启动定时任务:每 5 分钟执行一次
handler.postDelayed(refreshRunnable, 10000); // 5 分钟
}
SetUpTheVideo();
int widthDp = getDeviceWidthInDp(this);
Log.d("ScreenInfo", "Device width in dp: " + widthDp);
initTopWebViewClient(); // 只设置一次
}
private void initTopWebViewClient() {
topWebView.setWebViewClient(new WebViewClient() {
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
Log.d("WebView", "开始加载: " + url);
}
@Override
public void onPageFinished(WebView view, String url) {
Log.d("WebView", "页面加载完成: " + url);
view.evaluateJavascript("document.querySelectorAll('img').forEach(img => img.loading = 'lazy');", null);
}
@Override
public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
Log.e("WebView", "加载错误: " + error.toString());
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
Log.d("WebView", "尝试加载: " + url);
view.loadUrl(url);
return true;
}
});
}
@Override
public void onStyleRequest(StyleList styleList) {
String value = styleList.getData().getValue();
if (value != null && !value.equals(lastValue)) {
lastValue = value; // 更新 lastValue
SetUpTheWebPage(value);
SetUpTopTheWebPage(value);
// 切换布局显示
showBulletinByValue(value);
Log.d("MainActivity3", "valuewqeqweqweqweq" + value);
} else {
Log.d("MainActivity3", "value 未发生变化,跳过加载");
}
}
// 根据 value 切换显示哪个布局
@SuppressLint("ResourceAsColor")
public void showBulletinByValue(String value) {
// 先隐藏所有
rlBlue.setVisibility(View.GONE);
rlGreen.setVisibility(View.GONE);
rlPurple.setVisibility(View.GONE);
// 根据 value 显示对应的布局
switch (value) {
case "1":
rlGreen.setVisibility(View.VISIBLE);
SetUpMarquees(tvMarqueeGreen);
tvMarqueeGreen.setTextColor(getColor(R.color.green));
break;
case "2":
SetUpMarquees(tvMarqueePurple);
tvMarqueePurple.setTextColor(getColor(R.color.purple));
rlPurple.setVisibility(View.VISIBLE);
break;
default:
SetUpMarquees(tvMarqueeBlue);
tvMarqueeBlue.setTextColor(getColor(R.color.white));
rlBlue.setVisibility(View.VISIBLE); // 默认显示蓝色
break;
}
}
@SuppressLint("SetJavaScriptEnabled")
private void SetUpTopTheWebPage(String value) {
if (topWebView == null) {
Log.e("SetUpTopTheWebPage", "topWebView 未初始化");
return;
}
WebSettings webSettings = topWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
webSettings.setUseWideViewPort(true);
webSettings.setLoadWithOverviewMode(true);
webSettings.setDomStorageEnabled(true);
webSettings.setCacheMode(WebSettings.LOAD_DEFAULT);
webSettings.setRenderPriority(WebSettings.RenderPriority.HIGH);
webSettings.setJavaScriptCanOpenWindowsAutomatically(false);
webSettings.setSupportMultipleWindows(false);
webSettings.setBuiltInZoomControls(false);
webSettings.setDisplayZoomControls(false);
switch (value) {
case "0":
// 加载网页
topUrl = "http://192.168.2.36:8088/#/header?deviceNo=ES02&type=0";
break;
case "1":
topUrl = "http://192.168.2.36:8088/#/header?deviceNo=ES02&type=1";
break;
case "2":
topUrl = "http://192.168.2.36:8088/#/header?deviceNo=ES02&type=2";
break;
}
// 清除缓存
topWebView.clearCache(true);
topWebView.clearHistory();
Log.i("wangye", "dizhi" + topUrl);
// 添加时间戳防止缓存
String finalUrl = topUrl + "&t=" + System.currentTimeMillis();
// 预加载顶部 WebView
topWebView.loadUrl("about:blank"); // 先加载空白页
// 然后再加载真实 URL
new Handler(Looper.getMainLooper()).postDelayed(() -> {
topWebView.loadUrl(finalUrl);
}, 50);
}
private void SetUpMarquees(TextView textView) {
textView.setText("S3.整理代码需要访问的数据地址S3.整理代码需要访问的数据地址S3.整理代码需要访问的数据地址S3.整理代码需要访问的数据地址S3.整理代码需要访问的数据地址S3.整理代码需要访问的数据地址S3.整");
textView.setSelected(true); // 必须设置为 selected 才能启动 marquee
textView.setFocusable(true);
textView.setFocusableInTouchMode(true);
textView.requestFocus(); // 强制获取焦点
}
private void SetUpTheVideo() {
// 视频文件的路径
String videoPath = "/storage/emulated/0/Download/DEFAULT.mp4";
// 创建 File 对象
File videoFile = new File(videoPath);
// 检查文件是否存在
if (videoFile.exists()) {
// 文件存在
Toast.makeText(this, "文件存在", Toast.LENGTH_SHORT).show();
} else {
// 文件不存在
Toast.makeText(this, "文件不存在", Toast.LENGTH_SHORT).show();
}
// 设置视频路径
videoView.setVideoPath(videoPath);
// 添加控制器
MediaController mediaController = new MediaController(this);
mediaController.setAnchorView(videoView);
videoView.setMediaController(mediaController);
videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
// 播放视频
videoView.start();
}
});
// 检查文件格式和编码是否受支持
videoView.setOnErrorListener(new MediaPlayer.OnErrorListener() {
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
if (what == MediaPlayer.MEDIA_ERROR_UNSUPPORTED) {
}
// 处理不支持的文件格式或编码
Log.e("VideoPlayer", "播放视频时发生错误. what: " + what + ", extra: " + extra);
return false;
}
});
}
@SuppressLint("SetJavaScriptEnabled")
private void SetUpTheWebPage(String value) {
WebSettings webSettings = webView.getSettings();
webSettings.setJavaScriptEnabled(true);
webSettings.setUseWideViewPort(true);
webSettings.setLoadWithOverviewMode(true);
webSettings.setDomStorageEnabled(true);
webSettings.setCacheMode(WebSettings.LOAD_DEFAULT);
webSettings.setRenderPriority(WebSettings.RenderPriority.HIGH);
webSettings.setJavaScriptCanOpenWindowsAutomatically(false);
webSettings.setSupportMultipleWindows(false);
webSettings.setBuiltInZoomControls(false);
webSettings.setDisplayZoomControls(false);
// 注入接口对象
webView.addJavascriptInterface(new JavascriptBroadcastInterfaces(), "broadcast");
Log.d("MainActivity3", "value 发生变化,加载");
Log.i("MainActivity3", "下边距web:" + value);
switch (value) {
case "0":
// 加载网页
url = "http://192.168.2.36:8088/#/electrStation?deviceNo=ES02";
break;
case "1":
url = "http://192.168.2.36:8088/#/electrStation/greenTemp?deviceNo=ES02";
break;
case "2":
url = "http://192.168.2.36:8088/#/electrStation/purpleTemp?deviceNo=ES02";
break;
}
// 设置 WebViewClient 以在应用内打开页面
webView.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url) {
webView.evaluateJavascript("document.querySelectorAll('img').forEach(img => img.loading = 'lazy');", null);
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
});
webView.loadUrl(url);
}
public class JavascriptBroadcastInterfaces {
private String lastBroadcast; // 保存上一次收到的 broadcast
@JavascriptInterface
public void getBroadcast(String broadcast) {
Log.i("Broadcast", "Received broadcast: " + broadcast);
// 如果新值和上次相同,直接返回
if (broadcast != null && broadcast.equals(lastBroadcast)) {
Log.i("Broadcast", "重复的 broadcast,跳过播放");
return;
}
// 更新 lastBroadcast 为新的值
lastBroadcast = broadcast;
// 构造音频 URL
String audioUrl = "http://192.168.3.150:816/mp3?s=" + broadcast;
if (isUrlReachable(audioUrl, MainActivity3.this)) {
// 开始播放音频
Log.e("Broadcast", "音频 URL :" + audioUrl);
playAudioWithExoPlayer(audioUrl);
} else {
Log.e("Broadcast", "音频 URL 不可用");
}
}
SimpleExoPlayer player;
private void playAudioWithExoPlayer(String audioUrl) {
if (player != null) {
player.release();
player = null;
}
TrackSelector trackSelector = new DefaultTrackSelector();
player = new SimpleExoPlayer.Builder(MainActivity3.this).setTrackSelector(trackSelector).build();
MediaItem mediaItem = MediaItem.fromUri(audioUrl);
player.setMediaItem(mediaItem);
player.prepare();
player.play();
}
}
@Override
public void onBackPressed() {
// 如果 WebView 可以返回,则返回上一页
if (webView.canGoBack()) {
webView.goBack();
} else {
super.onBackPressed();
}
}
private boolean isUrlReachable(String audioUrl, Context context) {
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = cm.getActiveNetworkInfo();
if (netInfo == null || !netInfo.isConnected()) {
Log.e("Network", "No network connection");
return false;
}
try {
URL url = new URL(audioUrl);
HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();
urlConn.setConnectTimeout(3000);
urlConn.setRequestMethod("HEAD");
int responseCode = urlConn.getResponseCode();
String contentType = urlConn.getContentType();
Log.d("URLCheck", "Response Code: " + responseCode);
Log.d("URLCheck", "Content-Type: " + contentType);
urlConn.disconnect();
return responseCode == HttpURLConnection.HTTP_OK;
} catch (IOException e) {
Log.e("URLCheck", "URL 不可达", e);
return false;
}
}
@Override
protected void onDestroy() {
super.onDestroy();
// 停止定时任务
handler.removeCallbacks(refreshRunnable);
}
@SuppressLint("SetJavaScriptEnabled")
private void SetUpTopTheWebPageWithUrl(String topUrl) {
WebSettings webSettings = topWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
webSettings.setUseWideViewPort(true);
webSettings.setLoadWithOverviewMode(true);
webSettings.setDomStorageEnabled(true);
webSettings.setCacheMode(WebSettings.LOAD_DEFAULT);
webSettings.setRenderPriority(WebSettings.RenderPriority.HIGH);
topWebView.clearCache(true);
topWebView.clearHistory();
String finalUrl = topUrl + "&t=" + System.currentTimeMillis();
topWebView.loadUrl("about:blank");
new Handler(Looper.getMainLooper()).postDelayed(() -> topWebView.loadUrl(finalUrl), 50);
}
@SuppressLint("SetJavaScriptEnabled")
private void SetUpTheWebPageWithUrl(String mainUrl) {
WebSettings webSettings = webView.getSettings();
webSettings.setJavaScriptEnabled(true);
webSettings.setUseWideViewPort(true);
webSettings.setLoadWithOverviewMode(true);
webSettings.setDomStorageEnabled(true);
webSettings.setCacheMode(WebSettings.LOAD_DEFAULT);
webSettings.setRenderPriority(WebSettings.RenderPriority.HIGH);
webView.addJavascriptInterface(new JavascriptBroadcastInterfaces(), "broadcast");
webView.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url) {
webView.evaluateJavascript("document.querySelectorAll('img').forEach(img => img.loading = 'lazy');", null);
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
});
String finalUrl = mainUrl + "&t=" + System.currentTimeMillis();
webView.loadUrl("about:blank");
new Handler(Looper.getMainLooper()).postDelayed(() -> webView.loadUrl(finalUrl), 50);
}
}这个判断没有预加载效果,加了又会导致实时切换页面webView网页没效果
最新发布