管灌系统巡查员智能手机App
zuoxiao
2024-10-15 be9bea2335d4e4617844a1603aa624098c84b2a2
1、退出登录
2.显示当前版本号
3.删除缓存
4.地图相关
14个文件已修改
4个文件已添加
755 ■■■■ 已修改文件
app/src/main/AndroidManifest.xml 41 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/assets/index.html 44 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/pipirrapp/activity/LoginActivity.java 68 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/pipirrapp/activity/SplashScreenActivity.java 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/pipirrapp/bean/db/LoginBean.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/pipirrapp/bean/db/MarkerBean.java 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/pipirrapp/dao/AppDatabase.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/pipirrapp/dao/DaoSingleton.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/pipirrapp/dao/LoginDao.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/pipirrapp/dao/MarkerDao.java 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/pipirrapp/fragment/MapFragment.java 138 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/pipirrapp/fragment/MyFragment.java 58 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/pipirrapp/net/ApiManager.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/pipirrapp/service/MyLocationService.java 68 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/pipirrapp/utils/CleanDataUtils.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/activity_splash_screen.xml 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/fragment_map.xml 45 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/fragment_my.xml 88 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/AndroidManifest.xml
@@ -2,26 +2,22 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.dayu.pipirrapp">
    <!--允许访问网络,必选权限-->
    <uses-permission android:name="android.permission.INTERNET" />
    <!--用于进行网络定位-->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <!--用于访问GPS定位-->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <!--用于获取运营商信息,用于支持提供运营商信息相关的接口-->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <!--用于访问wifi网络信息,wifi信息会用于进行网络定位-->
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <!--用于获取wifi的获取权限,wifi信息会用来进行网络定位-->
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <!--用于访问网络,网络定位需要上网-->
    <uses-permission android:name="android.permission.INTERNET"></uses-permission>
    <uses-permission android:name="android.permission.INTERNET" />
    <!--用于写入缓存数据到扩展存储卡-->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <!--用于申请调用A-GPS模块-->
    <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"></uses-permission>
    <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
    <!--如果设置了target >= 28 如果需要启动后台定位则必须声明这个权限-->
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
    <!--如果您的应用需要后台定位权限,且有可能运行在Android Q设备上,并且设置了target>28,必须增加这个权限声明-->
@@ -30,8 +26,6 @@
    <uses-permission
        android:name="android.permission.ACCESS_MOCK_LOCATION"
        tools:ignore="MockLocation,ProtectedPermissions" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <application
        android:name=".MyApplication"
@@ -51,15 +45,9 @@
            android:name="ScopedStorage"
            android:value="true" />
        <activity
            android:name=".activity.MainActivity"
            android:exported="true"
            android:launchMode="singleTop">
        </activity>
        <activity android:name=".activity.ChangePSActivity" />
        <activity
            android:name=".activity.LoginActivity"
            android:name=".activity.SplashScreenActivity"
            android:exported="true"
            android:launchMode="singleTop">
            <intent-filter>
@@ -67,6 +55,17 @@
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".activity.MainActivity"
            android:exported="true"
            android:launchMode="singleTop"></activity>
        <activity android:name=".activity.ChangePSActivity" />
        <activity
            android:name=".activity.LoginActivity"
            android:exported="true"
            android:launchMode="singleTop">
        </activity>
        <!--        <activity android:name=".activity.MainActivity" />-->
        <!-- Required since 5.2.0 -->
        <!-- 新的 tag/alias 接口结果返回需要开发者配置一个自定义的Service -->
app/src/main/assets/index.html
@@ -4,32 +4,36 @@
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>天地图</title>
    <title>Map Example</title>
    <style>
       /* 确保 body 和 html 充满整个视口 */
        /* 确保 body 和 html 充满整个视口 */
        html, body {
            margin: 0;
            padding: 0;
            width: 100%;
            height: 100%;
            overflow: hidden; /* 防止滚动条出现 */
        }
     /* 确保地图容器充满整个视口 */
        #mapDiv {
            width: 100%;
            height: 100%;
            position: absolute; /* 保证地图全屏 */
            top: 0;
            left: 0;
        }
         margin: 0;
         padding: 0;
         width: 100%;
         height: 100%;
         overflow: hidden; /* 防止滚动条出现 */
     }
  /* 确保地图容器充满整个视口 */
     #mapDiv {
         width: 100%;
         height: 100%;
         position: absolute; /* 保证地图全屏 */
         top: 0;
         left: 0;
     }
    </style>
    <script src="http://api.tianditu.gov.cn/api?v=4.0&tk=d8beed89b43160a9a185e5aff431f85d"
        type="text/javascript"></script>
    <!-- 引用本地的天地图 JS 文件 -->
    <script src="js/tianditu.js"></script>
    <!-- <script src="http://api.tianditu.gov.cn/api?v=4.0&tk=d8beed89b43160a9a185e5aff431f85d"
        type="text/javascript"></script> -->
</head>
<body>
    <div id="mapDiv"></div>
    <script src="js/map.js"></script>
<div id="mapDiv"></div>
<script src="js/map.js"></script>
</body>
</html>
app/src/main/java/com/dayu/pipirrapp/activity/LoginActivity.java
@@ -8,7 +8,6 @@
import android.os.Bundle;
import android.os.PersistableBundle;
import android.text.InputType;
import android.text.TextUtils;
import android.util.Base64;
import android.util.Log;
import android.view.LayoutInflater;
@@ -26,7 +25,6 @@
import com.dayu.pipirrapp.databinding.ActivityLoginBinding;
import com.dayu.pipirrapp.net.ApiManager;
import com.dayu.pipirrapp.net.BaseResponse;
import com.dayu.pipirrapp.net.subscribers.CodeListener;
import com.dayu.pipirrapp.net.subscribers.SubscriberListener;
import com.dayu.pipirrapp.observer.LoginObserver;
import com.dayu.pipirrapp.utils.CommonData;
@@ -138,13 +136,15 @@
    private void getCode() {
        Map<String, Object> data = new HashMap<>();
        data.put("type", "math");//图片类型:char-文本,math-一位数算式,math2-两位数算式
        ApiManager.getInstance().getCode(data, new CodeListener() {
        ApiManager.getInstance().requestGetHideLoading(LoginActivity.this, BASE_URL + ":8088/app/captcha/get", CodeResult.class, data, new SubscriberListener<BaseResponse<CodeResult>>() {
            @Override
            public void onNext(CodeResult body) {
            public void onNext(BaseResponse<CodeResult> t) {
                try {
                    if (body != null && !TextUtils.isEmpty(body.getBase64())) {
                        String encodedString = body.getBase64();
                        codeToken = body.getToken();
                    if (t.isSuccess()) {
                        String encodedString = t.getContent().getBase64();
                        codeToken = t.getContent().getToken();
                        // 移除Base64字符串的头部信息
                        encodedString = encodedString.substring("data:image/png;base64,".length());
                        // 对Base64字符串进行解码
@@ -159,17 +159,48 @@
                        binding.codeError.setVisibility(View.VISIBLE);
                        ToastUtil.showToast(LoginActivity.this, "验证码获取失败");
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                    CrashReport.postCatchedException(e);
                }
            }
            @Override
            public void error(Throwable throwable) {
            }
        });
//        ApiManager.getInstance().getCode(data, new CodeListener() {
//            @Override
//            public void onNext(CodeResult body) {
//                try {
//                    if (body != null && !TextUtils.isEmpty(body.getBase64())) {
//                        String encodedString = body.getBase64();
//                        codeToken = body.getToken();
//                        // 移除Base64字符串的头部信息
//                        encodedString = encodedString.substring("data:image/png;base64,".length());
//                        // 对Base64字符串进行解码
//                        byte[] imageAsBytes = Base64.decode(encodedString, Base64.DEFAULT);
//                        // 使用BitmapFactory将字节数组解码成Bitmap对象
//                        Bitmap image = BitmapFactory.decodeByteArray(imageAsBytes, 0, imageAsBytes.length);
//                        binding.codeImg.setImageBitmap(image);
//                        binding.codeImg.setVisibility(View.VISIBLE);
//                        binding.codeError.setVisibility(View.GONE);
//                    } else {
//                        binding.codeImg.setVisibility(View.INVISIBLE);
//                        binding.codeError.setVisibility(View.VISIBLE);
//                        ToastUtil.showToast(LoginActivity.this, "验证码获取失败");
//                    }
//                } catch (Exception e) {
//                    e.printStackTrace();
//                    CrashReport.postCatchedException(e);
//                }
//            }
//
//            @Override
//            public void error(Throwable throwable) {
//
//            }
//        });
    }
    private void login(String phone, String pw, String token, String code) {
@@ -195,11 +226,9 @@
                        }
                        loginBean.setName(t.getContent().getName());
                        loginBean.setPhone(t.getContent().getPhone());
                        DaoSingleton.getInstance(LoginActivity.this).loginDao().update(loginBean);
                        DaoSingleton.getInstance(LoginActivity.this).loginDao().insert(loginBean);
                        SharedPreferencesHelper.getInstance(LoginActivity.this).put(CommonData.isShowCode, false);
                        Intent intent = new Intent(LoginActivity.this, MainActivity.class);
                        startActivity(intent);
                        LoginActivity.this.finish();
                        startMainActivity();
                    } else {
                        ToastUtil.showToast(LoginActivity.this, t.getMsg());
                        loginError++;
@@ -219,6 +248,15 @@
        });
    }
    /**
     * 启动MainActivity
     */
    private void startMainActivity() {
        Intent intent = new Intent(LoginActivity.this, MainActivity.class);
        startActivity(intent);
        LoginActivity.this.finish();
    }
    @Override
    protected void onStart() {
        super.onStart();
app/src/main/java/com/dayu/pipirrapp/activity/SplashScreenActivity.java
New file
@@ -0,0 +1,54 @@
package com.dayu.pipirrapp.activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.text.TextUtils;
import android.view.LayoutInflater;
import androidx.annotation.Nullable;
import com.dayu.pipirrapp.MyApplication;
import com.dayu.pipirrapp.bean.db.LoginBean;
import com.dayu.pipirrapp.dao.DaoSingleton;
import com.dayu.pipirrapp.databinding.ActivitySplashScreenBinding;
import com.dayu.pipirrapp.utils.CommonData;
import com.dayu.pipirrapp.utils.SharedPreferencesHelper;
/**
 * author: zuo
 * Date: 2024-10-09
 * Time: 15:19
 * 备注:
 */
public class SplashScreenActivity extends BaseActivity {
    ActivitySplashScreenBinding binding;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding = ActivitySplashScreenBinding.inflate(LayoutInflater.from(this));
        setContentView(binding.getRoot());
        new Handler().postDelayed(() -> {
            LoginBean loginBean = DaoSingleton.getInstance(SplashScreenActivity.this).loginDao().findFirst();
            String token = SharedPreferencesHelper.getInstance(SplashScreenActivity.this).get(CommonData.Token, "");
            if (loginBean != null && !TextUtils.isEmpty(token)) {
                startMainActivity();
                MyApplication.myApplication.token = token;
            } else {
                startLoginActivity();
            }
            SplashScreenActivity.this.finish();
        }, 1000);
    }
    private void startMainActivity() {
        Intent intent = new Intent(SplashScreenActivity.this, MainActivity.class);
        startActivity(intent);
    }
    private void startLoginActivity() {
        Intent intent = new Intent(SplashScreenActivity.this, LoginActivity.class);
        startActivity(intent);
    }
}
app/src/main/java/com/dayu/pipirrapp/bean/db/LoginBean.java
@@ -19,6 +19,7 @@
    public String phone;
    public String getName() {
        return name;
    }
app/src/main/java/com/dayu/pipirrapp/bean/db/MarkerBean.java
@@ -1,5 +1,6 @@
package com.dayu.pipirrapp.bean.db;
import androidx.annotation.Nullable;
import androidx.room.Entity;
import androidx.room.PrimaryKey;
@@ -12,19 +13,29 @@
@Entity
public class MarkerBean {
    @PrimaryKey(autoGenerate = true)
    public long id;
    public long localid;
    @Nullable
    String blockId;
    @Nullable
    String deleted;//逻辑删除标识
    @Nullable
    String divideId;//string
    String lat;//经度
    String lng;//纬度
    @Nullable
    String name;//取水口名称
    @Nullable
    String operateDt;//操作时间
    @Nullable
    String operator;//操作人编号
    @Nullable
    String remarks;//备注
    @Nullable
    String townId;//所在镇编号
    @Nullable
    String villageId;//所在村编号
    @Nullable
    String countyId;//所在县编号
    public String getBlockId() {
app/src/main/java/com/dayu/pipirrapp/dao/AppDatabase.java
@@ -5,6 +5,7 @@
import com.dayu.pipirrapp.bean.db.CenterPointBean;
import com.dayu.pipirrapp.bean.db.LoginBean;
import com.dayu.pipirrapp.bean.db.MarkerBean;
import com.dayu.pipirrapp.bean.db.TagBean;
@@ -15,7 +16,7 @@
 * Date: 2023-11-05 16:23
 * Description:
 */
@Database(entities = {TagBean.class, LoginBean.class, CenterPointBean.class}, version = 1, exportSchema = false)
@Database(entities = {TagBean.class, LoginBean.class, CenterPointBean.class, MarkerBean.class}, version = 1, exportSchema = false)
public abstract class AppDatabase extends RoomDatabase {
@@ -25,4 +26,6 @@
    public abstract CenterPointDao centerPointDao();
    public abstract MarkerDao markerDao();
}
app/src/main/java/com/dayu/pipirrapp/dao/DaoSingleton.java
@@ -3,6 +3,7 @@
import android.content.Context;
import androidx.room.Room;
import androidx.room.RoomDatabase;
import java.io.File;
@@ -15,17 +16,19 @@
public class DaoSingleton {
    public static AppDatabase baseDao;
    public static AppDatabase AsynchBaseDao;
    public static String SqlitePath = File.separator + "dbdata";
    public static String name = "dayu_data";
    //MyFileUtil.SqlitePath +
    public static AppDatabase getInstance(Context context) {
        if (baseDao == null) {
            baseDao = Room.databaseBuilder(
                    context,
                    AppDatabase.class,
                     "dayu_data"
            ).allowMainThreadQueries().build();
                            context,
                            AppDatabase.class,
                            name
                    ).allowMainThreadQueries()
                    .setJournalMode(RoomDatabase.JournalMode.TRUNCATE) // 可选,设置日志模式
                    .build();
        }
        return baseDao;
    }
@@ -36,7 +39,7 @@
            AsynchBaseDao = Room.databaseBuilder(
                    context,
                    AppDatabase.class,
                    "dayu_data"
                    name
            ).build();
        }
        return AsynchBaseDao;
app/src/main/java/com/dayu/pipirrapp/dao/LoginDao.java
@@ -26,6 +26,9 @@
    @Delete
    void delete(LoginBean loginBean);
    @Query("DELETE FROM LoginBean")
    void deleteAll();
    @Query("select  * from LoginBean limit 1")
    LoginBean findFirst();
}
app/src/main/java/com/dayu/pipirrapp/dao/MarkerDao.java
New file
@@ -0,0 +1,47 @@
package com.dayu.pipirrapp.dao;
import androidx.room.Dao;
import androidx.room.Delete;
import androidx.room.Insert;
import androidx.room.OnConflictStrategy;
import androidx.room.Query;
import androidx.room.Update;
import com.dayu.pipirrapp.bean.db.MarkerBean;
import java.util.List;
import io.reactivex.rxjava3.core.Completable;
/**
 * author: zuo
 * Date: 2024-09-30
 * Time: 14:39
 * 备注:
 */
@Dao
public interface MarkerDao {
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    void insert(MarkerBean markerBean);
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    Completable insertAll(List<MarkerBean> markerBeans); // 使用 Completable 进行异步插入
//    @Insert(onConflict = OnConflictStrategy.REPLACE)
//    void insertAll(List<MarkerBean> markerBeans); // 使用 Completable 进行异步插入
    @Update
    void update(MarkerBean markerBean);
    @Delete
    void delete(MarkerBean markerBean);
    @Query("DELETE FROM MarkerBean")
    void deleteAll();
    @Query("select  * from MarkerBean limit 1")
    MarkerBean findFirst();
    @Query("select  * from MarkerBean")
    List<MarkerBean> findAll();
}
app/src/main/java/com/dayu/pipirrapp/fragment/MapFragment.java
@@ -1,7 +1,9 @@
package com.dayu.pipirrapp.fragment;
import android.content.Context;
import android.content.Intent;
import android.location.LocationManager;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
@@ -18,6 +20,7 @@
import androidx.annotation.Nullable;
import com.dayu.pipirrapp.bean.db.CenterPointBean;
import com.dayu.pipirrapp.bean.db.MarkerBean;
import com.dayu.pipirrapp.bean.net.CenterPointResult;
import com.dayu.pipirrapp.bean.net.MarkerResult;
import com.dayu.pipirrapp.dao.DaoSingleton;
@@ -28,6 +31,7 @@
import com.dayu.pipirrapp.net.Constants;
import com.dayu.pipirrapp.net.subscribers.SubscriberListener;
import com.dayu.pipirrapp.observer.MapFragmenObserver;
import com.dayu.pipirrapp.service.MyLocationService;
import com.dayu.pipirrapp.utils.CommonData;
import com.dayu.pipirrapp.utils.MapJpgUtils;
import com.dayu.pipirrapp.utils.MyLog;
@@ -37,7 +41,12 @@
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
import io.reactivex.rxjava3.schedulers.Schedulers;
/**
 * author: zuo
@@ -54,7 +63,8 @@
    WebView mWebView;
    CenterPointBean centerPointBean;
    String jsonData;
    String strMarkerJson;
    boolean isStartInspec = false;
    @Override
    public void onAttach(@NonNull Context context) {
@@ -65,6 +75,17 @@
    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }
    @Override
    public void onStart() {
        super.onStart();
        //显示巡检状态
        if (isStartInspec) {
            binding.stateText.setVisibility(View.VISIBLE);
        } else {
            binding.stateText.setVisibility(View.GONE);
        }
    }
    @Nullable
@@ -80,25 +101,36 @@
        mWebView.loadUrl("file:///android_asset/index.html");
        getCenterPoint();
        initView();
        initData();
        initLocalData();
        getMarkerData();
        //开启定位
//        Intent location = new Intent(this.getActivity(), MyLocationService.class);
//        location.putExtra("isSingle", false);
//        this.getActivity().startService(location);
        Intent location = new Intent(this.getActivity(), MyLocationService.class);
        location.putExtra("isSingle", false);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            this.getActivity().startForegroundService(location);
        } else {
            this.getActivity().startService(location);
        }
        return binding.getRoot();
    }
    private void initData() {
    /**
     * 初始化本地数据
     */
    public void initLocalData() {
        centerPointBean = DaoSingleton.getInstance(MapFragment.this.getContext()).centerPointDao().findFirst();
        List<MarkerBean> markerBeans = DaoSingleton.getInstance(MapFragment.this.getContext()).markerDao().findAll();
        strMarkerJson = beanToJson(markerBeans);
        jumpCenterPoint();
        setMapMarker();
    }
    /**
     * 跳转地图中心点
     */
    public void jumpCenterPoint() {
        centerPointBean = DaoSingleton.getInstance(MapFragment.this.getContext()).centerPointDao().findFirst();
        if (centerPointBean != null) {
            Log.d(TAG, "jumpCenterPoint>>>>>>>>>>>>>>>>>>>" + centerPointBean.getLng() + "\",\"" + centerPointBean.getLat());
            mWebView.evaluateJavascript("javascript:setCenterAndZoom(\"" + centerPointBean.getLng() + "\",\"" + centerPointBean.getLat() + "\")", value -> {
@@ -106,9 +138,12 @@
        }
    }
    public void setMapMarker(){
        Log.i("mWebView", "addMarker????????????" + jsonData);
        mWebView.evaluateJavascript("javascript:addMarker(\"" + jsonData + "\")", new ValueCallback<String>() {
    /**
     * 添加标注点
     */
    public void setMapMarker() {
        Log.i("mWebView", "addMarker????????????" + strMarkerJson);
        mWebView.evaluateJavascript("javascript:addMarker(\"" + strMarkerJson + "\")", new ValueCallback<String>() {
            @Override
            public void onReceiveValue(String value) {
                Log.i("mWebView", "addMarker!!!!!!!!!" + value);
@@ -117,29 +152,45 @@
    }
    /**
     * 获取取水口列表
     */
    private void getMarkerData() {
        ApiManager.getInstance().requestGet(this.getContext(), Constants.BASE_URL + ":8085/project/intake/all", MarkerResult.class, null, new SubscriberListener<BaseResponse<MarkerResult>>() {
        ApiManager.getInstance().requestGetHideLoading(this.getContext(), Constants.BASE_URL + ":8085/project/intake/all", MarkerResult.class, null, new SubscriberListener<BaseResponse<MarkerResult>>() {
            @Override
            public void onNext(BaseResponse<MarkerResult> t) {
                if (t.isSuccess()) {
                    if (t.isSuccess()) {
                        if (t.getContent().getObj() != null && !t.getContent().getObj().isEmpty()) {
                            StringBuilder stringBuilder = new StringBuilder();
                            stringBuilder.append("[");
                            List<MarkerBean> markerBeans = new ArrayList<>();
                            for (int i = 0; i < t.getContent().getObj().size(); i++) {
                                stringBuilder.append("[");
                                stringBuilder.append(t.getContent().getObj().get(i).getLng());
                                stringBuilder.append(",");
                                stringBuilder.append(t.getContent().getObj().get(i).getLat());
                                stringBuilder.append(",\"" + t.getContent().getObj().get(i).getName() + "\"]");
                                if (i != t.getContent().getObj().size() - 1) {
                                    stringBuilder.append(",");
                                }
                                MarkerResult.Obj result = t.getContent().getObj().get(i);
                                //保存数据
                                MarkerBean markerBean = new MarkerBean();
                                markerBean.setLng(result.getLng());
                                markerBean.setLat(result.getLat());
                                markerBean.setBlockId(result.getBlockId());
                                markerBean.setName(result.getName());
                                markerBean.setRemarks(result.getRemarks());
                                markerBean.setTownId(result.getTownId());
                                markerBean.setVillageId(result.getVillageId());
                                markerBean.setCountyId(result.getCountyId());
                                markerBeans.add(markerBean);
                            }
                            stringBuilder.append("]");
                            jsonData = stringBuilder.toString().replace("\\", "\\\\").replace("\"", "\\\"");
                            strMarkerJson = beanToJson(markerBeans);
                            setMapMarker();
                            DaoSingleton.getInstance(MapFragment.this.getContext()).markerDao().deleteAll();
                            // 使用 RxJava 异步插入数据
                            DaoSingleton.getAsynchInstance(MapFragment.this.getContext()).markerDao().insertAll(markerBeans)
                                    .subscribeOn(Schedulers.io()) // 在 IO 线程上执行
                                    .observeOn(AndroidSchedulers.mainThread()) // 在主线程上观察
                                    .subscribe(() -> {
                                        // 插入成功
                                        Log.i("mWebView", "数据插入成功");
                                    }, throwable -> {
                                        // 插入失败
                                        Log.e("mWebView", "数据插入失败: " + throwable.getMessage());
                                    });
                        }
                    }
                } else {
@@ -148,6 +199,29 @@
            }
        });
    }
    /**
     * bean转json
     *
     * @param markerBeans
     */
    private String beanToJson(List<MarkerBean> markerBeans) {
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("[");
        for (int i = 0; i < markerBeans.size(); i++) {
            MarkerBean markerBean = markerBeans.get(i);
            stringBuilder.append("[");
            stringBuilder.append(markerBean.getLng());
            stringBuilder.append(",");
            stringBuilder.append(markerBean.getLat());
            stringBuilder.append(",\"" + markerBean.getName() + "\"]");
            if (i != markerBeans.size() - 1) {
                stringBuilder.append(",");
            }
        }
        stringBuilder.append("]");
        return stringBuilder.toString().replace("\\", "\\\\").replace("\"", "\\\"");
    }
@@ -205,6 +279,7 @@
    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "onDestroy>>>>>>>>>>>>>>>>>>>>>>>>>>>");
        ((ViewGroup) mWebView.getParent()).removeView(mWebView);
        mWebView.destroy(); // 当 Activity 要 destroy 时,应先将 WebView 移除,再 destroy 掉
    }
@@ -268,6 +343,17 @@
                // 根据HTTP状态码处理错误
            }
        });
        binding.inspectButton.setOnClickListener(v -> {
            if (!isStartInspec) {
                isStartInspec = true;
                binding.inspectButton.setText("终");
            } else {
                isStartInspec = false;
            }
            binding.stateText.setVisibility(View.VISIBLE);
        });
    }
app/src/main/java/com/dayu/pipirrapp/fragment/MyFragment.java
@@ -1,6 +1,8 @@
package com.dayu.pipirrapp.fragment;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
@@ -10,10 +12,13 @@
import androidx.annotation.Nullable;
import com.dayu.pipirrapp.activity.ChangePSActivity;
import com.dayu.pipirrapp.activity.LoginActivity;
import com.dayu.pipirrapp.bean.db.LoginBean;
import com.dayu.pipirrapp.dao.DaoSingleton;
import com.dayu.pipirrapp.databinding.FragmentMapBinding;
import com.dayu.pipirrapp.databinding.FragmentMyBinding;
import com.dayu.pipirrapp.utils.CleanDataUtils;
import com.dayu.pipirrapp.utils.ToastUtil;
import com.dayu.pipirrapp.view.ConfirmDialog;
import com.dayu.pipirrapp.view.TitleBar;
/**
@@ -35,18 +40,44 @@
    }
    private void initView() {
        binding.changePS.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MyFragment.this.getContext(), ChangePSActivity.class);
                MyFragment.this.getActivity().startActivity(intent);
            }
        binding.changePS.setOnClickListener(v -> {
            Intent intent = new Intent(MyFragment.this.getContext(), ChangePSActivity.class);
            MyFragment.this.getActivity().startActivity(intent);
        });
        //退出登录
        binding.loginOutRL.setOnClickListener((v) -> {
            ConfirmDialog confirmDialog = new ConfirmDialog(MyFragment.this.getActivity(), "确定退出吗?", v1 -> {
                try {
                    CleanDataUtils.cleanUserData(MyFragment.this.getContext());
                    Intent intent = new Intent(MyFragment.this.getContext(), LoginActivity.class);
                    MyFragment.this.getActivity().startActivity(intent);
                    MyFragment.this.getActivity().finish();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            });
            confirmDialog.show();
        });
        LoginBean loginBean = DaoSingleton.getInstance(MyFragment.this.getContext()).loginDao().findFirst();
        if (loginBean != null) {
            binding.name.setText(loginBean.getName());
            binding.phone.setText(loginBean.getPhone());
        }
//        清除缓存
        binding.cleanDataRL.setOnClickListener(v -> {
            ConfirmDialog confirmDialog = new ConfirmDialog(MyFragment.this.getActivity(), "确定清除缓存吗?", v1 -> {
                try {
                    CleanDataUtils.cleanMapData(MyFragment.this.getContext());
                    ToastUtil.showToast(MyFragment.this.getActivity(), "清除成功");
                } catch (Exception e) {
                    e.printStackTrace();
                }
            });
            confirmDialog.show();
        });
    }
    private void initData() {
@@ -55,7 +86,18 @@
            binding.name.setText(loginBean.getName());
            binding.phone.setText(loginBean.getPhone());
        }
        //
        try {
            PackageInfo packageInfo = MyFragment.this.getActivity().getPackageManager().getPackageInfo(MyFragment.this.getActivity().getPackageName(), 0);
            binding.versionText.setText(packageInfo.versionName);
        } catch (PackageManager.NameNotFoundException e) {
            throw new RuntimeException(e);
        }
    }
    @Override
    public void onStart() {
        super.onStart();
        new TitleBar(MyFragment.this.getActivity()).setTitleText("我的");
    }
}
app/src/main/java/com/dayu/pipirrapp/net/ApiManager.java
@@ -82,6 +82,9 @@
    public <T> void requestGet(final Context context, final String path, final Class<T> tClass, final Map<String, Object> params, final SubscriberListener listener) {
        request(context, false, path, true, tClass, params, listener);
    }
    public <T> void requestGetHideLoading(final Context context, final String path, final Class<T> tClass, final Map<String, Object> params, final SubscriberListener listener) {
        request(context, true, path, true, tClass, params, listener);
    }
    /**
     * 发送请求
app/src/main/java/com/dayu/pipirrapp/service/MyLocationService.java
@@ -1,19 +1,26 @@
package com.dayu.pipirrapp.service;
import android.annotation.SuppressLint;
import android.Manifest;
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.BitmapFactory;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Build;
import android.os.Bundle;
import android.os.IBinder;
import android.widget.Toast;
import androidx.annotation.Nullable;
import androidx.core.app.ActivityCompat;
import androidx.core.app.NotificationCompat;
import com.baidu.location.BDAbstractLocationListener;
import com.baidu.location.BDLocation;
@@ -23,6 +30,7 @@
import com.dayu.pipirrapp.activity.MainActivity;
import com.dayu.pipirrapp.bean.db.LatLonBean;
import com.dayu.pipirrapp.utils.MyLog;
import com.dayu.pipirrapp.utils.ToastUtil;
import com.jeremyliao.liveeventbus.LiveEventBus;
import com.tencent.bugly.crashreport.CrashReport;
@@ -78,32 +86,62 @@
            Notification notification = builder.build(); // 获取构建好的Notification
            notification.defaults = Notification.DEFAULT_SOUND; //设置为默认的声音
        }
        return super.onStartCommand(intent, flags, startId);
        return START_STICKY;// 如果系统终止该服务,之后会重启
    }
    @Override
    public void onCreate() {
        super.onCreate();
        // 启动前台服务
        startForegroundService();
        createNativeLocation();
//        createBDLocation();
    }
    private void startForegroundService() {
        // 针对 Android 8.0 及更高版本创建通知渠道
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            NotificationChannel channel = new NotificationChannel(
                    "location_channel",
                    "Location Service Channel",
                    NotificationManager.IMPORTANCE_DEFAULT
            );
            NotificationManager manager = getSystemService(NotificationManager.class);
            if (manager != null) {
                manager.createNotificationChannel(channel);
            }
        }
        // 创建通知
        Intent notificationIntent = new Intent(this, MainActivity.class);
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, PendingIntent.FLAG_IMMUTABLE);
        Notification notification = new NotificationCompat.Builder(this, "location_channel")
                .setContentTitle("定位服务")
                .setContentText("定位服务正在后台运行")
                .setSmallIcon(R.mipmap.ic_launcher)
                .setContentIntent(pendingIntent)
                .build();
        // 将服务设置为前台服务
        startForeground(1, notification);
    }
    /**
     * 原生的定位服务
     */
    @SuppressLint("MissingPermission")
    private void createNativeLocation() {
        try {
            locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
            if (!locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
                // 提示用户开启定位
                Toast.makeText(this, "请开启GPS定位", Toast.LENGTH_SHORT).show();
            }
            listener = new MyLocationListener();
            Criteria criteria = new Criteria();
            // 查询精度:高,Criteria.ACCURACY_COARSE比较粗略,Criteria.ACCURACY_FINE则比较精确
            criteria.setAccuracy(Criteria.ACCURACY_FINE);
            criteria.setAccuracy(Criteria.ACCURACY_COARSE);
            //不要求海拔
            criteria.setAltitudeRequired(false);
            //不要求方位
@@ -116,7 +154,11 @@
            MyLog.i("定位的provider:" + provider);
            //第二个参数是间隔时间 第三个参数是间隔多少距离,这里我试过了不同的各种组合,能获取到位置就是能,不能获取就是不能
            locationManager.requestLocationUpdates(provider, 1000, 0, listener);
            if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                MyLog.i("原生定位没有权限>>>>");
                return;
            }
            locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER , 1000, 0, listener);
        } catch (Exception e) {
            CrashReport.postCatchedException(e);
        }
@@ -166,6 +208,9 @@
    }
    /**
     * 原生定位
     */
    class MyLocationListener implements LocationListener {
        // 位置改变时获取经纬度
        @Override
@@ -179,24 +224,28 @@
            if (isSingle) {
                stopSelf();  // 获取到经纬度以后,停止该service
            }
            ToastUtil.showToast(MyLocationService.this, "原生定位onLocationChanged:  Latitude:" + latitude + "  Longitude:" + longitude);
        }
        // 状态改变时
        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {
            MyLog.i("onStatusChanged - provider:" + provider + " status:" + status);
            ToastUtil.showToast(MyLocationService.this, "onStatusChanged - provider:" + provider + " status:" + status);
        }
        // 提供者可以使用时
        @Override
        public void onProviderEnabled(String provider) {
            MyLog.i("GPS开启了");
            ToastUtil.showToast(MyLocationService.this, "GPS开启了");
        }
        // 提供者不可以使用时
        @Override
        public void onProviderDisabled(String provider) {
            MyLog.i("GPS关闭了");
            ToastUtil.showToast(MyLocationService.this, "GPS关闭了");
        }
    }
@@ -246,6 +295,11 @@
        MyLog.i("MyLocationService--onDestroy");
        // 停止前台服务--参数:表示是否移除之前的通知
        stopForeground(true);
        // 获取NotificationManager并取消通知,确保通知被移除
        NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        if (notificationManager != null) {
            notificationManager.cancel(0);  // 参数1对应的是startForeground()中通知的ID
        }
        super.onDestroy();
        // 停止所有的定位服务
        try {
app/src/main/java/com/dayu/pipirrapp/utils/CleanDataUtils.java
New file
@@ -0,0 +1,33 @@
package com.dayu.pipirrapp.utils;
import android.content.Context;
import com.dayu.pipirrapp.MyApplication;
import com.dayu.pipirrapp.dao.DaoSingleton;
/**
 * author: zuo
 * Date: 2024-10-10
 * Time: 10:03
 * 备注:清除缓存记录
 */
public class CleanDataUtils {
    /**
     * 清除地图缓存
     */
    public static void cleanMapData(Context context) {
        DaoSingleton.getInstance(context).markerDao().deleteAll();
    }
    /**
     * 清除用户信息缓存
     * @param context
     */
    public static void cleanUserData(Context context) {
        DaoSingleton.getInstance(context).loginDao().deleteAll();
        MyApplication.myApplication.token="";
        SharedPreferencesHelper.getInstance(context).delete(CommonData.Token);
    }
}
app/src/main/res/layout/activity_splash_screen.xml
New file
@@ -0,0 +1,29 @@
<?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:orientation="vertical"
    android:padding="20dp">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="100dp"
        android:text="大禹智能巡检系统"
        android:textColor="@color/base_blue"
        android:textSize="25sp" />
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="100dp"
        android:text="正在启动....."
        android:textColor="@color/base_blue"
        android:textSize="10sp" />
</RelativeLayout>
app/src/main/res/layout/fragment_map.xml
@@ -3,14 +3,14 @@
    android:layout_width="match_parent"
    android:layout_height="match_parent">
<!--    <com.github.lzyzsd.jsbridge.BridgeWebView-->
<!--        android:id="@+id/webView"-->
<!--        android:layout_width="match_parent"-->
<!--        android:layout_height="match_parent" />-->
        <WebView
            android:id="@+id/webView"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    <!--    <com.github.lzyzsd.jsbridge.BridgeWebView-->
    <!--        android:id="@+id/webView"-->
    <!--        android:layout_width="match_parent"-->
    <!--        android:layout_height="match_parent" />-->
    <WebView
        android:id="@+id/webView"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
    <TextView
        android:id="@+id/flyBtn"
@@ -20,14 +20,39 @@
        android:layout_centerHorizontal="true"
        android:text="跳转到指定位置" />
    <TextView
        android:id="@+id/stateText"
        android:layout_width="match_parent"
        android:layout_height="35dp"
        android:layout_alignParentTop="true"
        android:background="@color/base_blue"
        android:gravity="center"
        android:text="已开启巡检"
        android:textColor="@color/white"
        android:textSize="18sp" />
    <TextView
        android:id="@+id/inspectButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_marginTop="60dp"
        android:layout_marginRight="15dp"
        android:background="@drawable/ic_blue_background"
        android:padding="10dp"
        android:text="巡"
        android:textColor="@color/white"
        android:textSize="18sp" />
    <LinearLayout
        android:visibility="gone"
        android:id="@+id/bottomLL"
        android:layout_width="match_parent"
        android:layout_height="120dp"
        android:layout_alignParentBottom="true"
        android:background="@color/white"
        android:orientation="horizontal">
        android:orientation="horizontal"
        android:visibility="gone">
        <LinearLayout
            android:layout_width="0dp"
app/src/main/res/layout/fragment_my.xml
@@ -98,37 +98,12 @@
            android:src="@drawable/ic_right" />
    </RelativeLayout>
    <RelativeLayout
        android:id="@+id/versionRL"
        android:layout_width="match_parent"
        android:layout_height="@dimen/item_height"
        android:layout_below="@+id/headRL"
        android:layout_marginTop="1dp">
        <TextView
            android:layout_width="match_parent"
            android:layout_height="@dimen/item_height"
            android:background="@color/white"
            android:gravity="center_vertical"
            android:paddingLeft="30dp"
            android:text="当前版本"
            android:textColor="@color/black"
            android:textSize="@dimen/my_item_text_size" />
        <ImageView
            android:layout_width="25dp"
            android:layout_height="25dp"
            android:layout_alignParentRight="true"
            android:layout_centerVertical="true"
            android:layout_marginRight="15dp"
            android:src="@drawable/ic_right" />
    </RelativeLayout>
    <RelativeLayout
        android:id="@+id/passwordRL"
        android:layout_width="match_parent"
        android:layout_height="@dimen/item_height"
        android:layout_below="@+id/versionRL"
        android:layout_below="@+id/headRL"
        android:layout_marginTop="1dp">
        <TextView
@@ -153,10 +128,36 @@
    </RelativeLayout>
    <RelativeLayout
        android:id="@+id/loginOutRL"
        android:id="@+id/cleanDataRL"
        android:layout_width="match_parent"
        android:layout_height="@dimen/item_height"
        android:layout_below="@+id/passwordRL"
        android:layout_marginTop="1dp">
        <TextView
            android:id="@+id/cleanData"
            android:layout_width="match_parent"
            android:layout_height="@dimen/item_height"
            android:background="@color/white"
            android:gravity="center_vertical"
            android:paddingLeft="30dp"
            android:text="清除缓存"
            android:textColor="@color/black"
            android:textSize="@dimen/my_item_text_size" />
        <ImageView
            android:layout_width="25dp"
            android:layout_height="25dp"
            android:layout_alignParentRight="true"
            android:layout_centerVertical="true"
            android:layout_marginRight="15dp"
            android:src="@drawable/ic_right" />
    </RelativeLayout>
    <RelativeLayout
        android:id="@+id/loginOutRL"
        android:layout_width="match_parent"
        android:layout_height="@dimen/item_height"
        android:layout_below="@+id/cleanDataRL"
        android:layout_marginTop="1dp">
        <TextView
@@ -171,6 +172,7 @@
            android:textSize="@dimen/my_item_text_size" />
        <ImageView
            android:id="@+id/loginOutBtn"
            android:layout_width="25dp"
            android:layout_height="25dp"
            android:layout_alignParentRight="true"
@@ -178,5 +180,37 @@
            android:layout_marginRight="15dp"
            android:src="@drawable/ic_right" />
    </RelativeLayout>
    <RelativeLayout
        android:id="@+id/versionRL"
        android:layout_width="match_parent"
        android:layout_height="@dimen/item_height"
        android:layout_below="@+id/loginOutRL"
        android:layout_marginTop="1dp">
        <TextView
            android:layout_width="match_parent"
            android:layout_height="@dimen/item_height"
            android:background="@color/white"
            android:gravity="center_vertical"
            android:paddingLeft="30dp"
            android:text="当前版本"
            android:textColor="@color/black"
            android:textSize="@dimen/my_item_text_size" />
        <TextView
            android:id="@+id/versionText"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_centerVertical="true"
            android:layout_marginRight="25dp"
            android:text="v1.0"
            android:textColor="@color/text_color"
            android:textSize="15sp" />
    </RelativeLayout>
</RelativeLayout>