diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml
index 0f65517..16002fb 100644
--- a/.idea/jarRepositories.xml
+++ b/.idea/jarRepositories.xml
@@ -41,5 +41,10 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
index 108b541..8a56f12 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -1,14 +1,13 @@
apply plugin: 'com.android.application'
-
android {
compileSdkVersion 30
buildToolsVersion "30.0.3"
- // ndkVersion '23.0.7123448'
+ ndkVersion '23.0.7123448'
defaultConfig {
applicationId "com.navinfo.outdoor"
minSdkVersion 23
- targetSdkVersion 30
+ targetSdkVersion 22
versionCode 1
versionName "1.0"
@@ -54,10 +53,10 @@ dependencies {
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
+ //友盟自动检测bug
implementation 'com.umeng.umsdk:common:9.3.8'
implementation 'com.umeng.umsdk:asms:1.2.2'
implementation 'com.umeng.umsdk:apm:1.2.0'
-
//状态栏侵染
// 基础依赖包,必须要依赖
@@ -93,6 +92,8 @@ dependencies {
implementation 'com.kongzue.dialog_v3x:dialog:3.2.4'
//xRecyclerview下拉刷新控件
implementation project(':xrecyclerview')
+ //拍照功能
+ implementation 'com.otaliastudios:cameraview:2.7.0'
//腾讯地图
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 01af8c2..e70dd55 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -1,47 +1,39 @@
+
-
-
-
-
+
+
-
-
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
+
+
+
+
+
+
+
@@ -61,19 +67,21 @@
android:name="design_height_in_dp"
android:value="800" />
-
+
-
-
-
-
-
-
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/navinfo/outdoor/activity/FragmentManagement.java b/app/src/main/java/com/navinfo/outdoor/activity/FragmentManagement.java
index b002fb1..1d6cd32 100644
--- a/app/src/main/java/com/navinfo/outdoor/activity/FragmentManagement.java
+++ b/app/src/main/java/com/navinfo/outdoor/activity/FragmentManagement.java
@@ -76,8 +76,6 @@ public class FragmentManagement extends BaseActivity {
private PoiFragment poiFragment;//寻宝-上传-POI的fragment -27
private RoadFragment roadFragment;//寻宝-上传-道路的fragment -28
-
-
@Override
protected int getLayout() {
return R.layout.management_fragment;
diff --git a/app/src/main/java/com/navinfo/outdoor/activity/MainActivity.java b/app/src/main/java/com/navinfo/outdoor/activity/MainActivity.java
index 91caaee..6fdb571 100644
--- a/app/src/main/java/com/navinfo/outdoor/activity/MainActivity.java
+++ b/app/src/main/java/com/navinfo/outdoor/activity/MainActivity.java
@@ -1,6 +1,7 @@
package com.navinfo.outdoor.activity;
+import androidx.annotation.Nullable;
import androidx.core.app.ActivityCompat;
import android.Manifest;
@@ -8,6 +9,7 @@ import android.content.Intent;
import android.os.CountDownTimer;
import com.navinfo.outdoor.R;
+import com.navinfo.outdoor.api.Constant;
import com.navinfo.outdoor.base.BaseActivity;
import com.kongzue.dialog.util.DialogSettings;
@@ -52,8 +54,14 @@ public class MainActivity extends BaseActivity {
Manifest.permission.READ_PHONE_STATE,
Manifest.permission.ACCESS_COARSE_LOCATION
};
- ActivityCompat.requestPermissions(this, pers, 100);
+ ActivityCompat.requestPermissions(this, pers, Constant.PERMISSION_REQUEST_CODE);
}
+
+ @Override
+ protected void onActivityResult(int requestCode, int resultCode, @Nullable @org.jetbrains.annotations.Nullable Intent data) {
+ super.onActivityResult(requestCode, resultCode, data);
+ }
+
@Override
protected void initView() {
super.initView();
diff --git a/app/src/main/java/com/navinfo/outdoor/activity/PictureActivity.java b/app/src/main/java/com/navinfo/outdoor/activity/PictureActivity.java
new file mode 100644
index 0000000..ed718c5
--- /dev/null
+++ b/app/src/main/java/com/navinfo/outdoor/activity/PictureActivity.java
@@ -0,0 +1,388 @@
+package com.navinfo.outdoor.activity;
+
+import androidx.annotation.NonNull;
+
+import androidx.annotation.Nullable;
+
+import android.content.Intent;
+import android.content.pm.ActivityInfo;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.graphics.Matrix;
+import android.location.Location;
+import android.os.Looper;
+import android.os.Message;
+import android.util.DisplayMetrics;
+import android.util.Log;
+import android.view.View;
+
+import android.view.ViewGroup;
+import android.widget.Button;
+import android.widget.ImageButton;
+import android.widget.Toast;
+
+import com.navinfo.outdoor.R;
+import com.navinfo.outdoor.api.Constant;
+import com.navinfo.outdoor.base.BaseActivity;
+
+import com.navinfo.outdoor.util.SdkFolderCreate;
+import com.navinfo.outdoor.util.ToastUtil;
+import com.otaliastudios.cameraview.CameraException;
+import com.otaliastudios.cameraview.CameraListener;
+import com.otaliastudios.cameraview.CameraLogger;
+
+import com.otaliastudios.cameraview.CameraView;
+import com.otaliastudios.cameraview.FileCallback;
+import com.otaliastudios.cameraview.PictureResult;
+import com.otaliastudios.cameraview.VideoResult;
+import com.otaliastudios.cameraview.controls.Mode;
+
+import com.otaliastudios.cameraview.size.AspectRatio;
+import com.otaliastudios.cameraview.size.SizeSelectors;
+import com.tencent.map.geolocation.TencentLocation;
+import com.tencent.map.geolocation.TencentLocationListener;
+import com.tencent.map.geolocation.TencentLocationManager;
+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.model.BitmapDescriptor;
+import com.tencent.tencentmap.mapsdk.maps.model.BitmapDescriptorFactory;
+import com.tencent.tencentmap.mapsdk.maps.model.MyLocationStyle;
+
+
+import org.greenrobot.eventbus.EventBus;
+import org.greenrobot.eventbus.Subscribe;
+import org.greenrobot.eventbus.ThreadMode;
+import org.jetbrains.annotations.NotNull;
+
+import java.io.File;
+import java.io.FileDescriptor;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.List;
+
+
+public class PictureActivity extends BaseActivity implements View.OnClickListener, LocationSource, TencentLocationListener {
+ private static final CameraLogger LOG = CameraLogger.create("Picture");
+ private CameraView camera;
+ private ImageButton capturePicture;
+ private long captureTime = 0;
+ private android.widget.Button btnSwitch;
+ private android.widget.ImageView ivPic;
+ private boolean USE_FRAME_PROCESSOR = false;
+ private boolean DECODE_BITMAP = false;
+ private TencentMap tencentMap;
+ private TencentLocationManager locationManager;
+ private TencentLocationRequest locationRequest;
+ private MyLocationStyle locationStyle;
+ private OnLocationChangedListener locationChangedListener;
+ private MapView ivMap;
+ private ImageButton captureVideo;
+ private Button btnVideo;
+
+ @Override
+ protected int getLayout() {
+ return R.layout.activity_camera;
+ }
+
+ @Override
+ protected void initView() {
+ super.initView();
+
+ this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
+ ivMap = (MapView) findViewById(R.id.iv_map);
+ btnVideo = findViewById(R.id.btn_video);
+ 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);
+ CameraLogger.setLogLevel(CameraLogger.LEVEL_VERBOSE);
+ camera = findViewById(R.id.camera);
+ camera.setOnClickListener(this::onClick);
+ captureVideo = findViewById(R.id.captureVideo);
+ captureVideo.setOnClickListener(this::onClick);
+
+
+ camera.setLifecycleOwner(this);
+
+ //设置拍照的宽高
+ //camera.setVideoSize(SizeSelectors.or(SizeSelectors.maxHeight(1000), SizeSelectors.smallest(), SizeSelectors.aspectRatio(AspectRatio.of(1, 1), 0)));
+
+// Intent intent = getIntent();
+// String pic = intent.getStringExtra("pic");
+// camera.setVideoSize(SizeSelectors.or(SizeSelectors.maxHeight(Integer.parseInt(pic)),SizeSelectors.aspectRatio(AspectRatio.of(1, 1), 0)));
+
+ SdkFolderCreate.mkdirs(Constant.PICTURE_FOLDER);
+
+//相机预览监听
+ camera.addCameraListener(new CameraListener() {
+ @Override
+ public void onPictureTaken(@NonNull @NotNull PictureResult result) {
+ super.onPictureTaken(result);
+ DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+ Calendar calendar = Calendar.getInstance();
+ calendar.setTimeInMillis(System.currentTimeMillis());
+ 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) {
+ Toast.makeText(PictureActivity.this, "保存成功:" + file.getPath(), Toast.LENGTH_SHORT).show();
+ }
+ });
+ if (camera.isTakingVideo()) {
+ message("Captured while taking video. Size=" + result.getSize(), false);
+ }
+ long callbackTime = System.currentTimeMillis();
+ captureTime = callbackTime - 300;
+ Log.d("captureTime", captureTime + "");
+//
+
+ }
+
+ //录像监听
+ @Override
+ public void onVideoTaken(@NonNull @NotNull VideoResult result) {
+ super.onVideoTaken(result);
+ Toast.makeText(PictureActivity.this, "停止摄像", Toast.LENGTH_SHORT).show();
+ finish();
+// DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+// Calendar calendar = Calendar.getInstance();
+// calendar.setTimeInMillis(System.currentTimeMillis());
+// String format = formatter.format(calendar.getTime());
+ //文件
+// File file = new File(Constant.PICTURE_FOLDER, format + ".mp4");
+// camera.takeVideo(file,5000);
+// VideoPreviewActivity.Companion.setVideoResult(result);
+// Intent videoIntent = new Intent(PictureActivity.this, VideoPreviewActivity.class);
+// startActivity(videoIntent);
+ }
+
+ @Override
+ public void onCameraError(@NonNull @NotNull CameraException exception) {
+ super.onCameraError(exception);
+ Toast.makeText(PictureActivity.this, exception.toString(), Toast.LENGTH_SHORT).show();
+ }
+
+ });
+ }
+
+ private void message(String content, Boolean important) {
+ if (important) {
+ LOG.w(content);
+ Toast.makeText(this, content, Toast.LENGTH_SHORT).show();
+ } else {
+ LOG.i(content);
+ Toast.makeText(this, content, Toast.LENGTH_SHORT).show();
+ }
+ }
+
+
+ @Override
+ protected void initData() {
+ super.initData();
+
+ camera.setMode(Mode.VIDEO);
+ }
+
+
+ @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.btn_video:
+ // camera.stopVideo();
+ break;
+ case R.id.btn_switch:
+ btnSwich();
+ break;
+ case R.id.captureVideo:
+ Intent intent = getIntent();
+ String pic = intent.getStringExtra("pic");
+ Log.d("lllllllllll", pic + "");
+ if (pic!=null){
+ camera.setVideoSize(SizeSelectors.or(SizeSelectors.maxHeight(Integer.parseInt(pic))));
+ }
+ DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+ Calendar calendar = Calendar.getInstance();
+ calendar.setTimeInMillis(System.currentTimeMillis());
+ String format = formatter.format(calendar.getTime());
+ //文件
+ File file = new File(Constant.PICTURE_FOLDER, format + ".mp4");
+ camera.takeVideo(file, 15000);
+
+
+ break;
+
+
+ }
+ }
+
+ /**
+ * 定位的一些初始化设置
+ */
+ private void initLocation() {
+//用于访问腾讯定位服务的类, 周期性向客户端提供位置更新
+ locationManager = TencentLocationManager.getInstance(this);
+ //设置坐标系
+ locationManager.setCoordinateType(TencentLocationManager.COORDINATE_TYPE_GCJ02);
+ //创建定位请求
+ locationRequest = TencentLocationRequest.create();
+ //设置定位周期(位置监听器回调周期)为3s
+ // locationRequest.setInterval(3000);
+ //地图上设置定位数据源
+ tencentMap.setLocationSource(this);
+ //设置当前位置可见
+ tencentMap.setMyLocationEnabled(true);
+ //设置定位图标样式
+ setLocMarkerStyle();
+// locationStyle = locationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATION_ROTATE);
+ tencentMap.setMyLocationStyle(locationStyle);
+ }
+
+ private Bitmap getBitMap(int resourceId) {
+ Bitmap bitmap = BitmapFactory.decodeResource(getResources(), resourceId);
+ int width = bitmap.getWidth();
+ int height = bitmap.getHeight();
+ int newWidth = 55;
+ int newHeight = 55;
+ float widthScale = ((float) newWidth) / width;
+ float heightScale = ((float) newHeight) / height;
+ Matrix matrix = new Matrix();
+ matrix.postScale(widthScale, heightScale);
+ bitmap = Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true);
+ return bitmap;
+ }
+
+ /**
+ * 设置定位图标样式
+ */
+ private void setLocMarkerStyle() {
+ locationStyle = new MyLocationStyle();
+ //创建图标
+ BitmapDescriptor bitmapDescriptor = BitmapDescriptorFactory.fromBitmap(getBitMap(R.drawable.location));
+ locationStyle.icon(bitmapDescriptor);
+ //设置定位圆形区域的边框宽度;
+ locationStyle.strokeWidth(1);
+ //设置圆区域的颜色
+ // locationStyle.fillColor(R.color.colormap);
+ // locationStyle.anchor(1000,2000);
+ tencentMap.setMyLocationStyle(locationStyle);
+ }
+
+
+ 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) {
+ 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(layoutParams1);
+ ivMap.setLayoutParams(layoutParams);
+ }
+ }
+
+
+ @Override
+ protected void onResume() {
+
+ super.onResume();
+ camera.open();
+ }
+
+ @Override
+ protected void onPause() {
+ super.onPause();
+ camera.close();
+ }
+
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+ camera.destroy();
+
+ }
+
+ @Override
+ public void activate(OnLocationChangedListener onLocationChangedListener) {
+ locationChangedListener = onLocationChangedListener;
+ int err = locationManager.requestLocationUpdates(locationRequest, this, Looper.myLooper());
+ switch (err) {
+ case 1:
+ ToastUtil.showShort(this, Constant.GET_ERR_MESSAGE1);
+ break;
+ case 2:
+ ToastUtil.showShort(this, Constant.GET_ERR_MESSAGE2);
+ break;
+ case 3:
+ ToastUtil.showShort(this, Constant.GET_ERR_MESSAGE3);
+ break;
+ default:
+ break;
+ }
+ }
+
+ @Override
+ public void deactivate() {
+ locationManager.removeUpdates(this);
+ locationManager = null;
+ locationRequest = null;
+ locationChangedListener = null;
+ }
+
+ @Override
+ public void onLocationChanged(TencentLocation tencentLocation, int i, String s) {
+ if (i == TencentLocation.ERROR_OK && locationChangedListener != null) {
+ Location location = new Location(tencentLocation.getProvider());
+ //设置经纬度以及精度
+ location.setLatitude(tencentLocation.getLatitude());
+ location.setLongitude(tencentLocation.getLongitude());
+ location.setAccuracy(tencentLocation.getAccuracy());
+ locationChangedListener.onLocationChanged(location);
+ Constant.currentLocation = tencentLocation;
+ //显示回调的实时位置信息
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ //打印tencentLocation的json字符串
+// Toast.makeText(getApplicationContext(), new Gson().toJson(location), Toast.LENGTH_LONG).show();
+ }
+ });
+ }
+ }
+
+ @Override
+ public void onStatusUpdate(String s, int i, String s1) {
+ Log.v("State changed", s + "===" + s1);
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/navinfo/outdoor/activity/camer/MyCamerActivity.kt b/app/src/main/java/com/navinfo/outdoor/activity/camer/MyCamerActivity.kt
new file mode 100644
index 0000000..f1ac3a6
--- /dev/null
+++ b/app/src/main/java/com/navinfo/outdoor/activity/camer/MyCamerActivity.kt
@@ -0,0 +1,430 @@
+package com.navinfo.outdoor.activity.camer
+
+import android.animation.ValueAnimator
+import android.content.Intent
+import android.content.pm.ActivityInfo
+import android.content.pm.PackageManager
+import android.graphics.*
+import android.os.Bundle
+import android.view.View
+import android.view.ViewGroup
+import android.widget.ImageButton
+import android.widget.ImageView
+import android.widget.Toast
+import androidx.appcompat.app.AppCompatActivity
+import com.google.android.material.bottomsheet.BottomSheetBehavior
+import com.navinfo.outdoor.R
+import com.otaliastudios.cameraview.*
+import com.otaliastudios.cameraview.controls.Facing
+import com.otaliastudios.cameraview.controls.Mode
+import com.otaliastudios.cameraview.controls.Preview
+import com.otaliastudios.cameraview.filter.Filters
+import com.otaliastudios.cameraview.frame.Frame
+import com.otaliastudios.cameraview.frame.FrameProcessor
+import com.tencent.map.geolocation.TencentLocationManager
+import com.tencent.map.geolocation.TencentLocationRequest
+import com.tencent.tencentmap.mapsdk.maps.TencentMap
+import com.tencent.tencentmap.mapsdk.maps.model.MyLocationStyle
+import kotlinx.android.synthetic.main.activity_camera.*
+import kotlinx.android.synthetic.main.activity_my_camer.*
+import kotlinx.android.synthetic.main.activity_my_camer.capturePicture
+import kotlinx.android.synthetic.main.activity_my_camer.capturePictureSnapshot
+import java.io.ByteArrayOutputStream
+import java.io.File
+
+class MyCamerActivity : AppCompatActivity(), View.OnClickListener, OptionView.Callback {
+
+ companion object {
+ private val LOG = CameraLogger.create("DemoApp")
+ private const val USE_FRAME_PROCESSOR = false
+ private const val DECODE_BITMAP = false
+ }
+
+ private var locationManager: TencentLocationManager? = null
+ private var locationRequest: TencentLocationRequest? = null
+ private val tencentMap: TencentMap? = null
+ private var locationStyle: MyLocationStyle? = null
+ private val camera: CameraView by lazy { findViewById(R.id.camera) }
+ private val edit : ImageButton by lazy { findViewById(R.id.edit) }
+ private val ivmap: ImageView by lazy { findViewById(R.id.iv_map) }
+ // private val ivmap: MapView by lazy { findViewById(R.id.iv_map) }
+
+ private val controlPanel: ViewGroup by lazy { findViewById(R.id.controls) }
+ private var captureTime: Long = 0
+
+ private var currentFilter = 0
+ private val allFilters = Filters.values()
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.activity_camera)
+ CameraLogger.setLogLevel(CameraLogger.LEVEL_VERBOSE)
+ camera.setLifecycleOwner(this)
+ camera.addCameraListener(Listener())
+ if (USE_FRAME_PROCESSOR) {
+ camera.addFrameProcessor(object : FrameProcessor {
+ private var lastTime = System.currentTimeMillis()
+ override fun process(frame: Frame) {
+ val newTime = frame.time
+ val delay = newTime - lastTime
+ lastTime = newTime
+ LOG.v("Frame delayMillis:", delay, "FPS:", 1000 / delay)
+ if (DECODE_BITMAP) {
+ if (frame.format == ImageFormat.NV21
+ && frame.dataClass == ByteArray::class.java) {
+ val data = frame.getData()
+ val yuvImage = YuvImage(data,
+ frame.format,
+ frame.size.width,
+ frame.size.height,
+ null)
+ val jpegStream = ByteArrayOutputStream()
+ yuvImage.compressToJpeg(Rect(0, 0,
+ frame.size.width,
+ frame.size.height), 100, jpegStream)
+ val jpegByteArray = jpegStream.toByteArray()
+ val bitmap = BitmapFactory.decodeByteArray(jpegByteArray,
+ 0, jpegByteArray.size)
+ bitmap.toString()
+ }
+ }
+ }
+ })
+ }
+ edit.setOnClickListener(this)
+ capturePicture.setOnClickListener(this)
+ capturePictureSnapshot.setOnClickListener(this)
+ btn_switch.setOnClickListener(this)
+ // captureVideo.setOnClickListener(this)
+ // captureVideoSnapshot.setOnClickListener(this)
+ // toggleCamera.setOnClickListener(this)
+
+ val group = controlPanel.getChildAt(0) as ViewGroup
+ // val watermark = findViewById( R.id.watermark)
+ val options: List