package com.jd.projects.wlw.weatherinfo;
import android.app.AlertDialog;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.NumberPicker;
import android.widget.TextView;
import android.widget.Toast;
import com.github.mikephil.charting.charts.LineChart;
import com.github.mikephil.charting.components.YAxis;
import com.github.mikephil.charting.data.Entry;
import com.github.mikephil.charting.data.LineData;
import com.github.mikephil.charting.data.LineDataSet;
import com.github.mikephil.charting.formatter.IAxisValueFormatter;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
import java.util.List;
import android.graphics.Color;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import com.google.gson.Gson;
import java.io.IOException;
import java.net.URLEncoder;
import com.github.mikephil.charting.components.XAxis;
import com.github.mikephil.charting.components.AxisBase;
import java.util.Map;
import java.util.HashMap;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import java.util.concurrent.TimeUnit;
import com.google.gson.GsonBuilder;
import com.jd.projects.wlw.R;
import java.lang.reflect.Type;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonParser;
import com.google.gson.JsonNull;
import android.content.Context;
import java.util.Collections;
import com.github.mikephil.charting.components.MarkerView;
import com.github.mikephil.charting.highlight.Highlight;
import com.github.mikephil.charting.utils.MPPointF;
import java.util.TimeZone;
import java.util.LinkedHashMap;
public class XqhtjfxActivity extends AppCompatActivity {
private static final boolean TEST_MODE = true;
private static final String TEST_STATION_ID = "860048072347493";
private static final String TEST_STATION_NAME = "奎屯市开干齐乡高疙瘩泉村";
private String currentStationId;
private TextView nAme;
private Calendar startCalendar;
private Calendar endCalendar;
private String selectedProperty;
private String selectedYear;
private long startYear;
private long endYear;
public void onBottomNavClick(View view) {
String buttonText = ((TextView) ((LinearLayout) view).getChildAt(1)).getText().toString();
Class<?> targetActivity = null;
switch (buttonText) {
case "实时监测":
targetActivity = XqhActivity.class;
break;
case "历史数据":
targetActivity = XqhLssjActivity.class;
break;
case "数据汇总":
targetActivity = XqhSjhzActivity.class;
break;
case "月度查询":
showDateRangePicker1();
return;
case "统计分析":
return; // 已在当前页面
}
if (targetActivity != null) {
Intent intent = new Intent(this, targetActivity);
intent.putExtra("stationId", currentStationId);
intent.putExtra("stationName", nAme.getText().toString());
intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivity(intent);
finish();
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.xqhtjfx);
// 新增参数完整性校验
if (getIntent() == null || !getIntent().hasExtra("stationId")) {
showError("非法访问,缺少监测站参数");
// finish();
return;
}
currentStationId = TEST_MODE ? TEST_STATION_ID : getIntent().getStringExtra("stationId");
if (currentStationId == null || currentStationId.isEmpty()) {
showError("监测站ID获取失败");
// finish();
return;
}
// 获取选中的属性和年份
selectedProperty = getIntent().getStringExtra("selectedProperty");
selectedYear = getIntent().getStringExtra("selectedYear");
// 新增年份有效性校验
try {
int year = Integer.parseInt(selectedYear);
int currentYear = Calendar.getInstance().get(Calendar.YEAR);
if (year < 2000 || year > currentYear + 1) {
showError("无效的年份参数");
// finish();
return;
}
} catch (NumberFormatException e) {
showError("年份格式错误");
finish();
return;
}
if (selectedProperty == null || selectedYear == null) {
Toast.makeText(this, "请选择属性和年份", Toast.LENGTH_SHORT).show();
// finish();
return;
}
nAme = (TextView) findViewById(R.id.nAme);
nAme.setText(getIntent().getStringExtra("stationName"));
// 初始化折线图
LineChart chart = (LineChart) findViewById(R.id.chart);
initializeChart(chart);
// 初始化站点信息
if (TEST_MODE) {
currentStationId = TEST_STATION_ID;
nAme.setText(TEST_STATION_NAME);
} else {
Intent intent = getIntent();
if (intent != null) {
currentStationId = intent.getStringExtra("stationId");
String stationName = intent.getStringExtra("stationName");
nAme.setText(stationName != null ? stationName : "监测点信息异常");
}
}
// 调用后台接口获取数据
fetchAnnualData();
}
private void initializeChart(LineChart chart) {
chart.setTouchEnabled(true);
chart.setDragEnabled(true);
chart.setScaleEnabled(true);
chart.setPinchZoom(true);
chart.getDescription().setEnabled(false);
}
private void fetchAnnualData() {
String apiProperty = getApiProperty(selectedProperty);
if (apiProperty.isEmpty()) {
showError("无效的属性参数");
return;
}
new Thread(() -> {
try {
// 使用URL编码处理参数
String encodedProperty = URLEncoder.encode(apiProperty, "UTF-8");
String encodedStationId = URLEncoder.encode(currentStationId, "UTF-8");
String url = "http://117.190.40.178:8080/api/qixiang/"
+ encodedProperty + "/"
+ selectedYear
+ "?stationId=" + encodedStationId;
// Log.d("API_REQUEST", "请求URL: " + url);
// 新增超时设置
OkHttpClient client = new OkHttpClient.Builder()
.connectTimeout(20, TimeUnit.SECONDS)
.readTimeout(45, TimeUnit.SECONDS)
.retryOnConnectionFailure(true) // 添加重试机制
.build();
Request request = new Request.Builder()
.url(url)
.addHeader("Station-ID", currentStationId) // 双重验证
.build();
Response response = client.newCall(request).execute();
if (response.isSuccessful()) {
String jsonData = response.body().string();
// 添加调试日志
// Log.d("API_RESPONSE", "原始响应: " + jsonData);
Gson gson = new GsonBuilder()
.setLenient()
.registerTypeAdapter(JsonElement.class, new JsonDeserializer<JsonElement>() {
@Override
public JsonElement deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) {
try {
return new JsonParser().parse(json.getAsString());
} catch (Exception e) {
return JsonNull.INSTANCE;
}
}
})
.create();
JsonElement jsonElement = gson.fromJson(jsonData, JsonElement.class);
if (jsonElement.isJsonArray()) {
processJsonArray(jsonElement.getAsJsonArray(), apiProperty);
} else if (jsonElement.isJsonObject()) {
JsonObject jsonObject = jsonElement.getAsJsonObject();
// 检查状态码
if (jsonObject.has("code")) {
int code = jsonObject.get("code").getAsInt();
if (code != 200) {
String message = jsonObject.has("message") ?
jsonObject.get("message").getAsString() : "未知错误";
showError("服务器错误: " + message);
return;
}
}
// 提取数据数组
if (jsonObject.has("data")) {
JsonElement dataElement = jsonObject.get("data");
if (dataElement.isJsonArray()) {
processJsonArray(dataElement.getAsJsonArray(), apiProperty);
} else {
showError("数据格式异常:data字段不是数组");
}
} else {
showError("响应缺少data字段");
}
} else {
showError("未知的响应格式");
}
} else {
parseErrorResponse(response);
}
} catch (Exception e) {
e.printStackTrace();
showError("请求错误: " + e.getMessage());
}
}).start();
}
private Map<String, DailyStats> calculateDailyStats(List<DataPoint> dataPoints) {
Map<String, DailyStats> dailyMap = new HashMap<>();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault());
sdf.setTimeZone(TimeZone.getTimeZone("UTC")); // 统一使用UTC时区
for (DataPoint data : dataPoints) {
try {
// 使用UTC时区转换时间戳
String dateStr = sdf.format(new Date(data.getTimestampMillis()));
float value = (float) data.getValue();
if (!dailyMap.containsKey(dateStr)) {
dailyMap.put(dateStr, new DailyStats(value, value, value, 1));
} else {
DailyStats stats = dailyMap.get(dateStr);
stats.min = Math.min(stats.min, value);
stats.max = Math.max(stats.max, value);
stats.sum += value;
stats.count++;
}
} catch (Exception e) {
// Log.e("StatsError", "日期统计异常", e);
}
}
return dailyMap;
}
private void processJsonArray(JsonArray jsonArray, String apiProperty) {
List<DataPoint> dataPoints = new ArrayList<>();
SimpleDateFormat inputFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault());
inputFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
for (JsonElement element : jsonArray) {
try {
JsonObject obj = element.getAsJsonObject();
// 验证stationId匹配
String receivedStationId = obj.get("StationId").getAsString();
if (!receivedStationId.equals(currentStationId)) {
// Log.w("STATION_MISMATCH", "收到非当前站点数据,跳过处理");
continue;
}
// 解析时间
String monitorTime = obj.get("MonitorTime").getAsString();
Date date = inputFormat.parse(monitorTime);
// 修改点2:增强数值解析逻辑
JsonElement valueElement = obj.get(apiProperty);
if (valueElement == null || valueElement.isJsonNull()) {
// Log.w("DATA_ERROR", "缺少属性字段: " + apiProperty);
continue;
}
double value;
try {
// 尝试直接获取数值
value = valueElement.getAsDouble();
} catch (NumberFormatException | IllegalStateException e) {
// 处理字符串格式数值
String stringValue = valueElement.getAsString();
if (stringValue.isEmpty()) {
// Log.w("VALUE_PARSE", "空值数据: " + element.toString());
continue;
}
try {
value = Double.parseDouble(stringValue);
} catch (NumberFormatException ex) {
// Log.e("VALUE_PARSE", "数值转换失败: " + stringValue);
continue;
}
}
// 修改点3:添加特殊值处理
if ((apiProperty.equals("RainAdd") || apiProperty.equals("evaporation_capacity"))
&& value == 0.0) {
// Log.d("ZERO_VALUE", "接收到合法零值: " + value);
}
// 创建数据点
DataPoint dp = new DataPoint();
dp.setTimestampMillis(date.getTime());
dp.setValue(value);
dataPoints.add(dp);
} catch (ParseException e) {
// Log.e("TIME_PARSE", "时间解析失败: " + element.toString(), e);
} catch (Exception e) {
// Log.e("PARSE_ERROR", "数据解析异常", e);
}
}
// 添加调试日志显示解析结果
// Log.d("DATA_POINTS", "成功解析数据点数量: " + dataPoints.size());
runOnUiThread(() -> processData(dataPoints));
}
private void parseErrorResponse(Response response) {
try {
String errorBody = response.body().string();
runOnUiThread(() ->
Toast.makeText(this, "请求失败:" + response.code()
+ "\n" + errorBody, Toast.LENGTH_LONG).show());
} catch (IOException ex) {
runOnUiThread(() ->
Toast.makeText(this, "错误信息解析失败", Toast.LENGTH_SHORT).show());
}
}
private void processData(List<DataPoint> dataPoints) {
LineChart chart = (LineChart) findViewById(R.id.chart);
chart.clear();
if (dataPoints.isEmpty()) {
showError("无数据");
return;
}
DataPoint firstPoint = dataPoints.get(0);
if (firstPoint.getTimestampMillis() == 0) {
showError("数据解析异常:无效的初始数据点");
return;
}
// 计算每日统计数据
Map<String, DailyStats> dailyStats = new LinkedHashMap<>(); // 保持日期顺序
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault());
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
// 按天分组数据
for (DataPoint dp : dataPoints) {
String dayKey = sdf.format(new Date(dp.getTimestampMillis()));
float value = (float) dp.getValue();
if (!dailyStats.containsKey(dayKey)) {
dailyStats.put(dayKey, new DailyStats(value, value, value, 1));
} else {
DailyStats stats = dailyStats.get(dayKey);
stats.min = Math.min(stats.min, value);
stats.max = Math.max(stats.max, value);
stats.sum += value;
stats.count++;
}
}
// 填充完整日期范围(与XqhSjhzActivity相同的逻辑)
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
cal.set(Integer.parseInt(selectedYear), Calendar.JANUARY, 1, 0, 0, 0);
long startMillis = cal.getTimeInMillis();
cal.set(Integer.parseInt(selectedYear), Calendar.DECEMBER, 31, 23, 59, 59);
long endMillis = cal.getTimeInMillis();
while (cal.getTimeInMillis() >= startMillis) {
String dayKey = sdf.format(cal.getTime());
if (!dailyStats.containsKey(dayKey)) {
dailyStats.put(dayKey, new DailyStats(Float.NaN, Float.NaN, 0, 0));
}
cal.add(Calendar.DATE, -1); // 逆向填充确保完整
}
// 创建平均值数据集(与XqhSjhzActivity相同的计算方式)
List<Entry> avgEntries = new ArrayList<>();
for (Map.Entry<String, DailyStats> entry : dailyStats.entrySet()) {
try {
Date date = sdf.parse(entry.getKey());
float avg = entry.getValue().getAverage();
if (!Float.isNaN(avg)) {
avgEntries.add(new Entry(date.getTime(), avg));
}
} catch (ParseException e) {
e.printStackTrace();
}
}
// 按时间排序
Collections.sort(avgEntries, (e1, e2) -> Float.compare(e1.getX(), e2.getX()));
if (avgEntries.isEmpty()) {
showError("无有效数据");
return;
}
// 创建数据集
LineDataSet dataSet = new LineDataSet(avgEntries, selectedProperty + "日均值");
dataSet.setColor(Color.BLUE);
dataSet.setLineWidth(2f);
dataSet.setCircleColor(Color.RED);
dataSet.setCircleRadius(3f);
dataSet.setValueTextSize(10f);
dataSet.setMode(LineDataSet.Mode.CUBIC_BEZIER);
LineData lineData = new LineData(dataSet);
chart.setData(lineData);
// 配置X轴
XAxis xAxis = chart.getXAxis();
xAxis.setValueFormatter(new DateAxisValueFormatter());
xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
xAxis.setGranularity(86400000); // 1天间隔
xAxis.setLabelCount(12, true);
xAxis.setAxisMinimum(startMillis);
xAxis.setAxisMaximum(endMillis);
// 配置Y轴
YAxis leftAxis = chart.getAxisLeft();
leftAxis.setAxisMinimum(0f);
leftAxis.setGranularity(1f);
chart.getAxisRight().setEnabled(false);
// 添加MarkerView
CustomMarkerView markerView = new CustomMarkerView(this, R.layout.custom_marker_view);
chart.setMarker(markerView);
chart.invalidate();
}
// 添加数据统计模型
private static class DailyStats {
float min;
float max;
float sum;
int count;
DailyStats(float min, float max, float sum, int count) {
this.min = min;
this.max = max;
this.sum = sum;
this.count = count;
}
float getAverage() {
return count == 0 ? Float.NaN : sum / count;
}
}
// 添加自定义MarkerView
private class CustomMarkerView extends MarkerView {
private final TextView tvDate;
private final TextView tvValue;
private final SimpleDateFormat dateFormat;
public CustomMarkerView(Context context, int layoutResource) {
super(context, layoutResource);
tvDate = (TextView) findViewById(R.id.tvDate);
tvValue = (TextView) findViewById(R.id.tvValue);
dateFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault());
}
@Override
public void refreshContent(Entry e, Highlight highlight) {
long timestamp = (long) e.getX();
String unit = getUnitByProperty(selectedProperty);
tvDate.setText(dateFormat.format(new Date(timestamp)));
tvValue.setText(String.format(Locale.getDefault(), "%.1f%s", e.getY(), unit));
super.refreshContent(e, highlight);
}
@Override
public MPPointF getOffset() {
return new MPPointF(-(getWidth() / 2), -getHeight());
}
}
// 添加单位获取方法
private String getUnitByProperty(String property) {
Map<String, String> unitMap = new HashMap<>();
unitMap.put("空气温度", "℃");
unitMap.put("空气相对湿度", "%");
unitMap.put("降雨量", "mm");
unitMap.put("蒸发量", "mm");
unitMap.put("风速", "m/s");
unitMap.put("风向", "°");
unitMap.put("露点温度", "℃");
unitMap.put("光照度", "Klx");
unitMap.put("日照强度", "W/m?");
unitMap.put("气压", "hPa");
unitMap.put("光合有效辐射", "W");
unitMap.put("土壤温度10cm", "℃");
unitMap.put("土壤温度20cm", "℃");
unitMap.put("土壤温度30cm", "℃");
unitMap.put("土壤含水量10cm", "%");
unitMap.put("土壤含水量20cm", "%");
unitMap.put("土壤含水量30cm", "%");
return unitMap.getOrDefault(property, "");
}
private List<Entry> getEntries(List<DataPoint> dataPoints) {
List<Entry> entries = new ArrayList<>();
for (DataPoint dp : dataPoints) {
entries.add(new Entry(dp.getTimestampMillis(), (float) dp.getValue()));
}
return entries;
}
private class DateAxisValueFormatter implements IAxisValueFormatter {
private final SimpleDateFormat mFormat;
public DateAxisValueFormatter() {
mFormat = new SimpleDateFormat("MM-dd", Locale.getDefault());
mFormat.setTimeZone(TimeZone.getTimeZone("UTC")); // 确保格式化使用UTC
}
@Override
public String getFormattedValue(float value, AxisBase axis) {
return mFormat.format(new Date((long) value));
}
}
public class DataPoint {
private long timestampMillis;
private double value;
public void setTimestampMillis(long timestampMillis) {
this.timestampMillis = timestampMillis;
}
public void setValue(double value) {
this.value = value;
}
public long getTimestampMillis() { return timestampMillis; }
public double getValue() { return value; }
}
private void showError(String message) {
runOnUiThread(() ->
Toast.makeText(this, message, Toast.LENGTH_SHORT).show());
}
private void showDateRangePicker1() {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
View dialogView = getLayoutInflater().inflate(R.layout.custom_date_picker, null);
// 初始化开始日期控件
NumberPicker startYearPicker = (NumberPicker) dialogView.findViewById(R.id.np_start_year);
NumberPicker startMonthPicker = (NumberPicker) dialogView.findViewById(R.id.np_start_month);
NumberPicker startDayPicker = (NumberPicker) dialogView.findViewById(R.id.np_start_day);
// 初始化结束日期控件
NumberPicker endYearPicker = (NumberPicker) dialogView.findViewById(R.id.np_end_year);
NumberPicker endMonthPicker = (NumberPicker) dialogView.findViewById(R.id.np_end_month);
NumberPicker endDayPicker = (NumberPicker) dialogView.findViewById(R.id.np_end_day);
// 设置当前日期
Calendar calendar = Calendar.getInstance();
int currentYear = calendar.get(Calendar.YEAR);
int currentMonth = calendar.get(Calendar.MONTH) + 1; // 转换为1-based
int currentDay = calendar.get(Calendar.DAY_OF_MONTH);
// 配置开始日期选择器
configureDatePickers(startYearPicker, startMonthPicker, startDayPicker, currentYear, currentMonth, currentDay);
// 配置结束日期选择器
configureDatePickers(endYearPicker, endMonthPicker, endDayPicker, currentYear, currentMonth, currentDay);
// 设置日期动态调整监听器
setupListeners(startYearPicker, startMonthPicker, startDayPicker);
setupListeners(endYearPicker, endMonthPicker, endDayPicker);
builder.setView(dialogView)
.setPositiveButton("确定", (dialog, which) -> {
// 获取并验证日期
String startDate = getFormattedDate(startYearPicker, startMonthPicker, startDayPicker);
String endDate = getFormattedDate(endYearPicker, endMonthPicker, endDayPicker);
if (!validateDateRange(startDate, endDate)) {
Toast.makeText(this, "结束日期不能早于开始日期", Toast.LENGTH_SHORT).show();
return;
}
// 跳转至XqhydcxActivity
Intent intent = new Intent(this, XqhydcxActivity.class);
intent.putExtra("stationId", currentStationId);
intent.putExtra("stationName", nAme.getText().toString());
intent.putExtra("startDate", startDate);
intent.putExtra("endDate", endDate);
startActivity(intent);
})
.setNegativeButton("取消", (dialog, which) -> dialog.dismiss())
.create()
.show();
}
// 辅助方法:配置日期选择器初始值
private void configureDatePickers(NumberPicker yearPicker, NumberPicker monthPicker, NumberPicker dayPicker, int year, int month, int day) {
yearPicker.setMinValue(2020);
yearPicker.setMaxValue(2030);
yearPicker.setValue(year);
monthPicker.setMinValue(1);
monthPicker.setMaxValue(12);
monthPicker.setValue(month);
Calendar cal = Calendar.getInstance();
cal.set(year, month - 1, 1);
dayPicker.setMinValue(1);
dayPicker.setMaxValue(cal.getActualMaximum(Calendar.DAY_OF_MONTH));
dayPicker.setValue(day);
}
// 辅助方法:设置年、月变化监听器
private void setupListeners(NumberPicker yearPicker, NumberPicker monthPicker, NumberPicker dayPicker) {
yearPicker.setOnValueChangedListener((picker, oldVal, newVal) ->
updateDayPicker(monthPicker.getValue(), newVal, dayPicker));
monthPicker.setOnValueChangedListener((picker, oldVal, newVal) ->
updateDayPicker(newVal, yearPicker.getValue(), dayPicker));
}
// 辅助方法:动态调整日期的最大值
private void updateDayPicker(int month, int year, NumberPicker dayPicker) {
Calendar cal = Calendar.getInstance();
cal.set(year, month - 1, 1);
int maxDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
dayPicker.setMaxValue(maxDay);
if (dayPicker.getValue() > maxDay) {
dayPicker.setValue(maxDay);
}
}
// 辅助方法:格式化日期
private String getFormattedDate(NumberPicker year, NumberPicker month, NumberPicker day) {
return String.format("%04d-%02d-%02d", year.getValue(), month.getValue(), day.getValue());
}
// 辅助方法:验证日期范围
private boolean validateDateRange(String startDateStr, String endDateStr) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault());
try {
Date startDate = sdf.parse(startDateStr);
Date endDate = sdf.parse(endDateStr);
return !endDate.before(startDate);
} catch (ParseException e) {
e.printStackTrace();
return false;
}
}
private String getApiProperty(String chineseProperty) {
// 建立中文属性名与英文字段名的映射
Map<String, String> propertyMap = new HashMap<>();
propertyMap.put("空气温度", "Etemperature");
propertyMap.put("空气相对湿度", "Ehumidity");
propertyMap.put("降雨量", "RainAdd");
propertyMap.put("蒸发量", "evaporation_capacity");
propertyMap.put("风速", "WindSpeed");
propertyMap.put("风向", "WindDirection");
propertyMap.put("露点温度", "dewPoint");
propertyMap.put("光照度", "illuminance");
propertyMap.put("日照强度", "SimpleRadiation");
propertyMap.put("气压", "AirPressure");
propertyMap.put("光合有效辐射", "PhotoRadiation");
propertyMap.put("土壤温度10cm", "SoilTemp1");
propertyMap.put("土壤温度20cm", "SoilTemp2");
propertyMap.put("土壤温度30cm", "SoilTemp3");
propertyMap.put("土壤含水量10cm", "SoilHum1");
propertyMap.put("土壤含水量20cm", "SoilHum2");
propertyMap.put("土壤含水量30cm", "SoilHum3");
String apiField = propertyMap.getOrDefault(chineseProperty, "");
// Log.d("PropertyMapping", "中文属性: " + chineseProperty + " → 英文字段: " + apiField);
return apiField;
}
} apply plugin: 'com.android.application'
android {
useLibrary 'org.apache.http.legacy'
compileOptions {
encoding "GBK"
}
compileSdkVersion 24
buildToolsVersion "24.0.0"
aaptOptions.cruncherEnabled = false
aaptOptions.useNewCruncher = false
defaultConfig {
applicationId "com.jd.projects.wulianwang"
multiDexEnabled true
minSdkVersion 16
targetSdkVersion 24
versionCode 9
versionName "1.0.0.8"
ndk { abiFilters 'armeabi' }
}
lintOptions {
checkReleaseBuilds false
// Or, if you prefer, you can continue to check for errors in release builds,
// but continue the build even when errors are found:
abortOnError false
}
signingConfigs {
release {
storeFile file('wulianwang.jks')
storePassword '666666'
keyAlias 'wulianwang'
keyPassword '666666'
}
}
buildTypes {
release {
minifyEnabled false
signingConfig signingConfigs.release
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
aaptOptions {
ignoreAssetsPattern '!sdfg1.apk:!sdfg2.apk:!sdfg3.apk:!sdfg4.apk:'
}
}
debug {
minifyEnabled false
signingConfig signingConfigs.release
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
lintOptions {
checkReleaseBuilds false
abortOnError false
}
}
dependencies {
compile project(':mPAndroidChartLib')
compile project(':mqttlibs')
compile files('libs/1_6XDevSDK_1.29_beta.jar')
compile files('libs/afinal_0.5.1_bin.jar')
compile files('libs/AudioEngineSDK.jar')
compile files('libs/BaiduLBS_Android.jar')
compile files('libs/classes.jar')
compile files('libs/glide-3.7.0.jar')
compile files('libs/HCNetSDK.jar')
compile files('libs/INetSDK.jar')
compile files('libs/IPlaySDK.jar')
compile files('libs/jpush-sdk-release1.7.5.jar')
compile files('libs/jxl.jar')
compile files('libs/ksoap2-android-assembly-2.5.2-jar-with-dependencies.jar')
compile files('libs/MCRSDK.jar')
compile files('libs/PlayerSDK.jar')
compile files('libs/ToUProxy.jar')
compile files('libs/universal-image-loader-1.9.3.jar')
compile files('libs/vmsnetsdk.jar')
compile files('libs/volley.jar')
compile files('libs/xUtils-2.6.14.jar')
compile 'com.google.code.gson:gson:2.2.4'
compile 'com.android.support:support-v4:22.4.0'
compile 'com.android.support:appcompat-v7:22.1.1'
compile 'com.google.android.gms:play-services-appindexing:8.4.0'
compile files('libs/okhttp-2.7.5.jar')
// compile files('libs/okio-1.6.0.jar')
// implementation 'com.squareup.okhttp3:okhttp:4.9.1'
implementation 'com.squareup.okhttp3:logging-interceptor:4.9.1'
implementation 'com.squareup.retrofit2:retrofit:2.6.0'
implementation 'com.squareup.retrofit2:converter-gson:2.6.0'
implementation 'com.squareup.retrofit2:converter-scalars:2.4.0'
//2025.5.27新添加
// implementation 'com.android.support:appcompat-v7:24.0.0'
implementation 'com.android.support:gridlayout-v7:24.2.1'
implementation 'com.android.support.constraint:constraint-layout:1.0.2'
implementation 'com.android.support:recyclerview-v7:24.2.1'
implementation 'org.apache.poi:poi:3.15'
implementation 'org.apache.poi:poi-ooxml:3.15'
implementation 'com.fasterxml:aalto-xml:1.0.0'
implementation 'com.github.PhilJay:MPAndroidChart:v3.0.3'
}
configurations.all {
resolutionStrategy {
eachDependency { details ->
if (details.requested.group == 'androidx.annotation') {
details.useTarget group: 'com.android.support', name: 'support-annotations', version: '24.2.1'
}
}
}
}
依据上述代码解决报错,如果要改变依赖只能改变//2025.5.27新添加
// implementation 'com.android.support:appcompat-v7:24.0.0'
implementation 'com.android.support:gridlayout-v7:24.2.1'
implementation 'com.android.support.constraint:constraint-layout:1.0.2'
implementation 'com.android.support:recyclerview-v7:24.2.1'
implementation 'org.apache.poi:poi:3.15'
implementation 'org.apache.poi:poi-ooxml:3.15'
implementation 'com.fasterxml:aalto-xml:1.0.0'
implementation 'com.github.PhilJay:MPAndroidChart:v3.0.3'
}
configurations.all {
resolutionStrategy {
eachDependency { details ->
if (details.requested.group == 'androidx.annotation') {
details.useTarget group: 'com.android.support', name: 'support-annotations', version: '24.2.1'
}
}
}
}这些依赖,其他以来不能变。D:\biancheng\jd_jdwlw-master\android_Jdwlw\src\main\java\com\jd\projects\wlw\weatherinfo\XqhtjfxActivity.java:167: ����: �Ҳ�������
chart.getDescription().setEnabled(false);
^
����: ���� getDescription()
λ��: ����ΪLineChart�ı��� chart
D:\biancheng\jd_jdwlw-master\android_Jdwlw\src\main\java\com\jd\projects\wlw\weatherinfo\XqhtjfxActivity.java:426: ����: �����ݵ�����: ��floatת����int���ܻ�����ʧ
avgEntries.add(new Entry(date.getTime(), avg));
^
D:\biancheng\jd_jdwlw-master\android_Jdwlw\src\main\java\com\jd\projects\wlw\weatherinfo\XqhtjfxActivity.java:434: ����: �Ҳ�������
Collections.sort(avgEntries, (e1, e2) -> Float.compare(e1.getX(), e2.getX()));
^
����: ���� getX()
λ��: ����ΪEntry�ı��� e1
D:\biancheng\jd_jdwlw-master\android_Jdwlw\src\main\java\com\jd\projects\wlw\weatherinfo\XqhtjfxActivity.java:434: ����: �Ҳ�������
Collections.sort(avgEntries, (e1, e2) -> Float.compare(e1.getX(), e2.getX()));
^
����: ���� getX()
λ��: ����ΪEntry�ı��� e2
D:\biancheng\jd_jdwlw-master\android_Jdwlw\src\main\java\com\jd\projects\wlw\weatherinfo\XqhtjfxActivity.java:446: ����: �Ҳ�������
dataSet.setCircleRadius(3f);
^
����: ���� setCircleRadius(float)
λ��: ����ΪLineDataSet�ı��� dataSet
D:\biancheng\jd_jdwlw-master\android_Jdwlw\src\main\java\com\jd\projects\wlw\weatherinfo\XqhtjfxActivity.java:448: ����: �Ҳ�������
dataSet.setMode(LineDataSet.Mode.CUBIC_BEZIER);
^
����: ���� Mode
�: �� LineDataSet
D:\biancheng\jd_jdwlw-master\android_Jdwlw\src\main\java\com\jd\projects\wlw\weatherinfo\XqhtjfxActivity.java:450: ����: ����LineData(LineDataSet), �Ҳ������ʵĹ�����
LineData lineData = new LineData(dataSet);
^
������ LineData.LineData(List<String>)������
(������ƥ��; LineDataSet��ת��ΪList<String>)
������ LineData.LineData(String[])������
(������ƥ��; LineDataSet��ת��ΪString[])
D:\biancheng\jd_jdwlw-master\android_Jdwlw\src\main\java\com\jd\projects\wlw\weatherinfo\XqhtjfxActivity.java:455: ����: �Ҳ�������
xAxis.setValueFormatter(new DateAxisValueFormatter());
^
����: ���� setValueFormatter(XqhtjfxActivity.DateAxisValueFormatter)
λ��: ����ΪXAxis�ı��� xAxis
D:\biancheng\jd_jdwlw-master\android_Jdwlw\src\main\java\com\jd\projects\wlw\weatherinfo\XqhtjfxActivity.java:457: ����: �Ҳ�������
xAxis.setGranularity(86400000); // 1����
^
����: ���� setGranularity(int)
λ��: ����ΪXAxis�ı��� xAxis
D:\biancheng\jd_jdwlw-master\android_Jdwlw\src\main\java\com\jd\projects\wlw\weatherinfo\XqhtjfxActivity.java:458: ����: �Ҳ�������
xAxis.setLabelCount(12, true);
^
����: ���� setLabelCount(int,boolean)
λ��: ����ΪXAxis�ı��� xAxis
D:\biancheng\jd_jdwlw-master\android_Jdwlw\src\main\java\com\jd\projects\wlw\weatherinfo\XqhtjfxActivity.java:459: ����: �Ҳ�������
xAxis.setAxisMinimum(startMillis);
^
����: ���� setAxisMinimum(long)
λ��: ����ΪXAxis�ı��� xAxis
D:\biancheng\jd_jdwlw-master\android_Jdwlw\src\main\java\com\jd\projects\wlw\weatherinfo\XqhtjfxActivity.java:460: ����: �Ҳ�������
xAxis.setAxisMaximum(endMillis);
^
����: ���� setAxisMaximum(long)
λ��: ����ΪXAxis�ı��� xAxis
D:\biancheng\jd_jdwlw-master\android_Jdwlw\src\main\java\com\jd\projects\wlw\weatherinfo\XqhtjfxActivity.java:464: ����: �Ҳ�������
leftAxis.setAxisMinimum(0f);
^
����: ���� setAxisMinimum(float)
λ��: ����ΪYAxis�ı��� leftAxis
D:\biancheng\jd_jdwlw-master\android_Jdwlw\src\main\java\com\jd\projects\wlw\weatherinfo\XqhtjfxActivity.java:465: ����: �Ҳ�������
leftAxis.setGranularity(1f);
^
����: ���� setGranularity(float)
λ��: ����ΪYAxis�ı��� leftAxis
D:\biancheng\jd_jdwlw-master\android_Jdwlw\src\main\java\com\jd\projects\wlw\weatherinfo\XqhtjfxActivity.java:470: ����: �Ҳ�������
chart.setMarker(markerView);
^
����: ���� setMarker(XqhtjfxActivity.CustomMarkerView)
λ��: ����ΪLineChart�ı��� chart
D:\biancheng\jd_jdwlw-master\android_Jdwlw\src\main\java\com\jd\projects\wlw\weatherinfo\XqhtjfxActivity.java:494: ����: XqhtjfxActivity.CustomMarkerView���dz����, ����δ����MarkerView�еij���getYOffset()
private class CustomMarkerView extends MarkerView {
^
D:\biancheng\jd_jdwlw-master\android_Jdwlw\src\main\java\com\jd\projects\wlw\weatherinfo\XqhtjfxActivity.java:508: ����: �Ҳ�������
long timestamp = (long) e.getX();
^
����: ���� getX()
λ��: ����ΪEntry�ı��� e
D:\biancheng\jd_jdwlw-master\android_Jdwlw\src\main\java\com\jd\projects\wlw\weatherinfo\XqhtjfxActivity.java:511: ����: �Ҳ�������
tvValue.setText(String.format(Locale.getDefault(), "%.1f%s", e.getY(), unit));
^
����: ���� getY()
λ��: ����ΪEntry�ı��� e
D:\biancheng\jd_jdwlw-master\android_Jdwlw\src\main\java\com\jd\projects\wlw\weatherinfo\XqhtjfxActivity.java:512: ����: ��ֱ�ӷ���MarkerView�еij��� refreshContent(Entry,Highlight)
super.refreshContent(e, highlight);
^
D:\biancheng\jd_jdwlw-master\android_Jdwlw\src\main\java\com\jd\projects\wlw\weatherinfo\XqhtjfxActivity.java:515: ����: �������Ḳ�ǻ�ʵ�ֳ����͵ķ���
@Override
^
D:\biancheng\jd_jdwlw-master\android_Jdwlw\src\main\java\com\jd\projects\wlw\weatherinfo\XqhtjfxActivity.java:547: ����: �����ݵ�����: ��floatת����int���ܻ�����ʧ
entries.add(new Entry(dp.getTimestampMillis(), (float) dp.getValue()));
^