From 83a2430076975beb7f207edfb6df6a2729cc8c49 Mon Sep 17 00:00:00 2001 From: md Date: Mon, 19 Jul 2021 18:40:36 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9poi=E5=BD=95=E5=83=8F?= =?UTF-8?q?=E3=80=81=E5=85=85=E7=94=B5=E7=AB=99=E7=9A=84=E4=B8=8A=E4=BC=A0?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E3=80=81=E4=BF=AE=E6=94=B9=E9=83=A8=E5=88=86?= =?UTF-8?q?bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 2 +- .../outdoor/activity/PictureActivity.java | 196 +++++---- .../outdoor/adapter/IssueProblemAdapter.java | 5 +- .../com/navinfo/outdoor/api/Constant.java | 2 + .../outdoor/base/BaseDrawerFragment.java | 5 +- .../fragment/ChargingPileFragment.java | 61 ++- .../fragment/ChargingStationFragment.java | 298 +++++++------ .../outdoor/fragment/IssueFragment.java | 22 +- .../outdoor/fragment/MineFragment.java | 2 +- .../outdoor/fragment/OtherFragment.java | 2 +- .../navinfo/outdoor/fragment/PoiFragment.java | 2 +- .../outdoor/fragment/PoiVideoFragment.java | 6 +- .../outdoor/fragment/RoadFragment.java | 2 +- .../outdoor/fragment/StaySubmitFragment.java | 1 + .../outdoor/fragment/TreasureFragment.java | 9 +- .../fragment/UserAttestationFragment.java | 1 - .../com/navinfo/outdoor/util/GPSUtils.java | 396 +++++++++--------- .../outdoor/util/TecentLocationUtils.java | 2 +- .../navinfo/outdoor/util/Whetherisempty.java | 2 +- .../main/res/drawable/ic_baseline_search.xml | 5 + app/src/main/res/drawable/iv_message.png | Bin 0 -> 7351 bytes app/src/main/res/drawable/mine_harder.png | Bin 0 -> 10574 bytes app/src/main/res/drawable/poi_square.png | Bin 391 -> 558 bytes app/src/main/res/drawable/poi_video.png | Bin 0 -> 5972 bytes app/src/main/res/drawable/shape_login.xml | 2 +- app/src/main/res/drawable/shares.png | Bin 0 -> 4496 bytes app/src/main/res/drawable/sign.png | Bin 0 -> 5236 bytes app/src/main/res/layout/about_fragment.xml | 14 +- app/src/main/res/layout/activity_login.xml | 12 +- app/src/main/res/layout/activity_picture.xml | 39 +- .../main/res/layout/fragment_stay_submit.xml | 4 +- .../main/res/layout/map_download_fragment.xml | 13 +- app/src/main/res/layout/mine_fragment.xml | 15 +- .../main/res/layout/poi_video_fragment.xml | 3 +- app/src/main/res/layout/treasure_fragment.xml | 6 +- app/src/main/res/layout/withdraw_fragment.xml | 38 +- app/src/main/res/mipmap-ldpi/article.png | Bin 600 -> 6293 bytes .../main/res/mipmap-ldpi/article_select.png | Bin 425 -> 6420 bytes app/src/main/res/mipmap-ldpi/map.png | Bin 316 -> 4389 bytes app/src/main/res/mipmap-ldpi/map_select.png | Bin 271 -> 4514 bytes app/src/main/res/mipmap-ldpi/mine.png | Bin 426 -> 5400 bytes app/src/main/res/mipmap-ldpi/mine_select.png | Bin 269 -> 5588 bytes app/src/main/res/mipmap-ldpi/task.png | Bin 282 -> 4050 bytes app/src/main/res/mipmap-ldpi/task_select.png | Bin 320 -> 4155 bytes app/src/main/res/values/styles.xml | 2 +- 45 files changed, 692 insertions(+), 477 deletions(-) create mode 100644 app/src/main/res/drawable/ic_baseline_search.xml create mode 100644 app/src/main/res/drawable/iv_message.png create mode 100644 app/src/main/res/drawable/mine_harder.png create mode 100644 app/src/main/res/drawable/poi_video.png create mode 100644 app/src/main/res/drawable/shares.png create mode 100644 app/src/main/res/drawable/sign.png diff --git a/app/build.gradle b/app/build.gradle index 9e615e4..6d77245 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -3,7 +3,7 @@ apply plugin: 'com.android.application' android { compileSdkVersion 29 buildToolsVersion '29.0.2' - // ndkVersion '23.0.7123448' + ndkVersion '23.0.7123448' defaultConfig { applicationId "com.navinfo.outdoor" diff --git a/app/src/main/java/com/navinfo/outdoor/activity/PictureActivity.java b/app/src/main/java/com/navinfo/outdoor/activity/PictureActivity.java index 774cfb8..a1fe6de 100644 --- a/app/src/main/java/com/navinfo/outdoor/activity/PictureActivity.java +++ b/app/src/main/java/com/navinfo/outdoor/activity/PictureActivity.java @@ -3,6 +3,7 @@ package com.navinfo.outdoor.activity; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.constraintlayout.widget.ConstraintLayout; import android.content.Intent; import android.content.pm.ActivityInfo; @@ -21,6 +22,7 @@ import android.view.ViewGroup; import android.widget.Button; import android.widget.CheckBox; import android.widget.CompoundButton; +import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.Toast; @@ -100,7 +102,9 @@ public class PictureActivity extends BaseActivity implements View.OnClickListene private Timer timer; private CsvTimerTask timerTask; // 执行定时写入csv文件的task private DateFormat formatter; - private final long period = 2; // 记录csv文件的间隔时间,单位为秒 + private final long period = 1; // 记录csv文件的间隔时间,单位为秒 + private ViewGroup layerChange; // 切换地图和相机的父控件 + private boolean isFinishActivity = false; // 是否需要关闭当前activity @Override protected int getLayout() { @@ -121,6 +125,8 @@ public class PictureActivity extends BaseActivity implements View.OnClickListene finalVideoPath = Constant.PICTURE_FOLDER+"/final.mp4"; } + layerChange = findViewById(R.id.layer_change); + timer = new Timer(); this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); @@ -142,28 +148,11 @@ public class PictureActivity extends BaseActivity implements View.OnClickListene public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (isChecked) { // 开始采集,设置按钮文字内容为“结束采集” captureVideo.setText("暂停采集"); - stopVideo.setEnabled(false);// 开始采集视频后,禁用停止采集的按钮,必须暂停采集后才可点击停止采集 +// stopVideo.setEnabled(false);// 开始采集视频后,禁用停止采集的按钮,必须暂停采集后才可点击停止采集 startTakenVideo(); // 开始采集视频 - - /** - * 获取当前视频的时间,记录csv文件时使用 - * */ - long currentTime = AWMp4ParserHelper.getInstance().getVedioTotalTime(new File(finalVideoPath)); - timerTask = new CsvTimerTask(new File(finalVideoPath+".txt")); - timerTask.setCurrentVideoTime(currentTime/1000); - - // 开始采集,每隔2秒实时记录位置信息、视频时间以及设备时间 - timer.schedule(timerTask, 0, period*1000); } else { - if (timerTask!=null){ - timerTask.cancel(); - stopVideo.setEnabled(true); - captureVideo.setText("开始采集"); - stopTakenVideo(); - }else { - Toast.makeText(PictureActivity.this, "请先拍照", Toast.LENGTH_SHORT).show(); - } - + stopTakenVideo(); + captureVideo.setText("开始采集"); } } }); @@ -176,6 +165,7 @@ public class PictureActivity extends BaseActivity implements View.OnClickListene // camera.setVideoBitRate(5); camera.setPreviewFrameRate(5); // 设置预览视频的帧率 + // 设置视频可用的宽高size SizeSelector width = SizeSelectors.maxWidth(1920); SizeSelector height = SizeSelectors.maxHeight(1440); @@ -195,7 +185,7 @@ public class PictureActivity extends BaseActivity implements View.OnClickListene SizeSelectors.biggest() // If none is found, take the biggest ); camera.setVideoSize(result); - camera.setVideoBitRate(800*1024); + camera.setVideoBitRate(1920*1440); // camera.setAudioBitRate(); //获取地图 @@ -244,32 +234,45 @@ public class PictureActivity extends BaseActivity implements View.OnClickListene super.onVideoTaken(result); Toast.makeText(PictureActivity.this, "暂停摄像", Toast.LENGTH_SHORT).show(); showLoadingDialog(); - if (result!=null) { - File currentFile = result.getFile(); - if (finalVideoPath!=null) { // 有指定的视频文件名称,合并文件 - if (new File(finalVideoPath).exists()) { - List spliteFileList = new ArrayList<>(); - spliteFileList.add(finalVideoPath); - spliteFileList.add(currentFile.getAbsolutePath()); - try { - AWMp4ParserHelper.getInstance().mergeVideos(spliteFileList, tmpFile.getAbsolutePath()); - if (tmpFile.exists()) { - File finalVideoFile = new File(finalVideoPath); - finalVideoFile.delete(); - currentFile.delete(); - tmpFile.renameTo(finalVideoFile); + new Thread(new Runnable() { + @Override + public void run() { + if (result!=null) { + File currentFile = result.getFile(); + if (finalVideoPath!=null) { // 有指定的视频文件名称,合并文件 + if (new File(finalVideoPath).exists()) { + List spliteFileList = new ArrayList<>(); + spliteFileList.add(finalVideoPath); + spliteFileList.add(currentFile.getAbsolutePath()); + try { + AWMp4ParserHelper.getInstance().mergeVideos(spliteFileList, tmpFile.getAbsolutePath()); + if (tmpFile.exists()) { + File finalVideoFile = new File(finalVideoPath); + finalVideoFile.delete(); + currentFile.delete(); + tmpFile.renameTo(finalVideoFile); + } else { + Toast.makeText(PictureActivity.this, "视频合并失败!", Toast.LENGTH_SHORT).show(); + } + } catch (Exception e) { + Log.e("PictureActivity", e.getMessage()); + } } else { - Toast.makeText(PictureActivity.this, "视频合并失败!", Toast.LENGTH_SHORT).show(); + currentFile.renameTo(new File(finalVideoPath)); } - } catch (Exception e) { - Log.e("PictureActivity", e.getMessage()); } - } else { - currentFile.renameTo(new File(finalVideoPath)); } + runOnUiThread(new Runnable() { + @Override + public void run() { + dismissLoadingDialog(); + if (isFinishActivity) { + PictureActivity.this.finish(); + } + } + }); } - } - dismissLoadingDialog(); + }).start(); } @Override @@ -278,7 +281,43 @@ public class PictureActivity extends BaseActivity implements View.OnClickListene Toast.makeText(PictureActivity.this, exception.toString(), Toast.LENGTH_SHORT).show(); } + @Override + public void onVideoRecordingStart() { + super.onVideoRecordingStart(); + /** + * 获取当前视频的时间,记录csv文件时使用 + * */ + long currentTime = AWMp4ParserHelper.getInstance().getVedioTotalTime(new File(finalVideoPath)); + timerTask = new CsvTimerTask(new File(finalVideoPath+".txt")); + + // 开始采集,每隔2秒实时记录位置信息、视频时间以及设备时间 + if (currentTime == 0) { + timer.schedule(timerTask, 0, period*1000); + } else { + timerTask.setCurrentVideoTime(currentTime/1000+1); + timer.schedule(timerTask, 1, period*1000); + } + + } + + @Override + public void onVideoRecordingEnd() { + super.onVideoRecordingEnd(); + if (timerTask!=null){ + timerTask.cancel(); + }else { + Toast.makeText(PictureActivity.this, "请先拍照", Toast.LENGTH_SHORT).show(); + } + } }); + + // 修改相机的宽高为屏幕宽高的1/3 + DisplayMetrics dm = new DisplayMetrics(); + getWindowManager().getDefaultDisplay().getMetrics(dm); + FrameLayout.LayoutParams layoutParamsMap = (FrameLayout.LayoutParams) ivMap.getLayoutParams();//相机的宽高 + layoutParamsMap.height = dm.widthPixels/3; + layoutParamsMap.width = dm.heightPixels/3; + ivMap.setLayoutParams(layoutParamsMap); } @@ -318,23 +357,26 @@ public class PictureActivity extends BaseActivity implements View.OnClickListene // startTakenVideo(); // 开始拍摄视频 // break; case R.id.btn_stop_video: - if (camera.isTakingVideo()) { - camera.stopVideo(); - } if (timerTask!=null){ timerTask.cancel(); Intent intent = new Intent(); intent.putExtra(Constant.INTENT_VIDEO_PATH, finalVideoPath); setResult(0x101, intent); - this.finish(); }else { - Toast.makeText(this, "请先录视频", Toast.LENGTH_SHORT).show(); + Toast.makeText(this, "本段视频没有计时!", Toast.LENGTH_SHORT).show(); + } + if (camera.isTakingVideo()) { + isFinishActivity = true; + camera.stopVideo(); + } else { + finish(); } break; } } + private void startTakenVideo() { if (camera.isTakingVideo()) { Toast.makeText(this, "已经在拍摄中...", Toast.LENGTH_SHORT).show(); @@ -402,32 +444,38 @@ public class PictureActivity extends BaseActivity implements View.OnClickListene public void btnSwich() { -// DisplayMetrics dm = new DisplayMetrics(); -// getWindowManager().getDefaultDisplay().getMetrics(dm); -// System.out.println("width-display :" + dm.widthPixels); -// System.out.println("heigth-display :" + dm.heightPixels); -// ViewGroup.LayoutParams layoutParams = ivMap.getLayoutParams();//地图的宽高 -// int height = layoutParams.height; -// int width = layoutParams.width; -// ViewGroup.LayoutParams layoutParams1 = camera.getLayoutParams();//相机的宽高 -// int height1 = layoutParams1.height; -// int width1 = layoutParams1.width; -// if (width > width1) { -// ivPic.setVisibility(View.GONE); -// layoutParams1.width = dm.widthPixels; -// layoutParams1.height = dm.heightPixels; -// layoutParams.height = height1; -// layoutParams.width = width1; -// camera.setLayoutParams(layoutParams1); -// ivMap.setLayoutParams(layoutParams); -// } else { -// layoutParams.height = dm.heightPixels; -// layoutParams.width = dm.widthPixels; -// layoutParams1.height = height; -// layoutParams1.width = width; -// camera.setLayoutParams(layoutParams); -// ivMap.setLayoutParams(layoutParams1); -// } + DisplayMetrics dm = new DisplayMetrics(); + getWindowManager().getDefaultDisplay().getMetrics(dm); + System.out.println("width-display :" + dm.widthPixels); + System.out.println("heigth-display :" + dm.heightPixels); + FrameLayout.LayoutParams layoutParamsMap = (FrameLayout.LayoutParams) ivMap.getLayoutParams();//地图的宽高 + int heightMap = ivMap.getMeasuredHeight(); + int widthMap = ivMap.getMeasuredWidth(); + FrameLayout.LayoutParams layoutParamsCamera = (FrameLayout.LayoutParams) camera.getLayoutParams();//相机的宽高 + int heightCamera = camera.getMeasuredHeight(); + int widthCamera = camera.getMeasuredWidth(); + + layerChange.removeAllViews(); + if (widthMap > widthCamera) { + ivPic.setVisibility(View.GONE); + layoutParamsCamera.width = dm.widthPixels; + layoutParamsCamera.height = dm.heightPixels; + layoutParamsMap.height = heightCamera; + layoutParamsMap.width = widthCamera; + camera.setLayoutParams(layoutParamsCamera); + ivMap.setLayoutParams(layoutParamsMap); + layerChange.addView(camera); + layerChange.addView(ivMap); + } else { + layoutParamsMap.height = dm.heightPixels; + layoutParamsMap.width = dm.widthPixels; + layoutParamsCamera.height = heightMap; + layoutParamsCamera.width = widthMap; + camera.setLayoutParams(layoutParamsCamera); + ivMap.setLayoutParams(layoutParamsMap); + layerChange.addView(ivMap); + layerChange.addView(camera); + } } @Override protected void onResume() { diff --git a/app/src/main/java/com/navinfo/outdoor/adapter/IssueProblemAdapter.java b/app/src/main/java/com/navinfo/outdoor/adapter/IssueProblemAdapter.java index 4e18d3e..2e19ad3 100644 --- a/app/src/main/java/com/navinfo/outdoor/adapter/IssueProblemAdapter.java +++ b/app/src/main/java/com/navinfo/outdoor/adapter/IssueProblemAdapter.java @@ -11,19 +11,20 @@ import androidx.recyclerview.widget.RecyclerView; import com.navinfo.outdoor.R; import com.navinfo.outdoor.bean.TaskExplainInfo; +import com.navinfo.outdoor.bean.TaskPrefectureBean; import java.util.ArrayList; import java.util.List; public class IssueProblemAdapter extends RecyclerView.Adapter { - private List issueList = new ArrayList<>(); + private List issueList = new ArrayList<>(); private Context context; public IssueProblemAdapter(Context context) { this.context = context; } - public void setExplainList(List explainList) { + public void setExplainList(List explainList) { this.issueList.addAll(explainList); notifyDataSetChanged(); } diff --git a/app/src/main/java/com/navinfo/outdoor/api/Constant.java b/app/src/main/java/com/navinfo/outdoor/api/Constant.java index ff5ccdd..b4c52d9 100644 --- a/app/src/main/java/com/navinfo/outdoor/api/Constant.java +++ b/app/src/main/java/com/navinfo/outdoor/api/Constant.java @@ -78,6 +78,8 @@ public class Constant { public static final int HOME_TREASURE = 33;//点击寻宝实时监听刷新 public static final int JOB_WORD_MONITOR=34;//筛选条件的刷新 public static final int EVENT_WHAT_LOCATION_CHANGE = 35; // 定位位置更新的Event的What值 + public static final int CHARGING_PILE_BODY=36;//充电装的body + public static final int CHARGING_PILE_PHONE = 37;//充电桩的照片 public static String USER_ATTESTATION_NAME; //实名认证姓名 银行卡 public static int NUMBER = 200; //任务个数 diff --git a/app/src/main/java/com/navinfo/outdoor/base/BaseDrawerFragment.java b/app/src/main/java/com/navinfo/outdoor/base/BaseDrawerFragment.java index 3d4adc2..7e89781 100644 --- a/app/src/main/java/com/navinfo/outdoor/base/BaseDrawerFragment.java +++ b/app/src/main/java/com/navinfo/outdoor/base/BaseDrawerFragment.java @@ -30,9 +30,10 @@ public abstract class BaseDrawerFragment extends BaseFragment { //1为是,0为否,-1为无法判断 if (mockGps == 1) { onBackPressed(); - } else { - new GPSUtils(getActivity()); } +// else { +// new GPSUtils(getActivity()); +// } } diff --git a/app/src/main/java/com/navinfo/outdoor/fragment/ChargingPileFragment.java b/app/src/main/java/com/navinfo/outdoor/fragment/ChargingPileFragment.java index 3adebe1..e9f6da3 100644 --- a/app/src/main/java/com/navinfo/outdoor/fragment/ChargingPileFragment.java +++ b/app/src/main/java/com/navinfo/outdoor/fragment/ChargingPileFragment.java @@ -57,6 +57,7 @@ import com.tencent.tencentmap.mapsdk.maps.model.LatLng; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; +import java.io.File; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -103,6 +104,8 @@ public class ChargingPileFragment extends BaseDrawerFragment implements View.OnC private int taskId; private Integer chargingPileBody; + private ArrayList phoneLists; + public static ChargingPileFragment newInstance(Bundle bundle) { ChargingPileFragment fragment = new ChargingPileFragment(); fragment.setArguments(bundle); @@ -566,7 +569,7 @@ public class ChargingPileFragment extends BaseDrawerFragment implements View.OnC if (all) { //保存数据库: ChargingPileEntity chargingPileEntity = new ChargingPileEntity(); - ArrayList photoBean = new ArrayList<>(); + ArrayList photoBean; photoBean = new ArrayList<>(); if (latLng == null || latLng.equals("")) { Toast.makeText(getActivity(), "请确定点位", Toast.LENGTH_SHORT).show(); return; @@ -788,10 +791,20 @@ public class ChargingPileFragment extends BaseDrawerFragment implements View.OnC public void onSuccess(ChargingPileSaveBean chargingPileSaveBean, int id) { dismissLoadingDialog(); chargingPileBody = chargingPileSaveBean.getBody(); - Toast.makeText(getActivity(), "保存成功", Toast.LENGTH_SHORT).show(); Log.d("TAG", "onSuccess: " + chargingPileSaveBean.getBody()); + phoneList(); + Message obtain = Message.obtain(); + obtain.what = Constant.CHARGING_PILE_BODY; + obtain.obj = chargingPileBody; + EventBus.getDefault().post(obtain); + + Message obtain1 = Message.obtain(); + obtain1.what = Constant.CHARGING_PILE_PHONE; + obtain1.obj = phoneLists; + EventBus.getDefault().post(obtain1); getActivity().onBackPressed(); + } @Override @@ -803,6 +816,50 @@ public class ChargingPileFragment extends BaseDrawerFragment implements View.OnC }).build(); } + private void phoneList() { + phoneLists = new ArrayList<>(); + String ivPanoramaTag = (String) ivPanorama.getTag(); + if (ivPanoramaTag!=null){ + phoneLists.add(new File(ivPanoramaTag)); + } + String ivCodingTag = (String) ivCoding.getTag(); + if (ivCodingTag!=null){ + phoneLists.add(new File(ivCodingTag)); + } + String ivEquipmentTag = (String) ivEquipment.getTag(); + if (ivEquipmentTag!=null){ + phoneLists.add(new File(ivEquipmentTag)); + } + String ivFacilityTag = (String) ivFacility.getTag(); + if (ivFacilityTag!=null){ + phoneLists.add(new File(ivFacilityTag)); + } + String ivUsableTag = (String) ivUsable.getTag(); + if (ivUsableTag!=null){ + phoneLists.add(new File(ivUsableTag)); + } + String ivAvailableTag = (String) ivAvailable.getTag(); + if (ivAvailableTag!=null){ + phoneLists.add(new File(ivAvailableTag)); + } + String ivParkingTag = (String) ivParking.getTag(); + if (ivParkingTag!=null){ + phoneLists.add(new File(ivParkingTag)); + } + String ivNumberTag = (String) ivNumber.getTag(); + if (ivNumberTag!=null){ + phoneLists.add(new File(ivNumberTag)); + } + String ivDeviceTag = (String) ivDevice.getTag(); + if (ivDeviceTag!=null){ + phoneLists.add(new File(ivDeviceTag)); + } + String ivScutcheonTag = (String) ivScutcheon.getTag(); + if (ivScutcheonTag!=null){ + phoneLists.add(new File(ivScutcheonTag)); + } + } + @Override public void onSaveInstanceState(@NonNull Bundle outState) { diff --git a/app/src/main/java/com/navinfo/outdoor/fragment/ChargingStationFragment.java b/app/src/main/java/com/navinfo/outdoor/fragment/ChargingStationFragment.java index 4908c9c..8d75503 100644 --- a/app/src/main/java/com/navinfo/outdoor/fragment/ChargingStationFragment.java +++ b/app/src/main/java/com/navinfo/outdoor/fragment/ChargingStationFragment.java @@ -111,6 +111,9 @@ public class ChargingStationFragment extends BaseDrawerFragment implements View. private Integer body; private LinearLayout linearContact; private ContactView contactView; + private Integer chargingPileBody; + private ArrayList chargingStationList; + private ArrayList phoneList; public static ChargingStationFragment newInstance(Bundle bundle) { ChargingStationFragment fragment = new ChargingStationFragment(); @@ -551,6 +554,10 @@ public class ChargingStationFragment extends BaseDrawerFragment implements View. ArrayList chargingPileEntities = new ArrayList<>(); chargingPileEntities.add(chargingPileEntity); chargingPileAdapter.setChargingPileEntities(chargingPileEntities); + }else if (data.what == Constant.CHARGING_PILE_BODY){ + chargingPileBody = (Integer) data.obj; + }else if (data.what == Constant.CHARGING_PILE_PHONE){ + phoneList = (ArrayList) data.obj; } } @@ -558,127 +565,14 @@ public class ChargingStationFragment extends BaseDrawerFragment implements View. public void onClick(View v) { switch (v.getId()) { case R.id.btn_save_local: - XXPermissions.with(this) - //读写权限 - .permission(Permission.MANAGE_EXTERNAL_STORAGE) - .request(new OnPermissionCallback() { - @Override - public void onGranted(List permissions, boolean all) { - if (all) { - //保存数据库: - PoiEntity poiEntity = showPoiEntity; - List infoPhoto = new ArrayList<>(); - String name = editNameContent.getText().toString().trim();//名称 - if (name == null || name.equals("")) { - Toast.makeText(getActivity(), "请输入充电站 名称", Toast.LENGTH_SHORT).show(); - return; - } else { - poiEntity.setName(name); - } - String site = editSiteContent.getText().toString().trim(); - if (site != null && !site.equals("")) { - poiEntity.setAddress(site); - } - if (latLng == null) { - Toast.makeText(getActivity(), "请确定点位", Toast.LENGTH_SHORT).show(); - return; - } else { - String encode = Geohash.getInstance().encode(latLng.latitude, latLng.longitude); - poiEntity.setGeoWkt(encode); - poiEntity.setX(String.valueOf(latLng.longitude)); - poiEntity.setY(String.valueOf(latLng.latitude)); - } - String describe = editDescribe.getText().toString().trim(); - if (describe != null && !describe.equals("")) { - poiEntity.setDescribe(describe); - } - boolean phoneBean = contactView.getPhoneBean(); - if (phoneBean){ - String list = contactView.getList(); - poiEntity.setTelPhone(list); - } - String tagPanorama = (String) ivPanorama.getTag(); - if (tagPanorama == null) { - Toast.makeText(getActivity(), "请拍照 全景图", Toast.LENGTH_SHORT).show(); - return; - } else { - infoPhoto.add(new Info(tagPanorama)); - } - String tagName = (String) ivName.getTag(); - if (tagName == null) { - Toast.makeText(getActivity(), "请拍照 充电桩编码", Toast.LENGTH_SHORT).show(); - return; - } else { - infoPhoto.add(new Info(tagName)); - } - String tagInternal = (String) ivInternal.getTag(); - if (tagInternal == null) { - Toast.makeText(getActivity(), "请拍照 设备编码", Toast.LENGTH_SHORT).show(); - return; - } else { - infoPhoto.add(new Info(tagInternal)); - } - String tagElse = (String) ivElse.getTag(); - if (tagElse == null) { - Toast.makeText(getActivity(), "请拍照 设备编码", Toast.LENGTH_SHORT).show(); - return; - } else { - infoPhoto.add(new Info(tagElse)); - } - String tagScutcheon = (String) ivScutcheon.getTag(); - if (tagScutcheon == null) { - Toast.makeText(getActivity(), "请拍照 设备编码", Toast.LENGTH_SHORT).show(); - return; - } else { - infoPhoto.add(new Info(tagScutcheon)); - } - poiEntity.setExistence(existence); - poiEntity.setPhotoInfo(infoPhoto); - poiEntity.setStation_type(station_type); - DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - Calendar calendar = Calendar.getInstance(); - calendar.setTimeInMillis(System.currentTimeMillis()); - String format = formatter.format(calendar.getTime()); - poiEntity.setCreateTime(format); - poiEntity.setType(2); - poiEntity.setTaskStatus(2); - poiEntity.setIsLocalData(1); - new Thread(new Runnable() { - @Override - public void run() { - InsertAndUpdateUtils.getInstance().insertOrUpdate(getContext(), poiEntity); - getActivity().runOnUiThread(new Runnable() { - @Override - public void run() { - chargingStationSaveByWork(poiEntity); - } - }); - } - }).start(); - - // onBackPressed(); - } else { - Toast.makeText(getActivity(), "没有申请权限,请手动申请", Toast.LENGTH_SHORT).show(); - } - } - - @Override - public void onDenied(List permissions, boolean never) { - if (never) { - Toast.makeText(getActivity(), "被永久拒绝授权,请手动授予权限", Toast.LENGTH_SHORT).show(); - // 如果是被永久拒绝就跳转到应用权限系统设置页面 - XXPermissions.startPermissionActivity(getActivity(), permissions); - } - } - }); - + initRoadSaveLocal(false); break; case R.id.btn_uploading: Message obtain = Message.obtain(); obtain.what = Constant.TREASURE_FRAGMENT; obtain.obj = false; EventBus.getDefault().post(obtain); - ArrayList chargingStationList = new ArrayList<>(); + chargingStationList = new ArrayList<>(); String tagPanorama = (String) ivPanorama.getTag(); if (tagPanorama != null) { chargingStationList.add(new File(tagPanorama)); @@ -701,8 +595,10 @@ public class ChargingStationFragment extends BaseDrawerFragment implements View. chargingStationList.add(new File(tagScutcheon)); } - if (body != null) { + + if (body != null&& chargingPileBody!=null) { stationUploadByNetWork(body, chargingStationList); + chargingPileUploadNetWork(body,phoneList); } else { new Thread(new Runnable() { @Override @@ -712,6 +608,7 @@ public class ChargingStationFragment extends BaseDrawerFragment implements View. @Override public void run() { stationUploadByNetWork(poiDaoPoiEntity.getBodyId(), chargingStationList); + chargingPileUploadNetWork(poiDaoPoiEntity.getBodyId(),phoneList); } }); } @@ -751,6 +648,166 @@ public class ChargingStationFragment extends BaseDrawerFragment implements View. } } + private void chargingPileUploadNetWork(int chargingPileBody, ArrayList phoneList) { + if (chargingPileBody == 0) { + Toast.makeText(getActivity(), "没有保存本地", Toast.LENGTH_SHORT).show(); + Log.e("TAG", "poiUploadByNetWork: " + body + phoneList); + return; + } + OkGo + // 请求方式和请求url + .post(HttpInterface.CS_TASK_UP_LOAD_PIC) + // 请求的 tag, 主要用于取消对应的请求 + .params("auditId", chargingPileBody) + .addFileParams("file", phoneList) + .tag(this) + .execute(new DialogCallback(PoiUploadBean.class) { + @Override + public void onSuccess(Response poiUploadBeanResponse) { + dismissLoadingDialog(); + Toast.makeText(getActivity(), "上传成功", Toast.LENGTH_SHORT).show(); +// new Thread(new Runnable() { +// @Override +// public void run() { +// poiDao.getPoiEntity() +// ChargingPileDao poiDaoPoiEntity = poiDao.getPoiEntity(showPoiEntity.getId()); +// poiDao.deletePoiEntity(poiDaoPoiEntity); +// getActivity().runOnUiThread(new Runnable() { +// @Override +// public void run() { +// getActivity().onBackPressed();//回退 +// } +// }); +// } +// }).start(); + } + + @Override + public void onError(Response poiUploadBeanResponse) { + super.onError(poiUploadBeanResponse); + dismissLoadingDialog(); + Toast.makeText(getActivity(), poiUploadBeanResponse.code() + "", Toast.LENGTH_SHORT).show(); + Log.d("TAG", "onError: " + poiUploadBeanResponse.code() + ""); + } + }); + } + + private void initRoadSaveLocal(boolean isLocal) { + XXPermissions.with(this) + //读写权限 + .permission(Permission.MANAGE_EXTERNAL_STORAGE) + .request(new OnPermissionCallback() { + @Override + public void onGranted(List permissions, boolean all) { + if (all) { + //保存数据库: + PoiEntity poiEntity = showPoiEntity; + List infoPhoto = new ArrayList<>(); + String name = editNameContent.getText().toString().trim();//名称 + if (name == null || name.equals("")) { + Toast.makeText(getActivity(), "请输入充电站 名称", Toast.LENGTH_SHORT).show(); + return; + } else { + poiEntity.setName(name); + } + String site = editSiteContent.getText().toString().trim(); + if (site != null && !site.equals("")) { + poiEntity.setAddress(site); + } + if (latLng == null) { + Toast.makeText(getActivity(), "请确定点位", Toast.LENGTH_SHORT).show(); + return; + } else { + String encode = Geohash.getInstance().encode(latLng.latitude, latLng.longitude); + poiEntity.setGeoWkt(encode); + poiEntity.setX(String.valueOf(latLng.longitude)); + poiEntity.setY(String.valueOf(latLng.latitude)); + } + String describe = editDescribe.getText().toString().trim(); + if (describe != null && !describe.equals("")) { + poiEntity.setDescribe(describe); + } + boolean phoneBean = contactView.getPhoneBean(); + if (phoneBean){ + String list = contactView.getList(); + poiEntity.setTelPhone(list); + } + String tagPanorama = (String) ivPanorama.getTag(); + if (tagPanorama == null) { + Toast.makeText(getActivity(), "请拍照 全景图", Toast.LENGTH_SHORT).show(); + return; + } else { + infoPhoto.add(new Info(tagPanorama)); + } + String tagName = (String) ivName.getTag(); + if (tagName == null) { + Toast.makeText(getActivity(), "请拍照 充电桩编码", Toast.LENGTH_SHORT).show(); + return; + } else { + infoPhoto.add(new Info(tagName)); + } + String tagInternal = (String) ivInternal.getTag(); + if (tagInternal == null) { + Toast.makeText(getActivity(), "请拍照 设备编码", Toast.LENGTH_SHORT).show(); + return; + } else { + infoPhoto.add(new Info(tagInternal)); + } + String tagElse = (String) ivElse.getTag(); + if (tagElse == null) { + Toast.makeText(getActivity(), "请拍照 设备编码", Toast.LENGTH_SHORT).show(); + return; + } else { + infoPhoto.add(new Info(tagElse)); + } + String tagScutcheon = (String) ivScutcheon.getTag(); + if (tagScutcheon == null) { + Toast.makeText(getActivity(), "请拍照 设备编码", Toast.LENGTH_SHORT).show(); + return; + } else { + infoPhoto.add(new Info(tagScutcheon)); + } + poiEntity.setExistence(existence); + poiEntity.setPhotoInfo(infoPhoto); + poiEntity.setStation_type(station_type); + DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Calendar calendar = Calendar.getInstance(); + calendar.setTimeInMillis(System.currentTimeMillis()); + String format = formatter.format(calendar.getTime()); + poiEntity.setCreateTime(format); + poiEntity.setType(2); + poiEntity.setTaskStatus(2); + poiEntity.setIsLocalData(1); + new Thread(new Runnable() { + @Override + public void run() { + InsertAndUpdateUtils.getInstance().insertOrUpdate(getContext(), poiEntity); + getActivity().runOnUiThread(new Runnable() { + @Override + public void run() { + chargingStationSaveByWork(poiEntity,isLocal); + } + }); + } + }).start(); + + // onBackPressed(); + } else { + Toast.makeText(getActivity(), "没有申请权限,请手动申请", Toast.LENGTH_SHORT).show(); + } + } + + @Override + public void onDenied(List permissions, boolean never) { + if (never) { + Toast.makeText(getActivity(), "被永久拒绝授权,请手动授予权限", Toast.LENGTH_SHORT).show(); + // 如果是被永久拒绝就跳转到应用权限系统设置页面 + XXPermissions.startPermissionActivity(getActivity(), permissions); + } + } + }); + } + private void stationUploadByNetWork(int body, ArrayList chargingStationList) { if (body == 0) { Toast.makeText(getActivity(), "没有保存本地", Toast.LENGTH_SHORT).show(); @@ -789,8 +846,9 @@ public class ChargingStationFragment extends BaseDrawerFragment implements View. }); } - private void chargingStationSaveByWork(PoiEntity poiEntity) { + private void chargingStationSaveByWork(PoiEntity poiEntity, boolean isLocal) { showLoadingDialog(); + HttpParams httpParams = new HttpParams(); httpParams.put("taskId", poiEntity.getTaskId()); httpParams.put("sptype", poiEntity.getStation_type()); @@ -819,7 +877,11 @@ public class ChargingStationFragment extends BaseDrawerFragment implements View. getActivity().runOnUiThread(new Runnable() { @Override public void run() { - Toast.makeText(getActivity(), "保存成功", Toast.LENGTH_SHORT).show(); + if (isLocal){ + stationUploadByNetWork(body,chargingStationList); + }else { + Toast.makeText(getActivity(), "保存成功", Toast.LENGTH_SHORT).show(); + } Log.d("TAG", "onSuccess: " + chargingStationBean.getBody()); } }); diff --git a/app/src/main/java/com/navinfo/outdoor/fragment/IssueFragment.java b/app/src/main/java/com/navinfo/outdoor/fragment/IssueFragment.java index 6ab19d4..bc2dfec 100644 --- a/app/src/main/java/com/navinfo/outdoor/fragment/IssueFragment.java +++ b/app/src/main/java/com/navinfo/outdoor/fragment/IssueFragment.java @@ -13,11 +13,13 @@ import androidx.recyclerview.widget.LinearLayoutManager; import com.jcodecraeer.xrecyclerview.ProgressStyle; import com.jcodecraeer.xrecyclerview.XRecyclerView; +import com.lzy.okgo.model.HttpParams; import com.navinfo.outdoor.R; import com.navinfo.outdoor.activity.FragmentManagement; import com.navinfo.outdoor.adapter.IssueProblemAdapter; import com.navinfo.outdoor.base.BaseFragment; import com.navinfo.outdoor.bean.TaskExplainInfo; +import com.navinfo.outdoor.bean.TaskPrefectureBean; import com.navinfo.outdoor.http.Callback; import com.navinfo.outdoor.http.HttpInterface; import com.navinfo.outdoor.http.OkGoBuilder; @@ -36,7 +38,6 @@ public class IssueFragment extends BaseFragment implements View.OnClickListener private ImageView ivIssueFinish; private XRecyclerView mainIssueRecycler; private IssueProblemAdapter issueProblemAdapter; - private ArrayList issueList; public static IssueFragment newInstance(Bundle bundle) { IssueFragment fragment = new IssueFragment(); @@ -51,28 +52,33 @@ public class IssueFragment extends BaseFragment implements View.OnClickListener @Override protected void initData() { super.initData(); - issueList = new ArrayList<>(); initNetWork(true); } private void initNetWork(boolean b) { showLoadingDialog(); + HttpParams httpParams = new HttpParams(); + httpParams.put("fid", "1"); + httpParams.put("pageNum", "1"); + httpParams.put("pageSize", "10"); OkGoBuilder.getInstance() .Builder(getActivity()) .url(HttpInterface.listTaskExplain) .method(OkGoBuilder.GET) - .cls(TaskExplainInfo.class) - .callback(new Callback() { + .cls(TaskPrefectureBean.class) + .params(httpParams) + .callback(new Callback() { @Override - public void onSuccess(TaskExplainInfo taskExplainInfo, int id) { + public void onSuccess(TaskPrefectureBean response, int id) { dismissLoadingDialog(); - issueProblemAdapter.setExplainList(taskExplainInfo.getBody().getData()); - - Log.d("TAG", "onSuccess: " + taskExplainInfo.getMsg() + ""); + issueProblemAdapter.setExplainList(response.getBody().getList()); + Log.d("TAG", "onSuccess: " + response.getMessage() + ""); } + @Override public void onError(Throwable e, int id) { dismissLoadingDialog(); + // Toast.makeText(getActivity(), e.getMessage(), Toast.LENGTH_SHORT).show(); Log.d("TAG", "onError: " + e.getMessage()); } }).build(); diff --git a/app/src/main/java/com/navinfo/outdoor/fragment/MineFragment.java b/app/src/main/java/com/navinfo/outdoor/fragment/MineFragment.java index f5038ba..f7c387b 100644 --- a/app/src/main/java/com/navinfo/outdoor/fragment/MineFragment.java +++ b/app/src/main/java/com/navinfo/outdoor/fragment/MineFragment.java @@ -62,7 +62,7 @@ public class MineFragment extends BaseFragment implements View.OnClickListener { protected void initView() { super.initView(); imageHeard = findViewById(R.id.image_heard); - Glide.with(getActivity()).load(R.drawable.icon_capacity_evaluation).apply(RequestOptions.bitmapTransform(new CircleCrop())).into(imageHeard); + Glide.with(getActivity()).load(R.drawable.mine_harder).apply(RequestOptions.bitmapTransform(new CircleCrop())).into(imageHeard); imageHeard.setOnClickListener(this::onClick); tvName = findViewById(R.id.tv_name); tvName.setOnClickListener(this::onClick); diff --git a/app/src/main/java/com/navinfo/outdoor/fragment/OtherFragment.java b/app/src/main/java/com/navinfo/outdoor/fragment/OtherFragment.java index d680ba0..f706386 100644 --- a/app/src/main/java/com/navinfo/outdoor/fragment/OtherFragment.java +++ b/app/src/main/java/com/navinfo/outdoor/fragment/OtherFragment.java @@ -597,7 +597,7 @@ public class OtherFragment extends BaseDrawerFragment implements View.OnClickLis @Override public void run() { PoiEntity poiDaoPoiEntity = poiDao.getPoiEntity(showPoiEntity.getId()); - if (poiDaoPoiEntity.getName() == null) { + if (poiDaoPoiEntity!=null&&poiDaoPoiEntity.getName() == null) { poiDao.deletePoiEntity(poiDaoPoiEntity); } } diff --git a/app/src/main/java/com/navinfo/outdoor/fragment/PoiFragment.java b/app/src/main/java/com/navinfo/outdoor/fragment/PoiFragment.java index 777181c..504b2a6 100644 --- a/app/src/main/java/com/navinfo/outdoor/fragment/PoiFragment.java +++ b/app/src/main/java/com/navinfo/outdoor/fragment/PoiFragment.java @@ -879,7 +879,7 @@ public class PoiFragment extends BaseDrawerFragment implements View.OnClickListe @Override public void run() { PoiEntity poiDaoPoiEntity = poiDao.getPoiEntity(showPoiEntity.getId()); - if (poiDaoPoiEntity.getName() == null) { + if (poiDaoPoiEntity!=null&&poiDaoPoiEntity.getName() == null) { poiDao.deletePoiEntity(poiDaoPoiEntity); } } diff --git a/app/src/main/java/com/navinfo/outdoor/fragment/PoiVideoFragment.java b/app/src/main/java/com/navinfo/outdoor/fragment/PoiVideoFragment.java index 70ec2b9..c9decdd 100644 --- a/app/src/main/java/com/navinfo/outdoor/fragment/PoiVideoFragment.java +++ b/app/src/main/java/com/navinfo/outdoor/fragment/PoiVideoFragment.java @@ -76,7 +76,7 @@ import java.util.List; public class PoiVideoFragment extends BaseDrawerFragment implements View.OnClickListener { private TextView tvPictures; - private EditText etRoadName; + private TextView etRoadName; private ImageView ivPoiVideoPicture; private RadioButton rbCar; private RadioButton rbBicycle; @@ -145,7 +145,7 @@ public class PoiVideoFragment extends BaseDrawerFragment implements View.OnClick poiDao = poiDatabase.getPoiDao(); tvPictures = (TextView) findViewById(R.id.tv_pictures); tvPictures.setOnClickListener(this::onClick); - etRoadName = (EditText) findViewById(R.id.et_poi_video_name); + etRoadName = (TextView) findViewById(R.id.et_poi_video_name); ivPoiVideoPicture = (ImageView) findViewById(R.id.iv_poi_video_picture); rbCar = (RadioButton) findViewById(R.id.rb_car); rbBicycle = (RadioButton) findViewById(R.id.rb_bicycle); @@ -615,7 +615,7 @@ public class PoiVideoFragment extends BaseDrawerFragment implements View.OnClick @Override public void run() { PoiEntity poiDaoPoiEntity = poiDao.getPoiEntity(showPoiEntity.getId()); - if (poiDaoPoiEntity.getName() == null) { + if (poiDaoPoiEntity!=null&&poiDaoPoiEntity.getName() == null) { poiDao.deletePoiEntity(poiDaoPoiEntity); } } diff --git a/app/src/main/java/com/navinfo/outdoor/fragment/RoadFragment.java b/app/src/main/java/com/navinfo/outdoor/fragment/RoadFragment.java index e029a18..519bf7d 100644 --- a/app/src/main/java/com/navinfo/outdoor/fragment/RoadFragment.java +++ b/app/src/main/java/com/navinfo/outdoor/fragment/RoadFragment.java @@ -594,7 +594,7 @@ public class RoadFragment extends BaseDrawerFragment implements View.OnClickList @Override public void run() { PoiEntity poiDaoPoiEntity = poiDao.getPoiEntity(showPoiEntity.getId()); - if (poiDaoPoiEntity.getName() == null) { + if (poiDaoPoiEntity!=null&&poiDaoPoiEntity.getName() == null) { poiDao.deletePoiEntity(poiDaoPoiEntity); } } diff --git a/app/src/main/java/com/navinfo/outdoor/fragment/StaySubmitFragment.java b/app/src/main/java/com/navinfo/outdoor/fragment/StaySubmitFragment.java index 1629f87..fa06b89 100644 --- a/app/src/main/java/com/navinfo/outdoor/fragment/StaySubmitFragment.java +++ b/app/src/main/java/com/navinfo/outdoor/fragment/StaySubmitFragment.java @@ -118,6 +118,7 @@ public class StaySubmitFragment extends BaseFragment implements View.OnClickList roadEntities.clear(); roadEntities.addAll(roadAll); staySubmitAdapter.setAllRoad(roadEntities); + staySubmitAdapter.notifyDataSetChanged(); } }); } diff --git a/app/src/main/java/com/navinfo/outdoor/fragment/TreasureFragment.java b/app/src/main/java/com/navinfo/outdoor/fragment/TreasureFragment.java index b2b4845..36d230c 100644 --- a/app/src/main/java/com/navinfo/outdoor/fragment/TreasureFragment.java +++ b/app/src/main/java/com/navinfo/outdoor/fragment/TreasureFragment.java @@ -144,6 +144,7 @@ public class TreasureFragment extends BaseFragment implements View.OnClickListen ivMessage.setOnClickListener(this::onClick); treasureMap = (MapView) findViewById(R.id.treasure_map); tencentMap = treasureMap.getMap(); + cbMapType = (CheckBox) findViewById(R.id.cb_map_type); cbFootType = (CheckBox) findViewById(R.id.cb_foot_type); // sliding_layout.setScrollableViewHelper(new NestedScrollableViewHelper()); @@ -1028,15 +1029,21 @@ public class TreasureFragment extends BaseFragment implements View.OnClickListen } break; case R.id.iv_submit://弹窗 + //分享 CharSequence title = "请选择上报类型"; DialogSettings.style = DialogSettings.STYLE.STYLE_MIUI; List itemList = new ArrayList<>(); itemList.add(new ShareDialog.Item(getContext(), R.drawable.push_poi, "POI")); - itemList.add(new ShareDialog.Item(getContext(), R.drawable.push_poi, "POI录像")); + itemList.add(new ShareDialog.Item(getContext(), R.drawable.poi_video, "POI录像")); itemList.add(new ShareDialog.Item(getContext(), R.drawable.push_road, "道路")); itemList.add(new ShareDialog.Item(getContext(), R.drawable.push_chongdianzhuang, "充电站")); itemList.add(new ShareDialog.Item(getContext(), R.drawable.push_qingbao, "其他")); + if (!ivSubmit.isClickable()){ + ivMessage.setVisibility(View.VISIBLE); + }else { + ivMessage.setVisibility(View.GONE); + } Bundle bundle = new Bundle(); PoiEntity poiEntity = new PoiEntity(); LatLng mapCenterPoint = getMapCenterPoint(); diff --git a/app/src/main/java/com/navinfo/outdoor/fragment/UserAttestationFragment.java b/app/src/main/java/com/navinfo/outdoor/fragment/UserAttestationFragment.java index 009cacf..6866dfa 100644 --- a/app/src/main/java/com/navinfo/outdoor/fragment/UserAttestationFragment.java +++ b/app/src/main/java/com/navinfo/outdoor/fragment/UserAttestationFragment.java @@ -132,7 +132,6 @@ public class UserAttestationFragment extends BaseFragment implements View.OnClic Toast.makeText(getContext(), "身份证错误,请重新输入", Toast.LENGTH_SHORT).show(); return; } - nameAuthentication(); break; } diff --git a/app/src/main/java/com/navinfo/outdoor/util/GPSUtils.java b/app/src/main/java/com/navinfo/outdoor/util/GPSUtils.java index b917cfb..f9200fb 100644 --- a/app/src/main/java/com/navinfo/outdoor/util/GPSUtils.java +++ b/app/src/main/java/com/navinfo/outdoor/util/GPSUtils.java @@ -25,203 +25,203 @@ import java.util.Locale; @SuppressLint("MissingPermission") public class GPSUtils { - private static LocationManager mLocationManager; - - private static final String TAG = "GPSUtils"; - - private static Location mLocation = null; - - private static Activity mContext; - - public GPSUtils(Activity context) { - this.mContext = context; - mLocationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE); - - // 判断GPS是否正常启动 - if (!mLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) { - Toast.makeText(context, "请开启GPS导航...", Toast.LENGTH_SHORT).show(); - // 返回开启GPS导航设置界面 - Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); - context.startActivityForResult(intent, 0); - return; - } - - // 为获取地理位置信息时设置查询条件 - String bestProvider = mLocationManager.getBestProvider(getCriteria(), true); - // 获取位置信息 - // 如果不设置查询要求,getLastKnownLocation方法传人的参数为LocationManager.GPS_PROVIDER - Location location = mLocationManager.getLastKnownLocation(bestProvider); -// getLocationData(location); - mLocation = location; - // 监听状态 - mLocationManager.addGpsStatusListener(listener); - - // 绑定监听,有4个参数 - // 参数1,设备:有GPS_PROVIDER和NETWORK_PROVIDER两种 - // 参数2,位置信息更新周期,单位毫秒 - // 参数3,位置变化最小距离:当位置距离变化超过此值时,将更新位置信息 - // 参数4,监听 - // 备注:参数2和3,如果参数3不为0,则以参数3为准;参数3为0,则通过时间来定时更新;两者为0,则随时刷新 - - // 1秒更新一次,或最小位移变化超过1米更新一次; - // 注意:此处更新准确度非常低,推荐在service里面启动一个Thread,在run中sleep(10000);然后执行handler.sendMessage(),更新位置 - mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 1, locationListener); - } - - /** - * 返回查询条件 - * - * @return - */ - private static Criteria getCriteria() { - Criteria criteria = new Criteria(); - // 设置定位精确度 Criteria.ACCURACY_COARSE比较粗略,Criteria.ACCURACY_FINE则比较精细 - criteria.setAccuracy(Criteria.ACCURACY_FINE); - // 设置是否要求速度 - criteria.setSpeedRequired(false); - // 设置是否允许运营商收费 - criteria.setCostAllowed(false); - // 设置是否需要方位信息 - criteria.setBearingRequired(false); - // 设置是否需要海拔信息 - criteria.setAltitudeRequired(false); - // 设置对电源的需求 - criteria.setPowerRequirement(Criteria.POWER_LOW); - return criteria; - } - - - /** - * @return Location--->getLongitude()获取经度/getLatitude()获取纬度 - */ - public static Location getLocation() { - if (mLocation == null) { - Log.e("GPSUtils", "setLocationData: 获取当前位置信息为空"); - return null; - } - return mLocation; - } - - public static String getLocalCity(){ - if (mLocation==null){ - Log.e("GPSUtils", "getLocalCity: 获取城市信息为空"); - return ""; - } - List
result = getAddress(mLocation); - - String city = ""; - if (result != null && result.size() > 0) { - city = result.get(0).getLocality();//获取城市 - } - return city; - } - - public static String getAddressStr(){ - if (mLocation==null){ - Log.e("GPSUtils", "getAddressStr: 获取详细地址信息为空"); - return ""; - } - List
result = getAddress(mLocation); - - String address = ""; - if (result != null && result.size() > 0) { - address = result.get(0).getAddressLine(0);//获取详细地址 - } - return address; - } - - // 位置监听 - private static LocationListener locationListener = new LocationListener() { - - //位置信息变化时触发 - public void onLocationChanged(Location location) { - mLocation = location; - Log.i(TAG, "时间:" + location.getTime()); - Log.i(TAG, "经度:" + location.getLongitude()); - Log.i(TAG, "纬度:" + location.getLatitude()); - Log.i(TAG, "海拔:" + location.getAltitude()); - } - - //GPS状态变化时触发 - public void onStatusChanged(String provider, int status, Bundle extras) { - switch (status) { - // GPS状态为可见时 - case LocationProvider.AVAILABLE: - Log.i(TAG, "当前GPS状态为可见状态"); - break; - // GPS状态为服务区外时 - case LocationProvider.OUT_OF_SERVICE: - Log.i(TAG, "当前GPS状态为服务区外状态"); - break; - // GPS状态为暂停服务时 - case LocationProvider.TEMPORARILY_UNAVAILABLE: - Log.i(TAG, "当前GPS状态为暂停服务状态"); - break; - } - } - - //GPS开启时触发 - public void onProviderEnabled(String provider) { - Location location = mLocationManager.getLastKnownLocation(provider); - mLocation = location; - } - - //GPS禁用时触发 - public void onProviderDisabled(String provider) { - mLocation = null; - } - }; - - // 获取地址信息 - private static List
getAddress(Location location) { - List
result = null; - try { - if (location != null) { - Geocoder gc = new Geocoder(mContext, Locale.getDefault()); - result = gc.getFromLocation(location.getLatitude(), - location.getLongitude(), 1); - } - } catch (Exception e) { - e.printStackTrace(); - } - return result; - } - - - // 状态监听 - GpsStatus.Listener listener = new GpsStatus.Listener() { - public void onGpsStatusChanged(int event) { - switch (event) { - // 第一次定位 - case GpsStatus.GPS_EVENT_FIRST_FIX: - Log.i(TAG, "第一次定位"); - break; - // 卫星状态改变 - case GpsStatus.GPS_EVENT_SATELLITE_STATUS: - Log.i(TAG, "卫星状态改变"); - GpsStatus gpsStatus = mLocationManager.getGpsStatus(null); - // 获取卫星颗数的默认最大值 - int maxSatellites = gpsStatus.getMaxSatellites(); - // 创建一个迭代器保存所有卫星 - Iterator iters = gpsStatus.getSatellites() - .iterator(); - int count = 0; - while (iters.hasNext() && count <= maxSatellites) { - GpsSatellite s = iters.next(); - count++; - } - System.out.println("搜索到:" + count + "颗卫星"); - break; - // 定位启动 - case GpsStatus.GPS_EVENT_STARTED: - Log.i(TAG, "定位启动"); - break; - // 定位结束 - case GpsStatus.GPS_EVENT_STOPPED: - Log.i(TAG, "定位结束"); - break; - } - } - }; +// private static LocationManager mLocationManager; +// +// private static final String TAG = "GPSUtils"; +// +// private static Location mLocation = null; +// +// private static Activity mContext; +// +// public GPSUtils(Activity context) { +// this.mContext = context; +// mLocationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE); +// +// // 判断GPS是否正常启动 +// if (!mLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) { +// Toast.makeText(context, "请开启GPS导航...", Toast.LENGTH_SHORT).show(); +// // 返回开启GPS导航设置界面 +// Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); +// context.startActivityForResult(intent, 0); +// return; +// } +// +// // 为获取地理位置信息时设置查询条件 +// String bestProvider = mLocationManager.getBestProvider(getCriteria(), true); +// // 获取位置信息 +// // 如果不设置查询要求,getLastKnownLocation方法传人的参数为LocationManager.GPS_PROVIDER +// Location location = mLocationManager.getLastKnownLocation(bestProvider); +//// getLocationData(location); +// mLocation = location; +// // 监听状态 +// mLocationManager.addGpsStatusListener(listener); +// +// // 绑定监听,有4个参数 +// // 参数1,设备:有GPS_PROVIDER和NETWORK_PROVIDER两种 +// // 参数2,位置信息更新周期,单位毫秒 +// // 参数3,位置变化最小距离:当位置距离变化超过此值时,将更新位置信息 +// // 参数4,监听 +// // 备注:参数2和3,如果参数3不为0,则以参数3为准;参数3为0,则通过时间来定时更新;两者为0,则随时刷新 +// +// // 1秒更新一次,或最小位移变化超过1米更新一次; +// // 注意:此处更新准确度非常低,推荐在service里面启动一个Thread,在run中sleep(10000);然后执行handler.sendMessage(),更新位置 +// mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 1, locationListener); +// } +// +// /** +// * 返回查询条件 +// * +// * @return +// */ +// private static Criteria getCriteria() { +// Criteria criteria = new Criteria(); +// // 设置定位精确度 Criteria.ACCURACY_COARSE比较粗略,Criteria.ACCURACY_FINE则比较精细 +// criteria.setAccuracy(Criteria.ACCURACY_FINE); +// // 设置是否要求速度 +// criteria.setSpeedRequired(false); +// // 设置是否允许运营商收费 +// criteria.setCostAllowed(false); +// // 设置是否需要方位信息 +// criteria.setBearingRequired(false); +// // 设置是否需要海拔信息 +// criteria.setAltitudeRequired(false); +// // 设置对电源的需求 +// criteria.setPowerRequirement(Criteria.POWER_LOW); +// return criteria; +// } +// +// +// /** +// * @return Location--->getLongitude()获取经度/getLatitude()获取纬度 +// */ +// public static Location getLocation() { +// if (mLocation == null) { +// Log.e("GPSUtils", "setLocationData: 获取当前位置信息为空"); +// return null; +// } +// return mLocation; +// } +// +// public static String getLocalCity(){ +// if (mLocation==null){ +// Log.e("GPSUtils", "getLocalCity: 获取城市信息为空"); +// return ""; +// } +// List
result = getAddress(mLocation); +// +// String city = ""; +// if (result != null && result.size() > 0) { +// city = result.get(0).getLocality();//获取城市 +// } +// return city; +// } +// +// public static String getAddressStr(){ +// if (mLocation==null){ +// Log.e("GPSUtils", "getAddressStr: 获取详细地址信息为空"); +// return ""; +// } +// List
result = getAddress(mLocation); +// +// String address = ""; +// if (result != null && result.size() > 0) { +// address = result.get(0).getAddressLine(0);//获取详细地址 +// } +// return address; +// } +// +// // 位置监听 +// private static LocationListener locationListener = new LocationListener() { +// +// //位置信息变化时触发 +// public void onLocationChanged(Location location) { +// mLocation = location; +// Log.i(TAG, "时间:" + location.getTime()); +// Log.i(TAG, "经度:" + location.getLongitude()); +// Log.i(TAG, "纬度:" + location.getLatitude()); +// Log.i(TAG, "海拔:" + location.getAltitude()); +// } +// +// //GPS状态变化时触发 +// public void onStatusChanged(String provider, int status, Bundle extras) { +// switch (status) { +// // GPS状态为可见时 +// case LocationProvider.AVAILABLE: +// Log.i(TAG, "当前GPS状态为可见状态"); +// break; +// // GPS状态为服务区外时 +// case LocationProvider.OUT_OF_SERVICE: +// Log.i(TAG, "当前GPS状态为服务区外状态"); +// break; +// // GPS状态为暂停服务时 +// case LocationProvider.TEMPORARILY_UNAVAILABLE: +// Log.i(TAG, "当前GPS状态为暂停服务状态"); +// break; +// } +// } +// +// //GPS开启时触发 +// public void onProviderEnabled(String provider) { +// Location location = mLocationManager.getLastKnownLocation(provider); +// mLocation = location; +// } +// +// //GPS禁用时触发 +// public void onProviderDisabled(String provider) { +// mLocation = null; +// } +// }; +// +// // 获取地址信息 +// private static List
getAddress(Location location) { +// List
result = null; +// try { +// if (location != null) { +// Geocoder gc = new Geocoder(mContext, Locale.getDefault()); +// result = gc.getFromLocation(location.getLatitude(), +// location.getLongitude(), 1); +// } +// } catch (Exception e) { +// e.printStackTrace(); +// } +// return result; +// } +// +// +// // 状态监听 +// GpsStatus.Listener listener = new GpsStatus.Listener() { +// public void onGpsStatusChanged(int event) { +// switch (event) { +// // 第一次定位 +// case GpsStatus.GPS_EVENT_FIRST_FIX: +// Log.i(TAG, "第一次定位"); +// break; +// // 卫星状态改变 +// case GpsStatus.GPS_EVENT_SATELLITE_STATUS: +// Log.i(TAG, "卫星状态改变"); +// GpsStatus gpsStatus = mLocationManager.getGpsStatus(null); +// // 获取卫星颗数的默认最大值 +// int maxSatellites = gpsStatus.getMaxSatellites(); +// // 创建一个迭代器保存所有卫星 +// Iterator iters = gpsStatus.getSatellites() +// .iterator(); +// int count = 0; +// while (iters.hasNext() && count <= maxSatellites) { +// GpsSatellite s = iters.next(); +// count++; +// } +// System.out.println("搜索到:" + count + "颗卫星"); +// break; +// // 定位启动 +// case GpsStatus.GPS_EVENT_STARTED: +// Log.i(TAG, "定位启动"); +// break; +// // 定位结束 +// case GpsStatus.GPS_EVENT_STOPPED: +// Log.i(TAG, "定位结束"); +// break; +// } +// } +// }; } diff --git a/app/src/main/java/com/navinfo/outdoor/util/TecentLocationUtils.java b/app/src/main/java/com/navinfo/outdoor/util/TecentLocationUtils.java index 8093fe0..8ed012b 100644 --- a/app/src/main/java/com/navinfo/outdoor/util/TecentLocationUtils.java +++ b/app/src/main/java/com/navinfo/outdoor/util/TecentLocationUtils.java @@ -45,7 +45,7 @@ public class TecentLocationUtils implements TencentLocationListener{ locationManager.setCoordinateType(TencentLocationManager.COORDINATE_TYPE_GCJ02); //创建定位请求 locationRequest = TencentLocationRequest.create(); - locationRequest.setInterval(2000); // 每2秒返回一次地址数据 + locationRequest.setInterval(1000); // 每1秒返回一次地址数据 } public void startLocation(Context mContext) { // 启动定位服务 diff --git a/app/src/main/java/com/navinfo/outdoor/util/Whetherisempty.java b/app/src/main/java/com/navinfo/outdoor/util/Whetherisempty.java index 33b4854..c498d58 100644 --- a/app/src/main/java/com/navinfo/outdoor/util/Whetherisempty.java +++ b/app/src/main/java/com/navinfo/outdoor/util/Whetherisempty.java @@ -7,7 +7,7 @@ import org.json.JSONObject; public class Whetherisempty { public static String getClfz(String s) throws JSONException { JSONObject jsonObject = new JSONObject(s); - if (String.valueOf(jsonObject.get("body")).equals("[]") || String.valueOf(jsonObject.get("body")).equals("")) { + if (!jsonObject.has("body") || String.valueOf(jsonObject.get("body")).equals("[]") || String.valueOf(jsonObject.get("body")).equals("")) { jsonObject.put("body", null); return jsonObject.toString(); } else { diff --git a/app/src/main/res/drawable/ic_baseline_search.xml b/app/src/main/res/drawable/ic_baseline_search.xml new file mode 100644 index 0000000..b7ffb26 --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_search.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/iv_message.png b/app/src/main/res/drawable/iv_message.png new file mode 100644 index 0000000000000000000000000000000000000000..443bae8e3dba2c0407e2aca3dde9727724424204 GIT binary patch literal 7351 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 XTekx_-advJl7J3YA5*D*AOHUV)3Ug1 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/mine_harder.png b/app/src/main/res/drawable/mine_harder.png new file mode 100644 index 0000000000000000000000000000000000000000..06fd65d4d396a7cfc299cce5d01b6031d15852b0 GIT binary patch literal 10574 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 KMNUMnLSTZZJ;{9l diff --git a/app/src/main/res/drawable/poi_video.png b/app/src/main/res/drawable/poi_video.png new file mode 100644 index 0000000000000000000000000000000000000000..60ee5fee1888ef1471fbaabd142036ef1970a383 GIT binary patch literal 5972 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 - + \ No newline at end of file diff --git a/app/src/main/res/drawable/shares.png b/app/src/main/res/drawable/shares.png new file mode 100644 index 0000000000000000000000000000000000000000..1099f4cf8ac6cb863b3491a9b2f5d64dd98fc0cc GIT binary patch literal 4496 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/layout/about_fragment.xml b/app/src/main/res/layout/about_fragment.xml index 55a4ddf..153a8d5 100644 --- a/app/src/main/res/layout/about_fragment.xml +++ b/app/src/main/res/layout/about_fragment.xml @@ -2,6 +2,7 @@ @@ -86,10 +88,9 @@ @@ -121,6 +122,8 @@ - - diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml index 80c6492..5a466f0 100644 --- a/app/src/main/res/layout/activity_login.xml +++ b/app/src/main/res/layout/activity_login.xml @@ -86,12 +86,12 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/login_paw" /> - @@ -132,9 +132,11 @@ style="@style/login_style" android:layout_width="300dp" android:layout_height="50dp" + android:layout_marginTop="30dp" + android:layout_marginBottom="261dp" android:gravity="center" android:text="登录" - android:layout_marginTop="30dp" + app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="@+id/et_login_paw" app:layout_constraintStart_toStartOf="@+id/et_login_paw" app:layout_constraintTop_toBottomOf="@+id/textView" /> diff --git a/app/src/main/res/layout/activity_picture.xml b/app/src/main/res/layout/activity_picture.xml index 8a3d210..0457194 100644 --- a/app/src/main/res/layout/activity_picture.xml +++ b/app/src/main/res/layout/activity_picture.xml @@ -5,25 +5,30 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:background="#FF444444"> - - + android:layout_height="match_parent"> + + + + -