diff --git a/app/build.gradle b/app/build.gradle index 58798e9..b48ec2e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -3,7 +3,7 @@ apply plugin: 'com.android.application' android { compileSdkVersion 29 buildToolsVersion "29.0.0" - // 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 4867f5d..81f38d3 100644 --- a/app/src/main/java/com/navinfo/outdoor/activity/PictureActivity.java +++ b/app/src/main/java/com/navinfo/outdoor/activity/PictureActivity.java @@ -22,10 +22,14 @@ import android.widget.ImageButton; import android.widget.ImageView; import android.widget.Toast; +import com.hjq.permissions.OnPermissionCallback; +import com.hjq.permissions.Permission; +import com.hjq.permissions.XXPermissions; import com.navinfo.outdoor.R; import com.navinfo.outdoor.api.Constant; import com.navinfo.outdoor.base.BaseActivity; +import com.navinfo.outdoor.util.NetWorkUtils; import com.navinfo.outdoor.util.SdkFolderCreate; import com.navinfo.outdoor.util.ToastUtil; import com.otaliastudios.cameraview.CameraException; @@ -48,6 +52,7 @@ import com.tencent.map.geolocation.TencentLocationRequest; import com.tencent.tencentmap.mapsdk.maps.LocationSource; import com.tencent.tencentmap.mapsdk.maps.MapView; import com.tencent.tencentmap.mapsdk.maps.TencentMap; +import com.tencent.tencentmap.mapsdk.maps.UiSettings; import com.tencent.tencentmap.mapsdk.maps.model.BitmapDescriptor; import com.tencent.tencentmap.mapsdk.maps.model.BitmapDescriptorFactory; import com.tencent.tencentmap.mapsdk.maps.model.MyLocationStyle; @@ -66,6 +71,8 @@ import java.util.ArrayList; import java.util.Calendar; import java.util.List; +import static com.tencent.mapsdk.internal.aaa.getContext; + public class PictureActivity extends BaseActivity implements View.OnClickListener, LocationSource, TencentLocationListener { private static final CameraLogger LOG = CameraLogger.create("Picture"); @@ -73,8 +80,6 @@ public class PictureActivity extends BaseActivity implements View.OnClickListene private ImageButton capturePicture; private long captureTime = 0; private android.widget.Button btnSwitch; - private boolean USE_FRAME_PROCESSOR = false; - private boolean DECODE_BITMAP = false; private TencentMap tencentMap; private TencentLocationManager locationManager; private TencentLocationRequest locationRequest; @@ -100,8 +105,9 @@ public class PictureActivity extends BaseActivity implements View.OnClickListene btnVideo.setOnClickListener(this::onClick); btnSwitch = (Button) findViewById(R.id.btn_switch); btnSwitch.setOnClickListener(this::onClick); - capturePicture = (ImageButton) findViewById(R.id.capturePicture); - capturePicture.setOnClickListener(this::onClick); +// capturePicture = (ImageButton) findViewById(R.id.capturePicture); +// capturePicture.setOnClickListener(this::onClick); + //相机记录器 CameraLogger.setLogLevel(CameraLogger.LEVEL_VERBOSE); camera = findViewById(R.id.camera); camera.setOnClickListener(this::onClick); @@ -117,8 +123,12 @@ public class PictureActivity extends BaseActivity implements View.OnClickListene SdkFolderCreate.mkdirs(Constant.PICTURE_FOLDER); //获取地图 tencentMap = ivMap.getMap(); - //地图定位 - initLocation(); + //获取地图UI 设置对象 + UiSettings uiSettings = tencentMap.getUiSettings(); + //设置logo的大小 + uiSettings.setLogoScale(0.7f); + //开启定位权限 + checkNetWork(); //相机预览监听 camera.addCameraListener(new CameraListener() { @@ -131,7 +141,6 @@ public class PictureActivity extends BaseActivity implements View.OnClickListene String format = formatter.format(calendar.getTime()); //文件 File file = new File(Constant.PICTURE_FOLDER, format + ".jpg"); - result.toFile(file, new FileCallback() { @Override public void onFileReady(@Nullable @org.jetbrains.annotations.Nullable File file) { @@ -163,6 +172,48 @@ public class PictureActivity extends BaseActivity implements View.OnClickListene }); } +// + private void checkNetWork() { + if (NetWorkUtils.isNetworkAvailable(this)) { // 当前网络可用 + checkMyLocation(); + } else { // 当前网络不可用 + ToastUtil.showShort(this, Constant.NETWORK_UNAVAILABLE); + } + } + + private void checkMyLocation() { + // 1.判断是否拥有定位的权限 + // 1.1 拥有权限进行相应操作 + // 1.2 没有权限申请权限 + // 1.2.1 Android 6.0 动态申请权限 + // 1.2.1.1 用户给予权限进行相应操作 + // 1.2.1.2 用户没有给予权限 作出相应提示 + // 1.2.2 某些5.0权限的手机执行相应操作 + + XXPermissions.with(this) + .permission(Permission.ACCESS_COARSE_LOCATION) + .request(new OnPermissionCallback() { + + @Override + public void onGranted(List permissions, boolean all) { + if (all) { + //建立定位 + initLocation(); + } else { + Toast.makeText(PictureActivity.this, "申请权限失败", Toast.LENGTH_SHORT).show(); + } + } + + @Override + public void onDenied(List permissions, boolean never) { + if (never) { + Toast.makeText(PictureActivity.this, "被永久拒绝授权,请手动授予定位权限", Toast.LENGTH_SHORT).show(); + // 如果是被永久拒绝就跳转到应用权限系统设置页面 + XXPermissions.startPermissionActivity(PictureActivity.this, permissions); + } + } + }); + } private void message(String content, Boolean important) { if (important) { @@ -185,14 +236,14 @@ public class PictureActivity extends BaseActivity implements View.OnClickListene @Override public void onClick(View v) { switch (v.getId()) { - case R.id.capturePicture: - camera.setMode(Mode.PICTURE); - if (!camera.isTakingPicture()) { - captureTime = System.currentTimeMillis(); - message("Capturing picture...", false); - camera.takePicture(); - } - break; +// case R.id.capturePicture: +// camera.setMode(Mode.PICTURE); +// if (!camera.isTakingPicture()) { +// captureTime = System.currentTimeMillis(); +// message("Capturing picture...", false); +// camera.takePicture(); +// } +// break; case R.id.btn_switch: btnSwich(); break; @@ -333,7 +384,13 @@ public class PictureActivity extends BaseActivity implements View.OnClickListene locationRequest = null; locationChangedListener = null; } - + /** + * 实现位置监听 + * + * @param tencentLocation + * @param i + * @param s + */ @Override public void onLocationChanged(TencentLocation tencentLocation, int i, String s) { if (i == TencentLocation.ERROR_OK && locationChangedListener != null) { diff --git a/app/src/main/java/com/navinfo/outdoor/adapter/StaySubmitAdapter.java b/app/src/main/java/com/navinfo/outdoor/adapter/StaySubmitAdapter.java index 510bf4e..939914c 100644 --- a/app/src/main/java/com/navinfo/outdoor/adapter/StaySubmitAdapter.java +++ b/app/src/main/java/com/navinfo/outdoor/adapter/StaySubmitAdapter.java @@ -21,14 +21,18 @@ import java.util.ArrayList; import java.util.List; public class StaySubmitAdapter extends RecyclerView.Adapter { - + private List allRoad = new ArrayList<>(); private Context context; - public StaySubmitAdapter(Context context) { this.context = context; } + public void setAllRoad(List allRoad) { + this.allRoad.addAll(allRoad); + notifyDataSetChanged(); + } + @NonNull @NotNull @Override @@ -39,24 +43,27 @@ public class StaySubmitAdapter extends RecyclerView.Adapter { - Intent intent = new Intent(getContext(), PictureActivity.class); - startActivity(intent); - }); + tvPictures.setOnClickListener(this::onClick); etRoadName = (EditText) findViewById(R.id.et_road_name); ivRoadPicture = (ImageView) findViewById(R.id.iv_road_picture); + Glide.with(getContext()).load(getLocalVideoBitmap(String.valueOf(R.drawable.bg_01))).into(ivRoadPicture); rbCar = (RadioButton) findViewById(R.id.rb_car); rbBicycle = (RadioButton) findViewById(R.id.rb_bicycle); rbWalking = (RadioButton) findViewById(R.id.rb_walking); rbManual = (RadioButton) findViewById(R.id.rb_manual); etDesc = (EditText) findViewById(R.id.et_desc); btnRoadSave = (Button) findViewById(R.id.btn_road_save); + btnRoadSave.setOnClickListener(this::onClick); rgType = (RadioGroup) findViewById(R.id.rg_type); //禁用可操作性控件 - // disables(); + // disables(); + //获取 } private void disables() { @@ -68,5 +91,104 @@ public class RoadFragment extends BaseFragment { @Override protected void initData() { super.initData(); + // infos = new ArrayList<>(); + } + + /** + * 获取本地视频的第一帧 + * + * @param localPath + * @return + */ + public Bitmap getLocalVideoBitmap(String localPath) { + Bitmap bitmap = null; + MediaMetadataRetriever retriever = new MediaMetadataRetriever(); + try { + //根据文件路径获取缩略图 + retriever.setDataSource(localPath); + //获得第一帧图片 + bitmap = retriever.getFrameAtTime(); + } catch (IllegalArgumentException e) { + e.printStackTrace(); + } finally { + retriever.release(); + } + return bitmap; + } + + @Override + public void onClick(View v) { + switch (v.getId()) { + case R.id.btn_road_save: + XXPermissions.with(getContext()) + .permission(Permission.MANAGE_EXTERNAL_STORAGE) + .request(new OnPermissionCallback() { + @Override + public void onGranted(List permissions, boolean all) { + if (all) { + PoiEntity poiEntity = new PoiEntity(); + String roadName = etRoadName.getText().toString().trim(); + if (roadName == null || roadName.equals("")) { + Toast.makeText(getContext(), "请输入道路 名称", Toast.LENGTH_SHORT).show(); + return; + } else { + poiEntity.setName(roadName); + } + RoadExtend roadExtend = new RoadExtend(); + int type = getPictureType(); + if (type== -1){ + Toast.makeText(getContext(), "请选择拍照方式", Toast.LENGTH_SHORT).show(); + return; + } + roadExtend.setType(type); + Gson gson = new Gson(); + String roadExtendJson = gson.toJson(roadExtend); + poiEntity.setExtend(roadExtendJson); + String desc = etDesc.getText().toString().trim(); + if (desc == null || desc.equals("")) { + Toast.makeText(getContext(), "请输入你的任务描述", Toast.LENGTH_SHORT).show(); + } else { + poiEntity.setDescribe(desc); + } + new Thread(new Runnable() { + @Override + public void run() { + poiDao.insertPoiEntity(poiEntity); + } + }).start(); + } + } + + @Override + public void onDenied(List permissions, boolean never) { + if (never) { + Toast.makeText(getActivity(), "被永久拒绝授权,请手动授予权限", Toast.LENGTH_SHORT).show(); + // 如果是被永久拒绝就跳转到应用权限系统设置页面 + XXPermissions.startPermissionActivity(getActivity(), permissions); + } + } + + }); + break; + + case R.id.tv_pictures: + Intent intent = new Intent(getContext(), PictureActivity.class); + startActivity(intent); + break; + } + } + + //获取拍照类型 + private int getPictureType() { + if (rbCar != null && rbCar.isChecked()) { + return 0; + } else if (rbBicycle != null && rbBicycle.isChecked()) { + return 1; + } else if (rbWalking != null && rbWalking.isChecked()) { + return 2; + }else if (rbManual != null && rbManual.isChecked()) { + return 3; + } + return -1; } } \ No newline at end of file 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 29882bb..1b95fa5 100644 --- a/app/src/main/java/com/navinfo/outdoor/fragment/StaySubmitFragment.java +++ b/app/src/main/java/com/navinfo/outdoor/fragment/StaySubmitFragment.java @@ -5,8 +5,13 @@ import android.widget.Button; import android.widget.CheckBox; import android.widget.TextView; import android.widget.Toast; +import java.text.SimpleDateFormat; +import androidx.appcompat.app.AppCompatActivity; import androidx.constraintlayout.widget.ConstraintLayout; import androidx.recyclerview.widget.DividerItemDecoration; +import androidx.recyclerview.widget.LinearLayoutManager; + +import com.google.gson.Gson; import com.jcodecraeer.xrecyclerview.ProgressStyle; import com.jcodecraeer.xrecyclerview.XRecyclerView; import com.kongzue.dialog.interfaces.OnMenuItemClickListener; @@ -18,6 +23,9 @@ import com.navinfo.outdoor.base.BaseFragment; import com.navinfo.outdoor.room.PoiDao; import com.navinfo.outdoor.room.PoiDatabase; import com.navinfo.outdoor.room.PoiEntity; + +import java.sql.Date; +import java.util.ArrayList; import java.util.List; /** @@ -33,6 +41,7 @@ public class StaySubmitFragment extends BaseFragment implements View.OnClickList private PoiDao poiDao; private TextView tvStayType; private TextView tvStayResult; + private ArrayList poiEntities; @Override protected int getLayout() { @@ -53,6 +62,7 @@ public class StaySubmitFragment extends BaseFragment implements View.OnClickList cbSelect = (CheckBox) findViewById(R.id.cb_select); tvDelete = (TextView) findViewById(R.id.tv_delete); btnStaySubmit = (Button) findViewById(R.id.btn_stay_submit); + stayXrv.setLayoutManager(new LinearLayoutManager(getActivity())); stayXrv.addItemDecoration(new DividerItemDecoration(getContext(), DividerItemDecoration.VERTICAL)); stayXrv.setRefreshProgressStyle(ProgressStyle.BallSpinFadeLoader); stayXrv.setLoadingMoreProgressStyle(ProgressStyle.BallRotate); @@ -78,7 +88,27 @@ public class StaySubmitFragment extends BaseFragment implements View.OnClickList @Override protected void initData() { super.initData(); - + poiDatabase = PoiDatabase.getInstance(getContext()); + poiDao = poiDatabase.getPoiDao(); + poiEntities = new ArrayList<>(); + new Thread(new Runnable() { + @Override + public void run() { + List allRoad = poiDao.getAllPoi(); + getActivity().runOnUiThread(new Runnable() { + @Override + public void run() { + Log.d("TAG", "run: " + allRoad.toString()); +// SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm "); +// Date curDate = new Date(System.currentTimeMillis());//获取当前时间 +// String str = formatter.format(curDate); +// + poiEntities.addAll(allRoad); + staySubmitAdapter.setAllRoad(allRoad); + } + }); + } + }).start(); } @Override @@ -86,21 +116,15 @@ public class StaySubmitFragment extends BaseFragment implements View.OnClickList switch (v.getId()) { case R.id.tv_stay_result: Toast.makeText(getContext(), "点击了", Toast.LENGTH_SHORT).show(); - new Thread(new Runnable() { - @Override - public void run() { - List allPoi = poiDao.getAllPoi(); - Log.d("TAG", "run: " + allPoi.toString()); - } - }).start(); break; case R.id.cl_stay_type: -// BottomMenu.show(UserApplication.getUserApplication(), new String[]{"poi", "道路", "充电站", "其他"}, new OnMenuItemClickListener() { -// @Override -// public void onClick(String text, int index) { -// tvStayType.setText(text); -// } -// }); + BottomMenu.show((AppCompatActivity) getContext(), new String[]{"poi", "道路", "充电站", "其他"}, new OnMenuItemClickListener() { + @Override + public void onClick(String text, int index) { + tvStayType.setText(text); + + } + }); break; } } diff --git a/app/src/main/java/com/navinfo/outdoor/room/PoiEntity.java b/app/src/main/java/com/navinfo/outdoor/room/PoiEntity.java index a362689..37ac869 100644 --- a/app/src/main/java/com/navinfo/outdoor/room/PoiEntity.java +++ b/app/src/main/java/com/navinfo/outdoor/room/PoiEntity.java @@ -14,7 +14,6 @@ import java.util.List; public class PoiEntity { @PrimaryKey(autoGenerate = true) // 设置主键,并且自动生长 private int id; - private int pid; //采集id 保存本地或提交数据时时返回 private int taskId;//任务id private int userId;//用户id @@ -26,6 +25,15 @@ public class PoiEntity { private String memo;//备注 private double precision;//金额 private String photo;//照片信息 + private String extend;//添加字段 + public String getExtend() { + return extend; + } + + public void setExtend(String extend) { + this.extend = extend; + } + //ROOM不支持直接存储集合 @TypeConverters(PhotoInfoConverter.class) private List photoInfo;//照片信息 @@ -170,26 +178,4 @@ public class PoiEntity { this.detail = detail; } - @Override - public String toString() { - return "PoiEntity{" + - "id=" + id + - ", pid=" + pid + - ", taskId=" + taskId + - ", userId=" + userId + - ", createTime='" + createTime + '\'' + - ", name='" + name + '\'' + - ", describe='" + describe + '\'' + - ", address='" + address + '\'' + - ", telPhone='" + telPhone + '\'' + - ", memo='" + memo + '\'' + - ", precision=" + precision + - ", photo='" + photo + '\'' + - ", photoInfo=" + photoInfo + - ", existence=" + existence + - ", x='" + x + '\'' + - ", y='" + y + '\'' + - ", detail='" + detail + '\'' + - '}'; - } } diff --git a/app/src/main/res/layout/activity_picture.xml b/app/src/main/res/layout/activity_picture.xml index bcad65a..689a592 100644 --- a/app/src/main/res/layout/activity_picture.xml +++ b/app/src/main/res/layout/activity_picture.xml @@ -9,7 +9,7 @@ android:id="@+id/camera" android:layout_width="match_parent" android:layout_height="0dp" - app:layout_constraintBottom_toTopOf="@id/ll_caiji" + app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -65,111 +65,58 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +