From 506299b3a3d049a14901b9b3253a4d79b76e7746 Mon Sep 17 00:00:00 2001 From: xiaoyan Date: Fri, 17 Mar 2023 13:55:52 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E7=BB=98=E5=88=B6?= =?UTF-8?q?=E8=BE=85=E5=8A=A9=E7=BA=BF=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 4 +- .../outdoor/activity/HomeActivity.java | 8 ++ .../outdoor/activity/MainActivity.java | 6 +- .../outdoor/activity/PicturesActivity.java | 35 ++++---- .../outdoor/activity/RXPicturesActivity.kt | 42 +++++++++ .../outdoor/base/BaseViewBindingActivity.kt | 84 +++++++++++++++++ .../outdoor/fragment/PoiVideoFragment.java | 6 -- .../outdoor/fragment/RoadFragment.java | 8 -- .../outdoor/util/LocationLifeCycle.java | 6 ++ .../outdoor/util/SensorOritationLifecycle.kt | 90 +++++++++++++++++++ .../outdoor/viewmodel/RxPicturesViewModel.kt | 42 +++++++++ app/src/main/res/layout/activity_home.xml | 6 ++ app/src/main/res/layout/activity_pictures.xml | 8 +- 13 files changed, 307 insertions(+), 38 deletions(-) create mode 100644 app/src/main/java/com/navinfo/outdoor/activity/RXPicturesActivity.kt create mode 100644 app/src/main/java/com/navinfo/outdoor/base/BaseViewBindingActivity.kt create mode 100644 app/src/main/java/com/navinfo/outdoor/util/SensorOritationLifecycle.kt create mode 100644 app/src/main/java/com/navinfo/outdoor/viewmodel/RxPicturesViewModel.kt diff --git a/app/build.gradle b/app/build.gradle index 3b4f3bb..fbfd8fa 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -17,8 +17,8 @@ android { applicationId "com.navinfo.outdoor" minSdkVersion 24 targetSdkVersion 30 - versionCode 47 - versionName "8.230223" + versionCode 48 + versionName "8.230309" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" ndk { diff --git a/app/src/main/java/com/navinfo/outdoor/activity/HomeActivity.java b/app/src/main/java/com/navinfo/outdoor/activity/HomeActivity.java index de25e42..fe52099 100644 --- a/app/src/main/java/com/navinfo/outdoor/activity/HomeActivity.java +++ b/app/src/main/java/com/navinfo/outdoor/activity/HomeActivity.java @@ -1,5 +1,6 @@ package com.navinfo.outdoor.activity; +import com.elvishew.xlog.XLog; import com.github.lazylibrary.util.ShellUtils; import com.google.gson.Gson; import com.kongzue.dialog.interfaces.OnDialogButtonClickListener; @@ -34,12 +35,17 @@ import android.content.Intent; import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; +import android.hardware.Sensor; +import android.hardware.SensorEvent; +import android.hardware.SensorEventListener; +import android.hardware.SensorManager; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.provider.Settings; import android.util.Log; import android.view.View; +import android.widget.TextView; import android.widget.Toast; import com.navinfo.outdoor.R; @@ -109,11 +115,13 @@ public class HomeActivity extends BaseActivity { // 注册位置更新的lifeCycle getLifecycle().addObserver(LocationLifeCycle.getInstance()); + } else { finish(); } } + @Override public void onStart() { super.onStart(); 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 5905c5e..a0eaf29 100644 --- a/app/src/main/java/com/navinfo/outdoor/activity/MainActivity.java +++ b/app/src/main/java/com/navinfo/outdoor/activity/MainActivity.java @@ -6,6 +6,10 @@ import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; +import android.hardware.Sensor; +import android.hardware.SensorEvent; +import android.hardware.SensorEventListener; +import android.hardware.SensorManager; import android.net.Uri; import android.os.Build; import android.os.CountDownTimer; @@ -19,6 +23,7 @@ import android.widget.Toast; import androidx.annotation.NonNull; import androidx.appcompat.app.AlertDialog; import androidx.core.content.FileProvider; +import androidx.lifecycle.LifecycleOwner; import androidx.lifecycle.ProcessLifecycleOwner; import com.elvishew.xlog.LogConfiguration; @@ -68,7 +73,6 @@ import java.util.List; * 以及自启动 (获取token 获取用户信息) */ public class MainActivity extends BaseActivity { - private Handler handler = new Handler(new Handler.Callback() { @Override public boolean handleMessage(@NonNull Message msg) { diff --git a/app/src/main/java/com/navinfo/outdoor/activity/PicturesActivity.java b/app/src/main/java/com/navinfo/outdoor/activity/PicturesActivity.java index d956fd5..1f45986 100644 --- a/app/src/main/java/com/navinfo/outdoor/activity/PicturesActivity.java +++ b/app/src/main/java/com/navinfo/outdoor/activity/PicturesActivity.java @@ -9,17 +9,13 @@ import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Color; import android.graphics.Matrix; -import android.location.Location; import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.util.DisplayMetrics; -import android.util.Log; import android.view.View; import android.view.ViewGroup; -import android.view.Window; -import android.view.WindowManager; import android.widget.Button; import android.widget.CheckBox; import android.widget.CompoundButton; @@ -28,7 +24,6 @@ import android.widget.ImageView; import android.widget.RadioButton; import android.widget.RadioGroup; import android.widget.TextView; -import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -43,16 +38,13 @@ import com.navinfo.outdoor.R; import com.navinfo.outdoor.api.Constant; import com.navinfo.outdoor.api.UserApplication; import com.navinfo.outdoor.base.BaseActivity; -import com.navinfo.outdoor.room.PoiEntity; -import com.navinfo.outdoor.util.AWMp4ParserHelper; -import com.navinfo.outdoor.util.BackHandlerHelper; import com.navinfo.outdoor.util.GPSUtils; import com.navinfo.outdoor.util.Geohash; import com.navinfo.outdoor.util.GeometryTools; -import com.navinfo.outdoor.util.Gps; import com.navinfo.outdoor.util.LocationLifeCycle; import com.navinfo.outdoor.util.MyLocation; import com.navinfo.outdoor.util.MyTecentLocationSource; +import com.navinfo.outdoor.util.SensorOritationLifecycle; import com.navinfo.outdoor.util.SystemTTS; import com.navinfo.outdoor.util.TimestampUtil; import com.navinfo.outdoor.util.ToastUtils; @@ -64,10 +56,8 @@ import com.otaliastudios.cameraview.FileCallback; import com.otaliastudios.cameraview.PictureResult; import com.otaliastudios.cameraview.controls.Mode; import com.otaliastudios.cameraview.size.AspectRatio; -import com.otaliastudios.cameraview.size.Size; import com.otaliastudios.cameraview.size.SizeSelector; import com.otaliastudios.cameraview.size.SizeSelectors; -import com.tencent.map.geolocation.TencentLocation; import com.tencent.tencentmap.mapsdk.maps.CameraUpdate; import com.tencent.tencentmap.mapsdk.maps.CameraUpdateFactory; import com.tencent.tencentmap.mapsdk.maps.TencentMap; @@ -92,26 +82,19 @@ import org.locationtech.jts.geom.MultiLineString; import com.wanghong.webpnative.WebPNative; import org.greenrobot.eventbus.EventBus; -import org.greenrobot.eventbus.Subscribe; -import org.greenrobot.eventbus.ThreadMode; import java.io.File; -import java.io.IOException; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; -import java.util.Calendar; import java.util.Date; import java.util.List; import java.util.Objects; import java.util.Timer; import java.util.TimerTask; -import java.util.concurrent.Callable; -import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; import static com.tencent.tencentmap.mapsdk.maps.model.MyLocationStyle.LOCATION_TYPE_LOCATION_ROTATE; -import static com.tencent.tencentmap.mapsdk.maps.model.MyLocationStyle.LOCATION_TYPE_LOCATION_ROTATE_NO_CENTER; import io.reactivex.Observable; import io.reactivex.ObservableEmitter; @@ -119,8 +102,6 @@ import io.reactivex.ObservableOnSubscribe; import io.reactivex.Observer; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.Disposable; -import io.reactivex.functions.Action; -import io.reactivex.functions.Consumer; import io.reactivex.schedulers.Schedulers; /** @@ -159,6 +140,8 @@ public class PicturesActivity extends BaseActivity implements View.OnClickListen private static int BRIGHTNESS=40, FRAMENESS=30; @SuppressLint("SimpleDateFormat") private SimpleDateFormat formatter; + private SensorOritationLifecycle sensorOritationLifecycle; + private TextView tvDegrees; private Handler handler = new Handler(new Handler.Callback() { @Override public boolean handleMessage(@NonNull Message msg) { @@ -194,6 +177,14 @@ public class PicturesActivity extends BaseActivity implements View.OnClickListen // 设置当前界面亮度为40% setWindowBrightness(BRIGHTNESS); LocationLifeCycle.getInstance().startGPSLocation(); + sensorOritationLifecycle = new SensorOritationLifecycle(this); + getLifecycle().addObserver(sensorOritationLifecycle); + sensorOritationLifecycle.setDegreesChangeListener(new SensorOritationLifecycle.DegreesChangeListener() { + @Override + public void onDegreesChangeListener(float xDegree, float yDegree, float zDegree) { + tvDegrees.setText("x:"+xDegree+"\ny:"+yDegree+"\nz:"+zDegree); + } + }); } @Override @@ -206,6 +197,7 @@ public class PicturesActivity extends BaseActivity implements View.OnClickListen @Override protected void initView() { super.initView(); + tvDegrees = findViewById(R.id.tv_degrees); if (getIntent() != null) { finalVideoPath = getIntent().getStringExtra(Constant.INTENT_JPG_PATH); type = getIntent().getIntExtra(Constant.INTENT_TYPE, 0); @@ -914,6 +906,9 @@ public class PicturesActivity extends BaseActivity implements View.OnClickListen // 退出后切换主定位模式为腾讯定位 LocationLifeCycle.getInstance().setMainLocationFrom(LocationLifeCycle.LOCATION_FROM.TENCENT); LocationLifeCycle.getInstance().stopGPSLocation(); + if (sensorOritationLifecycle!=null) { + getLifecycle().removeObserver(sensorOritationLifecycle); + } } // @Subscribe(threadMode = ThreadMode.MAIN) diff --git a/app/src/main/java/com/navinfo/outdoor/activity/RXPicturesActivity.kt b/app/src/main/java/com/navinfo/outdoor/activity/RXPicturesActivity.kt new file mode 100644 index 0000000..0fa8c32 --- /dev/null +++ b/app/src/main/java/com/navinfo/outdoor/activity/RXPicturesActivity.kt @@ -0,0 +1,42 @@ +package com.navinfo.outdoor.activity + +import android.os.Bundle +import android.view.View +import android.view.View.OnClickListener +import androidx.lifecycle.ViewModelProvider +import com.navinfo.outdoor.base.BaseViewBindingActivity +import com.navinfo.outdoor.databinding.ActivityPicturesBinding +import com.navinfo.outdoor.util.LocationLifeCycle +import com.navinfo.outdoor.util.SensorOritationLifecycle +import com.navinfo.outdoor.util.SensorOritationLifecycle.DegreesChangeListener +import com.navinfo.outdoor.viewmodel.RxPicturesViewModel + +class RXPicturesActivity: BaseViewBindingActivity(), OnClickListener { + private lateinit var binding: ActivityPicturesBinding + private lateinit var viewModel: RxPicturesViewModel + + private val sensorOritationLifecycle: SensorOritationLifecycle by lazy { SensorOritationLifecycle(this) } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = ActivityPicturesBinding.inflate(layoutInflater) + setContentView(binding.root) + binding.camera.snapshotMaxWidth = 1920 + binding.camera.snapshotMaxHeight = 1440 + binding.camera.setOnClickListener(this) + viewModel = ViewModelProvider(this).get(RxPicturesViewModel::class.java) + + LocationLifeCycle.getInstance().startGPSLocation() + lifecycle.addObserver(sensorOritationLifecycle) + sensorOritationLifecycle.degreesChangeListener = object : DegreesChangeListener { + override fun onDegreesChangeListener(xDegree: Float, yDegree: Float, zDegree: Float) { + binding.tvDegrees.text = "x:$xDegree\ny:$yDegree\nz:$zDegree" + } + } + } + + + override fun onClick(p0: View?) { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/outdoor/base/BaseViewBindingActivity.kt b/app/src/main/java/com/navinfo/outdoor/base/BaseViewBindingActivity.kt new file mode 100644 index 0000000..e6a2c74 --- /dev/null +++ b/app/src/main/java/com/navinfo/outdoor/base/BaseViewBindingActivity.kt @@ -0,0 +1,84 @@ +package com.navinfo.outdoor.base + +import android.content.DialogInterface +import android.content.Intent +import android.graphics.drawable.ColorDrawable +import android.os.Bundle +import android.provider.Settings +import android.view.KeyEvent +import android.view.LayoutInflater +import android.view.View +import android.widget.TextView +import androidx.appcompat.app.AlertDialog +import androidx.appcompat.app.AppCompatActivity +import com.github.lazylibrary.util.StringUtils +import com.gyf.immersionbar.ImmersionBar +import com.navinfo.outdoor.R +import org.greenrobot.eventbus.EventBus +import org.greenrobot.eventbus.Subscribe + +open class BaseViewBindingActivity: AppCompatActivity() { + private var alertDialog: AlertDialog? = null + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + // setScreenRoate(true); + //初始化,默认透明状态栏和黑色导航栏 + ImmersionBar.with(this).init() + Collector.addActivity(this) + if (!EventBus.getDefault().isRegistered(this)) { + EventBus.getDefault().register(this) + } + } + + fun showLoadingDialog() { + showLoadingDialog(null) + } + + fun showLoadingDialog(msg: String?) { + alertDialog?.dismiss() + alertDialog = AlertDialog.Builder(this).create() + alertDialog!!.window?.setBackgroundDrawable(ColorDrawable()) + alertDialog!!.setCancelable(false) + alertDialog!!.setOnKeyListener(DialogInterface.OnKeyListener { dialog: DialogInterface?, keyCode: Int, event: KeyEvent? -> keyCode == KeyEvent.KEYCODE_SEARCH || keyCode == KeyEvent.KEYCODE_BACK }) + //loading样式 + val view: View = LayoutInflater.from(this).inflate(R.layout.loading, null) + val tv = view.findViewById(R.id.progressBar_tx) + if (!StringUtils.isBlank(msg)) { + tv.text = msg + } + alertDialog!!.setView(view) + alertDialog!!.setCanceledOnTouchOutside(false) + alertDialog!!.show() + } + + fun setLoadingDialogText(s: String?) { + //给loading 添加文字 + val view = alertDialog!!.findViewById(R.id.progressBar_tx) + view!!.text = s + } + + fun dismissLoadingDialog() { + if (null != alertDialog && alertDialog!!.isShowing()) { + alertDialog!!.dismiss() + } + } + + override fun onDestroy() { + super.onDestroy() + dismissLoadingDialog() + Collector.removeActivity(this) + if (EventBus.getDefault().isRegistered(this)) { + EventBus.getDefault().unregister(this) + } + } + + @Subscribe(sticky = true) + open fun onEventMainThrean(data: Map) { + if (data["code"] === "101") { + // 返回开启GPS导航设置界面 + val intent = Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS) + startActivityForResult(intent, 0) + } + } +} \ No newline at end of file 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 2a27aed..5dd2c9a 100644 --- a/app/src/main/java/com/navinfo/outdoor/fragment/PoiVideoFragment.java +++ b/app/src/main/java/com/navinfo/outdoor/fragment/PoiVideoFragment.java @@ -24,7 +24,6 @@ import androidx.core.widget.NestedScrollView; import com.bumptech.glide.Glide; import com.github.lazylibrary.util.FileUtils; import com.github.lazylibrary.util.StringUtils; -import com.github.lazylibrary.util.ZipUtil; import com.google.gson.Gson; import com.hjq.permissions.OnPermissionCallback; import com.hjq.permissions.Permission; @@ -40,7 +39,6 @@ import com.navinfo.outdoor.activity.FragmentManagement; import com.navinfo.outdoor.activity.PicturesActivity; import com.navinfo.outdoor.api.Constant; import com.navinfo.outdoor.base.BaseDrawerFragment; -import com.navinfo.outdoor.bean.OtherUploadPicBean; import com.navinfo.outdoor.bean.PoiVideoBean; import com.navinfo.outdoor.bean.UnPolygonTaskBean; import com.navinfo.outdoor.http.Callback; @@ -48,7 +46,6 @@ import com.navinfo.outdoor.http.HttpInterface; import com.navinfo.outdoor.http.OkGoBuilder; import com.navinfo.outdoor.room.ChargingPileEntity; import com.navinfo.outdoor.room.InsertAndUpdateUtils; -import com.navinfo.outdoor.room.PoiDao; import com.navinfo.outdoor.room.PoiDatabase; import com.navinfo.outdoor.room.PoiEntity; import com.navinfo.outdoor.util.AWMp4ParserHelper; @@ -61,8 +58,6 @@ import com.navinfo.outdoor.util.PoiSaveUtils; import com.navinfo.outdoor.util.PreserveUtils; import com.navinfo.outdoor.util.TimestampUtil; import com.navinfo.outdoor.util.ToastUtils; -import com.navinfo.outdoor.util.UploadUtils; -import com.navinfo.outdoor.util.ZipUtils; import com.sothree.slidinguppanel.SlidingUpPanelLayout; import com.tencent.tencentmap.mapsdk.maps.model.BitmapDescriptor; import com.tencent.tencentmap.mapsdk.maps.model.BitmapDescriptorFactory; @@ -80,7 +75,6 @@ import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.List; -import java.util.Objects; /** * 寻宝-上报弹窗-poi录像 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 6574e4a..7aeab3b 100644 --- a/app/src/main/java/com/navinfo/outdoor/fragment/RoadFragment.java +++ b/app/src/main/java/com/navinfo/outdoor/fragment/RoadFragment.java @@ -26,7 +26,6 @@ import androidx.core.widget.NestedScrollView; import com.bumptech.glide.Glide; import com.github.lazylibrary.util.FileUtils; import com.github.lazylibrary.util.StringUtils; -import com.github.lazylibrary.util.ZipUtil; import com.google.gson.Gson; import com.hjq.permissions.OnPermissionCallback; import com.hjq.permissions.Permission; @@ -34,12 +33,10 @@ import com.hjq.permissions.XXPermissions; import com.kongzue.dialog.interfaces.OnDialogButtonClickListener; import com.kongzue.dialog.util.BaseDialog; import com.kongzue.dialog.util.DialogSettings; -import com.kongzue.dialog.v3.CustomDialog; import com.kongzue.dialog.v3.MessageDialog; import com.kongzue.dialog.v3.WaitDialog; import com.lzy.okgo.model.HttpParams; import com.navinfo.outdoor.R; -import com.navinfo.outdoor.activity.AutoTakePictureActivity; import com.navinfo.outdoor.activity.FragmentManagement; import com.navinfo.outdoor.activity.PicturesActivity; import com.navinfo.outdoor.api.Constant; @@ -51,8 +48,6 @@ import com.navinfo.outdoor.util.PoiSaveUtils; import com.navinfo.outdoor.util.PreserveUtils; import com.navinfo.outdoor.util.TimestampUtil; import com.navinfo.outdoor.util.ToastUtils; -import com.navinfo.outdoor.util.UploadUtils; -import com.navinfo.outdoor.bean.OtherUploadPicBean; import com.navinfo.outdoor.bean.RoadSaveBean; import com.navinfo.outdoor.bean.UnPolygonTaskBean; import com.navinfo.outdoor.http.Callback; @@ -60,13 +55,11 @@ import com.navinfo.outdoor.http.HttpInterface; import com.navinfo.outdoor.http.OkGoBuilder; import com.navinfo.outdoor.room.ChargingPileEntity; import com.navinfo.outdoor.room.InsertAndUpdateUtils; -import com.navinfo.outdoor.room.PoiDao; import com.navinfo.outdoor.room.PoiDatabase; import com.navinfo.outdoor.room.PoiEntity; import com.navinfo.outdoor.util.AWMp4ParserHelper; import com.navinfo.outdoor.util.Geohash; import com.navinfo.outdoor.util.GeometryTools; -import com.navinfo.outdoor.util.ZipUtils; import com.sothree.slidinguppanel.SlidingUpPanelLayout; import com.tencent.tencentmap.mapsdk.maps.model.BitmapDescriptor; import com.tencent.tencentmap.mapsdk.maps.model.BitmapDescriptorFactory; @@ -85,7 +78,6 @@ import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.List; -import java.util.Objects; /* * 寻宝-点击上传弹窗-道路 diff --git a/app/src/main/java/com/navinfo/outdoor/util/LocationLifeCycle.java b/app/src/main/java/com/navinfo/outdoor/util/LocationLifeCycle.java index ccfecff..a38f795 100644 --- a/app/src/main/java/com/navinfo/outdoor/util/LocationLifeCycle.java +++ b/app/src/main/java/com/navinfo/outdoor/util/LocationLifeCycle.java @@ -3,6 +3,7 @@ package com.navinfo.outdoor.util; import android.content.Context; import android.location.Location; import android.os.Message; +import android.util.Log; import androidx.annotation.NonNull; import androidx.lifecycle.DefaultLifecycleObserver; @@ -90,6 +91,11 @@ public class LocationLifeCycle implements DefaultLifecycleObserver { } } else if (msg.arg1 == LOCATION_FROM.TENCENT.ordinal()) { tencentLocation = (TencentLocation) msg.obj; +// Log.d("LocationLifeCycle", +// "isMockGps:"+tencentLocation.isMockGps() +// +",FakeReason:"+tencentLocation.getFakeReason() +// +"Provider:"+tencentLocation.getProvider() +// +"SourceProvider:"+tencentLocation.getSourceProvider()+tencentLocation.getGpsQuality()); if (msg.arg1 == mainLocationFrom.ordinal()) { // 如果当前定位方式是主要定位方式 MyLocation location = new MyLocation(tencentLocation.getProvider(), tencentLocation); //设置经纬度以及精度 diff --git a/app/src/main/java/com/navinfo/outdoor/util/SensorOritationLifecycle.kt b/app/src/main/java/com/navinfo/outdoor/util/SensorOritationLifecycle.kt new file mode 100644 index 0000000..8cfa9ec --- /dev/null +++ b/app/src/main/java/com/navinfo/outdoor/util/SensorOritationLifecycle.kt @@ -0,0 +1,90 @@ +package com.navinfo.outdoor.util + +import android.content.Context +import android.hardware.Sensor +import android.hardware.SensorEvent +import android.hardware.SensorEventListener +import android.hardware.SensorManager +import androidx.lifecycle.DefaultLifecycleObserver +import androidx.lifecycle.LifecycleOwner + +class SensorOritationLifecycle(val context: Context): DefaultLifecycleObserver { + private var sensorManager: SensorManager? = null + private var accelerometer: Sensor? = null + private var magnetic :android.hardware.Sensor? = null + private var seneorListener: SensorEventListener? = null + private var accelerometerValues = FloatArray(3) + private var magneticFieldValues = FloatArray(3) + var zDegree: Float = 0f + var xDegree: Float = 0f + var yDegree: Float = 0f + var degreesChangeListener: DegreesChangeListener? = null + + override fun onCreate(owner: LifecycleOwner) { + super.onCreate(owner) + /** + * 初始化传感器 + * */ + /** + * 初始化传感器 + */ + seneorListener = object : SensorEventListener { + override fun onSensorChanged(sensorEvent: SensorEvent) { + // 获取角度信息 + if (sensorEvent.sensor.type == Sensor.TYPE_ACCELEROMETER) { + accelerometerValues = sensorEvent.values + } + if (sensorEvent.sensor.type == Sensor.TYPE_MAGNETIC_FIELD) { + magneticFieldValues = sensorEvent.values + } + calculateOrientation() + } + + override fun onAccuracyChanged(sensor: Sensor, i: Int) {} + } + + sensorManager = context.getSystemService(Context.SENSOR_SERVICE) as SensorManager + if (sensorManager!=null) { + with(sensorManager!!) { + accelerometer = getDefaultSensor(Sensor.TYPE_ACCELEROMETER) + magnetic = getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD) + registerListener( + seneorListener, + accelerometer, + SensorManager.SENSOR_DELAY_NORMAL + ) + registerListener( + seneorListener, + magnetic, + SensorManager.SENSOR_DELAY_NORMAL + ) + } + } + } + + override fun onDestroy(owner: LifecycleOwner) { + super.onDestroy(owner) + if (sensorManager != null) { + sensorManager!!.unregisterListener(seneorListener) + } + } + + // 计算方向 + private fun calculateOrientation() { + val values = FloatArray(3) + val R = FloatArray(9) + SensorManager.getRotationMatrix( + R, null, accelerometerValues, + magneticFieldValues + ) + SensorManager.getOrientation(R, values) + zDegree = Math.toDegrees(values[0].toDouble()).toFloat() + xDegree = Math.toDegrees(values[1].toDouble()).toFloat() + yDegree = Math.toDegrees(values[2].toDouble()).toFloat() + degreesChangeListener?.onDegreesChangeListener(xDegree, yDegree, zDegree) + } + + interface DegreesChangeListener { + fun onDegreesChangeListener(xDegree: Float, yDegree: Float, zDegree: Float) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/outdoor/viewmodel/RxPicturesViewModel.kt b/app/src/main/java/com/navinfo/outdoor/viewmodel/RxPicturesViewModel.kt new file mode 100644 index 0000000..73b28fc --- /dev/null +++ b/app/src/main/java/com/navinfo/outdoor/viewmodel/RxPicturesViewModel.kt @@ -0,0 +1,42 @@ +package com.navinfo.outdoor.viewmodel + +import android.content.Intent +import androidx.lifecycle.ViewModel +import com.navinfo.outdoor.api.Constant +import com.tencent.tencentmap.mapsdk.maps.interfaces.Removable +import java.io.File +import java.util.* + +class RxPicturesViewModel: ViewModel() { + private var finalVideoPath: String? = null// 摄像后最终保存的文件名 + private var geoWkt:String? = null + private var detail:String? = null + private var type = 0 + private val radioPicture = 0 + private var videoIndex = -1 + private var paperFile: File? = null + private var logFile:java.io.File? = null + private val removables = mutableListOf() + + private fun initDataFromIntent(intent: Intent): Boolean { + if (intent != null) { + finalVideoPath = intent.getStringExtra(Constant.INTENT_JPG_PATH) + type = intent.getIntExtra(Constant.INTENT_TYPE, 0) + geoWkt = intent.getStringExtra(Constant.INTENT_GEO_WKT) + detail = intent.getStringExtra(Constant.INTENT_DETAIL) + if (finalVideoPath != null) { + val file: File = File(finalVideoPath) + paperFile = + File(Objects.requireNonNull(file.parentFile).absoluteFile.toString() + "/" + "paper.txt") + videoIndex = file.name.replace(".webp", "").toInt() + if (videoIndex == 0) { + videoIndex = -1 + } else { + videoIndex = videoIndex - 1 + } + } + return true + } + return false + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_home.xml b/app/src/main/res/layout/activity_home.xml index dff5f0a..f1855a9 100644 --- a/app/src/main/res/layout/activity_home.xml +++ b/app/src/main/res/layout/activity_home.xml @@ -31,4 +31,10 @@ app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" /> + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_pictures.xml b/app/src/main/res/layout/activity_pictures.xml index 5445530..2849423 100644 --- a/app/src/main/res/layout/activity_pictures.xml +++ b/app/src/main/res/layout/activity_pictures.xml @@ -275,5 +275,11 @@ app:layout_constraintBottom_toBottomOf="@id/capture_picture" app:layout_constraintLeft_toRightOf="@id/capture_picture" app:layout_constraintRight_toRightOf="parent" /> - + \ No newline at end of file