Shuhai.java:package com.jd.projects.wlw.shuhai;
import android.app.AlertDialog;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.GridLayout;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import com.android.volley.AuthFailureError;
import com.android.volley.DefaultRetryPolicy;
import com.android.volley.NoConnectionError;
import com.android.volley.ParseError;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.ServerError;
import com.android.volley.TimeoutError;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonObjectRequest;
import com.android.volley.toolbox.Volley;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.resource.drawable.GlideDrawable;
import com.bumptech.glide.request.RequestListener;
import com.bumptech.glide.request.target.Target;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import com.jd.projects.wlw.R;
public class Shuhai extends AppCompatActivity {
private TextView nAme;
private ListView dateList;
private String currentStationId;
private String stationName;
// private static final boolean TEST_MODE = false;
// private static final String TEST_STATION_ID = "20220811001";
// private static final String TEST_STATION_NAME = "测试监测点";
private GridLayout imageGrid;
private ProgressBar progressBar;
private RequestQueue requestQueue;
private static final String REQUEST_TAG = "ShuhaiRequest";
private String currentDate;
private Button btnYear, btnMonth;
private int currentYear;
private int currentMonth;
private Button deviceLocationBtn;
private Button spButton;
private ZoomImageView1 fullImageView; // 用于全屏显示
private FrameLayout fullscreenContainer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
try {
setContentView(R.layout.shuhai);
imageGrid = (GridLayout) findViewById(R.id.image_grid);
fullscreenContainer = (FrameLayout) findViewById(R.id.fullscreen_container);
fullImageView = (ZoomImageView1) findViewById(R.id.fullscreen_imageview);
// Log.d("GkdActivity", "Activity created");
} catch (Exception e) {
// Log.e("GkdActivity", "Error setting content view", e);
Toast.makeText(this, "加载界面失败", Toast.LENGTH_SHORT).show();
finish();
return;
}
// 初始化WebView
initFullscreenContainer();
// 控件初始化区域
View fanHui = findViewById(R.id.fanHui);
fanHui.setOnClickListener(v -> finish());
nAme = (TextView) findViewById(R.id.nAme);
dateList = (ListView) findViewById(R.id.date_list);
imageGrid = (GridLayout) findViewById(R.id.image_grid);
progressBar = (ProgressBar) findViewById(R.id.progressBar);
// 新增设备定位按钮初始化
Button deviceLocationBtn = (Button) findViewById(R.id.device_location);
deviceLocationBtn.setOnClickListener(v -> {
Intent resultIntent = new Intent();
resultIntent.putExtra("action", "show_location");
resultIntent.putExtra("site_id", currentStationId);
setResult(RESULT_OK, resultIntent);
finish();
});
// Volley请求队列初始化
requestQueue = Volley.newRequestQueue(this);
// 年月选择初始化
btnYear = (Button) findViewById(R.id.btn_year);
btnMonth = (Button) findViewById(R.id.btn_month);
initYearMonthSelection();
// 数据处理
handleIntentData();
// Log.d("GkdActivity", "Station ID: " + currentStationId);
// Log.d("GkdActivity", "Station Name: " + stationName);
// 名称显示处理
if (stationName != null) {
nAme.setText(stationName);
} else {
nAme.setText("监测点信息");
}
// 加载初始数据
loadDatesForCurrentMonth();
spButton = (Button) findViewById(R.id.Sp);
spButton.setOnClickListener(v -> {
// 创建跳转到ShuhaiSPActivity的Intent
Intent intent = new Intent(Shuhai.this, ShuhaiSp.class);
// 传递当前监测点信息
if (currentStationId != null) {
intent.putExtra("nsiteid", currentStationId);
}
if (stationName != null) {
intent.putExtra("sitealiasname", stationName);
}
// 添加额外数据(如果需要)
intent.putExtra("currentDate", currentDate);
intent.putExtra("currentYear", currentYear);
intent.putExtra("currentMonth", currentMonth);
// 启动新Activity
startActivity(intent);
});
}
private void initFullscreenContainer() {
// 设置关闭全屏的按钮事件
findViewById(R.id.close_fullscreen).setOnClickListener(v -> {
fullscreenContainer.setVisibility(View.GONE);
});
}
private void initYearMonthSelection() {
Calendar calendar = Calendar.getInstance();
currentYear = calendar.get(Calendar.YEAR);
currentMonth = calendar.get(Calendar.MONTH) + 1; // 转换为1-12格式
updateYearMonthButtons();
btnYear.setOnClickListener(v -> showYearPicker());
btnMonth.setOnClickListener(v -> showMonthPicker());
}
private void updateYearMonthButtons() {
btnYear.setText(String.valueOf(currentYear));
btnMonth.setText(String.format("%02d", currentMonth));
}
private void showYearPicker() {
final List<Integer> years = new ArrayList<>();
int startYear = currentYear - 9;
int endYear = currentYear + 9;
for (int i = startYear; i <= endYear; i++) years.add(i);
new AlertDialog.Builder(this)
.setTitle("选择年份")
.setAdapter(new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, years),
(dialog, which) -> {
currentYear = years.get(which);
updateYearMonthButtons();
loadDatesForCurrentMonth();
})
.show();
}
private void showMonthPicker() {
new AlertDialog.Builder(this)
.setTitle("选择月份")
.setItems(new String[]{"01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12"},
(dialog, which) -> {
currentMonth = which + 1;
updateYearMonthButtons();
loadDatesForCurrentMonth();
})
.show();
}
private void loadDatesForCurrentMonth() {
try {
// 使用动态获取的站点ID
String deviceCode = URLEncoder.encode(currentStationId, "UTF-8");
Calendar cal = Calendar.getInstance();
cal.set(currentYear, currentMonth - 1, 1, 0, 0, 0);
String startTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(cal.getTime());
cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
cal.set(Calendar.HOUR_OF_DAY, 23);
cal.set(Calendar.MINUTE, 59);
cal.set(Calendar.SECOND, 59);
String endTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(cal.getTime());
String url = "http://nyzbwlw.com/situation/http/device/mouse/getMouseList" +
"?deviceCode=" + deviceCode +
"&startTime=" + URLEncoder.encode(startTime, "UTF-8") +
"&endTime=" + URLEncoder.encode(endTime, "UTF-8") +
"&size=10000";
progressBar.setVisibility(View.VISIBLE);
JsonObjectRequest request = new JsonObjectRequest(
Request.Method.GET,
url,
null,
this::handleDateResponse,
this::handleDateError);
request.setRetryPolicy(new DefaultRetryPolicy(15000, 3, 1.5f));
requestQueue.add(request);
} catch (Exception e) {
progressBar.setVisibility(View.GONE);
Toast.makeText(this, "时间参数错误", Toast.LENGTH_SHORT).show();
}
}
private void handleIntentData() {
Intent intent = getIntent();
if (intent != null) {
currentStationId = intent.getStringExtra("nsiteid");
stationName = intent.getStringExtra("sitealiasname");
// Log.d("GkdActivity", "Received nsiteid: " + currentStationId);
// Log.d("GkdActivity", "Received sitealiasname: " + stationName);
if (currentStationId == null || currentStationId.isEmpty()) {
Toast.makeText(this, "未获取到监测点ID", Toast.LENGTH_SHORT).show();
setResult(RESULT_CANCELED);
supportFinishAfterTransition();
return;
}
} else {
Toast.makeText(this, "未获取到启动参数", Toast.LENGTH_SHORT).show();
finish();
}
}
private void handleDateResponse(JSONObject response) {
progressBar.setVisibility(View.GONE);
try {
if (!response.has("code") || response.getInt("code") != 100) {
handleDataError("服务器响应异常");
return;
}
JSONObject data = response.optJSONObject("data");
if (data == null || !data.has("list")) {
handleDataError("数据结构异常");
return;
}
Set<String> dateSet = new HashSet<>();
JSONArray list = data.getJSONArray("list");
for (int i = 0; i < list.length(); i++) {
String time = list.getJSONObject(i).optString("collectionTime", "")
.replace("T", " "); // 处理可能存在的ISO格式时间
if (time.length() >= 10) {
dateSet.add(time.substring(0, 10));
}
}
List<String> dates = new ArrayList<>(dateSet);
Collections.sort(dates, Collections.reverseOrder());
dateList.setAdapter(new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, dates));
dateList.setOnItemClickListener((parent, view, position, id) -> {
currentDate = dates.get(position);
loadImages();
});
if (!dates.isEmpty()) {
currentDate = dates.get(0);
loadImages();
}
} catch (JSONException e) {
handleDataError("数据格式错误");
}
}
private void loadImages() {
progressBar.setVisibility(View.VISIBLE);
try {
String startTime = currentDate + " 00:00:00";
String endTime = currentDate + " 23:59:59";
String url = "http://nyzbwlw.com/situation/http/device/mouse/getMouseList" +
"?deviceCode=" + URLEncoder.encode(currentStationId, "UTF-8") +
"&startTime=" + URLEncoder.encode(startTime, "UTF-8") +
"&endTime=" + URLEncoder.encode(endTime, "UTF-8");
JsonObjectRequest request = new JsonObjectRequest(
Request.Method.GET,
url,
null,
this::handleImageResponse,
this::handleImageError);
request.setRetryPolicy(new DefaultRetryPolicy(15000, 3, 1.5f));
requestQueue.add(request);
} catch (UnsupportedEncodingException e) {
progressBar.setVisibility(View.GONE);
Toast.makeText(this, "时间参数错误", Toast.LENGTH_SHORT).show();
}
}
private void handleImageResponse(JSONObject response) {
progressBar.setVisibility(View.GONE);
try {
if (response.getInt("code") == 100) {
JSONArray list = response.getJSONObject("data").getJSONArray("list");
List<String> imageUrls = new ArrayList<>();
List<String> imageTimes = new ArrayList<>();
for (int i = 0; i < list.length(); i++) {
JSONObject item = list.getJSONObject(i);
imageUrls.add(item.getString("pictureUrl"));
String rawTime = item.optString("collectionTime", "");
imageTimes.add(rawTime.substring(11, 19));
}
// 使用新的适配器方式
updateImageGrid(imageUrls, imageTimes);
}
} catch (JSONException e) {
handleDataError("图片数据解析失败");
}
}
// 替换RecyclerView为动态添加视图
private void updateImageGrid(List<String> imageUrls, List<String> imageTimes) {
imageGrid.removeAllViews(); // 清除旧视图
imageGrid.setColumnCount(2); // 2列网格
int spacing = getResources().getDimensionPixelSize(R.dimen.grid_spacing);
int availableWidth = getResources().getDisplayMetrics().widthPixels
- getResources().getDimensionPixelSize(R.dimen.left_nav_width);
// 新计算公式:总可用宽度 - 4个间隔(左右各1 + 中间2)
int imageSize = (availableWidth - spacing * 4) / 2;
int textHeight = (int) (30 * getResources().getDisplayMetrics().density);
for (int i = 0; i < imageUrls.size(); i++) {
View itemView = LayoutInflater.from(this).inflate(R.layout.grid_item_image, null);
ImageView imageView = (ImageView) itemView.findViewById(R.id.image_view);
TextView fileNameText = (TextView) itemView.findViewById(R.id.file_name);
String displayTime = imageTimes.get(i) != null ? imageTimes.get(i) : "--:--:--";
fileNameText.setText(displayTime);
// 设置图片大小
imageView.getLayoutParams().width = imageSize;
imageView.getLayoutParams().height = imageSize;
// 使用Glide加载图片并添加错误处理
final String url = imageUrls.get(i);
Glide.with(this)
.load(url)
.override(imageSize, imageSize)
.centerCrop()
.placeholder(R.drawable.placeholder)
.error(R.drawable.error_image)
.into(imageView);
// 设置点击事件
itemView.setOnClickListener(v -> showFullscreenImage(url));
// 添加视图到网格
// GridLayout.Spec rowSpec = GridLayout.spec(i / 2);
// GridLayout.Spec colSpec = GridLayout.spec(i % 2);
GridLayout.LayoutParams params = new GridLayout.LayoutParams(
GridLayout.spec(i / 2),
GridLayout.spec(i % 2)
);
params.width = imageSize;
params.height = imageSize + textHeight;
params.setMargins(spacing, spacing, spacing, spacing);
imageGrid.addView(itemView, params);
}
}
private void handleDateError(VolleyError error) {
progressBar.setVisibility(View.GONE);
handleNetworkError(error, "日期加载失败");
}
private void handleImageError(VolleyError error) {
progressBar.setVisibility(View.GONE);
handleNetworkError(error, "图片加载失败");
}
private void handleNetworkError(VolleyError error, String prefix) {
String message = prefix + ": ";
if (error instanceof TimeoutError) {
message += "请求超时(请检查网络)";
} else if (error instanceof NoConnectionError) {
message += "网络未连接";
} else if (error instanceof ServerError) {
message += "服务器错误(HTTP " + error.networkResponse.statusCode + ")";
} else if (error instanceof AuthFailureError) {
message += "认证失败(请检查权限)";
} else if (error instanceof ParseError) {
message += "数据解析异常(请检查API格式)";
} else {
message += "未知错误";
}
Toast.makeText(this, message, Toast.LENGTH_LONG).show();
}
private void handleDataError(String message) {
Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
}
private void showFullscreenImage(String imageUrl) {
fullscreenContainer.setVisibility(View.VISIBLE);
progressBar.setVisibility(View.VISIBLE);
// fullImageView.resetMatrix();
// 使用Glide加载全屏图片
Glide.with(this)
.load(imageUrl)
.listener(new RequestListener<String, GlideDrawable>() {
@Override
public boolean onException(Exception e, String model, Target<GlideDrawable> target,
boolean isFirstResource) {
progressBar.setVisibility(View.GONE);
// 显示错误图片
fullImageView.setImageResource(R.drawable.error_image);
return true; // 消费异常事件
}
@Override
public boolean onResourceReady(GlideDrawable resource, String model,
Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {
// 延迟执行确保视图已布局
fullImageView.post(() -> {
fullImageView.resetMatrix();
progressBar.setVisibility(View.GONE);
});
return false;
}
})
.error(R.drawable.error_image)
.into(fullImageView);
}
public void closeFullscreen(View view) {
fullscreenContainer.setVisibility(View.GONE);
}
@Override
protected void onStop() {
super.onStop();
if (requestQueue != null) {
requestQueue.cancelAll(REQUEST_TAG);
}
}
} shuhai.xml:<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/gradient_background">
<!-- 标题栏 -->
<RelativeLayout
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?android:attr/actionBarSize"
android:background="#44bd32">
<Button
android:id="@+id/fanHui"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginStart="8dp"
android:layout_marginEnd="8dp"
android:background="@android:color/transparent"
android:foreground="?android:attr/selectableItemBackground"
android:text="返回"
android:textColor="@android:color/white"
android:textSize="16sp" />
<!-- 修改后的标题文字模块 -->
<TextView
android:id="@+id/nAme"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:ellipsize="end"
android:gravity="center"
android:maxLines="1"
android:paddingStart="60dp"
android:paddingEnd="60dp"
android:text="图片"
android:textColor="@android:color/white"
android:textSize="19sp" />
<Button
android:id="@+id/Sp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginStart="365dp"
android:layout_marginEnd="8dp"
android:background="@android:color/transparent"
android:foreground="?android:attr/selectableItemBackground"
android:text="视频"
android:textColor="@android:color/white"
android:textSize="16sp" />
</RelativeLayout>
<!-- 底部按钮 -->
<LinearLayout
android:id="@+id/footer_buttons"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_alignParentBottom="true"
android:background="@android:color/transparent"
android:orientation="horizontal">
<Button
android:id="@+id/device_location"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:text="设备定位"
android:textSize="19sp"
android:background="#44bd32"
android:textColor="@android:color/white" />
</LinearLayout>
<!-- 左侧导航 -->
<LinearLayout
android:id="@+id/left_navigation"
android:layout_width="120dp"
android:layout_height="match_parent"
android:layout_below="@id/toolbar"
android:layout_above="@id/footer_buttons"
android:orientation="vertical"
android:background="@android:color/white"
android:padding="8dp">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="根据年月查看数据"
android:textColor="@android:color/black"
android:textSize="16sp"
android:gravity="center"
android:padding="8dp"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="4dp">
<Button
android:id="@+id/btn_year"
android:layout_width="0dp"
android:layout_height="40dp"
android:layout_weight="1"
android:background="@drawable/button_border"
android:textSize="16sp"
android:layout_marginEnd="4dp"/>
<Button
android:id="@+id/btn_month"
android:layout_width="0dp"
android:layout_height="40dp"
android:layout_weight="1"
android:background="@drawable/button_border"
android:textSize="16sp"
android:layout_marginStart="4dp"/>
</LinearLayout>
<ProgressBar
android:id="@+id/progressBar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:visibility="gone" />
<ListView
android:id="@+id/date_list"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:divider="#BDBDBD"
android:dividerHeight="1dp"/>
</LinearLayout>
<!-- 图片网格容器(添加滚动支持) -->
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@id/footer_buttons"
android:layout_below="@id/toolbar"
android:layout_toEndOf="@id/left_navigation"
android:background="@android:color/white"
android:fillViewport="true"
android:padding="0dp">
<GridLayout
android:id="@+id/image_grid"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:columnCount="2"
android:padding="0dp" />
</ScrollView>
<!-- 全屏容器(使用ImageView替代WebView) -->
<FrameLayout
android:id="@+id/fullscreen_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="gone"
android:background="@android:color/black">
<com.jd.projects.wlw.shuhai.ZoomImageView1
android:id="@+id/fullscreen_imageview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="matrix"/>
<ImageButton
android:id="@+id/close_fullscreen"
android:layout_width="60dp"
android:layout_height="60dp"
android:layout_gravity="top|end"
android:layout_margin="16dp"
android:src="@drawable/ic_close_white"
android:background="@drawable/round_button_bg"
android:onClick="closeFullscreen"/>
</FrameLayout>
</RelativeLayout> 解决shuhai.xml中布局文件中android:id="@+id/Sp"视频按钮没有显示在手机实时画面中