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>