From 2337dfd8dd29cb552868df65bbd005851686f6a8 Mon Sep 17 00:00:00 2001 From: xiaoyan Date: Wed, 28 Dec 2022 11:03:29 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E6=8B=8D=E6=91=84?= =?UTF-8?q?=E7=95=8C=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 11 +++ app/src/main/AndroidManifest.xml | 10 +++ .../java/com/navinfo/volvo/MainActivity.kt | 31 +++++++ .../navinfo/volvo/ui/camera/CameraFragment.kt | 87 +++++++++++++++++++ .../ui/camera/CameraLifeCycleObserver.kt | 31 +++++++ .../volvo/ui/camera/CameraViewModel.kt | 13 +++ .../volvo/ui/message/ObtainMessageFragment.kt | 39 +++++++++ .../drawable/ic_baseline_camera_alt_24.xml | 6 ++ app/src/main/res/layout/fragment_camera.xml | 21 +++++ .../main/res/layout/fragment_dashboard.xml | 2 +- .../res/layout/fragment_obtain_message.xml | 8 +- .../main/res/navigation/mobile_navigation.xml | 9 ++ app/src/main/res/values/styles.xml | 6 ++ 13 files changed, 269 insertions(+), 5 deletions(-) create mode 100644 app/src/main/java/com/navinfo/volvo/ui/camera/CameraFragment.kt create mode 100644 app/src/main/java/com/navinfo/volvo/ui/camera/CameraLifeCycleObserver.kt create mode 100644 app/src/main/java/com/navinfo/volvo/ui/camera/CameraViewModel.kt create mode 100644 app/src/main/res/drawable/ic_baseline_camera_alt_24.xml create mode 100644 app/src/main/res/layout/fragment_camera.xml diff --git a/app/build.gradle b/app/build.gradle index 9fc9f50..5bcd6b5 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -82,4 +82,15 @@ dependencies { implementation 'com.github.Gredicer:datetimepicker:V1.0.0' implementation 'com.google.code.gson:gson:2.10' implementation 'com.yanzhenjie.recyclerview:x:1.3.2' + + // 动态权限申请 https://github.com/permissions-dispatcher/PermissionsDispatcher + implementation "com.github.permissions-dispatcher:permissionsdispatcher:4.9.2" + annotationProcessor "com.github.permissions-dispatcher:permissionsdispatcher-processor:4.9.2" + + // 相机库 https://natario1.github.io/CameraView/about/getting-started + implementation("com.otaliastudios:cameraview:2.7.2") + // 图片压缩算法 https://github.com/Curzibn/Luban + implementation 'top.zibin:Luban:1.1.8' + // Android工具类库 https://github.com/l123456789jy/Lazy + implementation 'com.github.lazylibrary:lazylibrary:1.0.2' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 59ecdb6..6eeda1e 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,6 +1,16 @@ + + + + + + + + + + + dialogInterface.dismiss() + // 在SD卡创建项目目录 + + }) + .show() + } + + @OnPermissionDenied(Manifest.permission.CAMERA) + fun onCameraDenied() { + Toast.makeText(this, "当前操作需要您授权读写SD卡权限!", Toast.LENGTH_SHORT).show() + } + + @OnNeverAskAgain(Manifest.permission.CAMERA) + fun onCameraNeverAskAgain() { + Toast.makeText(this, "您已永久拒绝授权读写SD卡权限!", Toast.LENGTH_SHORT).show() + } } \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/volvo/ui/camera/CameraFragment.kt b/app/src/main/java/com/navinfo/volvo/ui/camera/CameraFragment.kt new file mode 100644 index 0000000..1c84f0c --- /dev/null +++ b/app/src/main/java/com/navinfo/volvo/ui/camera/CameraFragment.kt @@ -0,0 +1,87 @@ +package com.navinfo.volvo.ui.camera + +import android.os.Bundle +import android.text.TextUtils +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment +import androidx.lifecycle.ViewModelProvider +import com.navinfo.volvo.databinding.FragmentCameraBinding +import com.otaliastudios.cameraview.CameraListener +import com.otaliastudios.cameraview.CameraView +import com.otaliastudios.cameraview.PictureResult +import top.zibin.luban.Luban +import top.zibin.luban.OnCompressListener +import java.io.File +import java.util.* + + +class CameraFragment : Fragment() { + + private var _binding: FragmentCameraBinding? = null + + // This property is only valid between onCreateView and + // onDestroyView. + private val binding get() = _binding!! + + private val cameraLifeCycleObserver: CameraLifeCycleObserver by lazy { + CameraLifeCycleObserver() + } + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + lifecycle.addObserver(cameraLifeCycleObserver) + + val cameraViewModel = + ViewModelProvider(this).get(CameraViewModel::class.java) + + _binding = FragmentCameraBinding.inflate(inflater, container, false) + val root: View = binding.root + + val cameraView: CameraView = binding.camera + cameraView.setLifecycleOwner(this) + cameraView.addCameraListener(object:CameraListener() { // 添加拍照回调 + override fun onPictureTaken(result: PictureResult) { + super.onPictureTaken(result) + result.toFile() + // 压缩图片文件 + Luban.with(context) + .load(photos) + .ignoreBy(100) + .setTargetDir(getPath()) + .filter { path -> + !(TextUtils.isEmpty(path) || path.lowercase(Locale.getDefault()) + .endsWith(".gif")) + } + .setCompressListener(object : OnCompressListener { + override fun onStart() { + // TODO 压缩开始前调用,可以在方法内启动 loading UI + } + + override fun onSuccess(file: File?) { + // TODO 压缩成功后调用,返回压缩后的图片文件 + } + + override fun onError(e: Throwable) { + // TODO 当压缩过程出现问题时调用 + } + }).launch() + } + }) + // 点击拍照 + binding.imgStartCamera.setOnClickListener { + cameraView.takePicture() + } + return root + } + + override fun onDestroyView() { + super.onDestroyView() + _binding = null + lifecycle.removeObserver(cameraLifeCycleObserver) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/volvo/ui/camera/CameraLifeCycleObserver.kt b/app/src/main/java/com/navinfo/volvo/ui/camera/CameraLifeCycleObserver.kt new file mode 100644 index 0000000..f567158 --- /dev/null +++ b/app/src/main/java/com/navinfo/volvo/ui/camera/CameraLifeCycleObserver.kt @@ -0,0 +1,31 @@ +package com.navinfo.volvo.ui.camera + +import androidx.lifecycle.DefaultLifecycleObserver +import androidx.lifecycle.LifecycleOwner + +class CameraLifeCycleObserver: DefaultLifecycleObserver { + + override fun onCreate(owner: LifecycleOwner) { + super.onCreate(owner) + } + + override fun onStart(owner: LifecycleOwner) { + super.onStart(owner) + } + + override fun onResume(owner: LifecycleOwner) { + super.onResume(owner) + } + + override fun onPause(owner: LifecycleOwner) { + super.onPause(owner) + } + + override fun onStop(owner: LifecycleOwner) { + super.onStop(owner) + } + + override fun onDestroy(owner: LifecycleOwner) { + super.onDestroy(owner) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/volvo/ui/camera/CameraViewModel.kt b/app/src/main/java/com/navinfo/volvo/ui/camera/CameraViewModel.kt new file mode 100644 index 0000000..681bbb6 --- /dev/null +++ b/app/src/main/java/com/navinfo/volvo/ui/camera/CameraViewModel.kt @@ -0,0 +1,13 @@ +package com.navinfo.volvo.ui.camera + +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel + +class CameraViewModel : ViewModel() { + + private val _text = MutableLiveData().apply { + value = "This is dashboard Fragment" + } + val text: LiveData = _text +} \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/volvo/ui/message/ObtainMessageFragment.kt b/app/src/main/java/com/navinfo/volvo/ui/message/ObtainMessageFragment.kt index d90d8cf..b8ec592 100644 --- a/app/src/main/java/com/navinfo/volvo/ui/message/ObtainMessageFragment.kt +++ b/app/src/main/java/com/navinfo/volvo/ui/message/ObtainMessageFragment.kt @@ -1,15 +1,21 @@ package com.navinfo.volvo.ui.message +import android.Manifest +import android.content.DialogInterface import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.Toast import androidx.fragment.app.Fragment import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider +import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.gredicer.datetimepicker.DateTimePickerFragment import com.navinfo.volvo.databinding.FragmentObtainMessageBinding import com.navinfo.volvo.ui.markRequiredInRed +import permissions.dispatcher.* +import java.util.* class ObtainMessageFragment: Fragment() { private var _binding: FragmentObtainMessageBinding? = null @@ -59,10 +65,43 @@ class ObtainMessageFragment: Fragment() { } // 点击按钮选择拍照 + binding.btnStartCamera.setOnClickListener { + // 启动相机 + startCamera() + } } override fun onDestroyView() { super.onDestroyView() _binding = null } + + @NeedsPermission(Manifest.permission.CAMERA) + fun startCamera() { + + } + + @OnShowRationale(Manifest.permission.CAMERA) + fun showRationaleForCamera(request: PermissionRequest) { +// showRationaleDialog(R.string.permission_camera_rationale, request) +// Toast.makeText(context, "当前操作需要您授权相机权限!", Toast.LENGTH_SHORT).show() + MaterialAlertDialogBuilder(context!!) + .setTitle("提示") + .setMessage("当前操作需要您授权相机权限!") + .setPositiveButton("确定", DialogInterface.OnClickListener { dialogInterface, i -> + startCamera() + dialogInterface.dismiss() + }) + .show() + } + + @OnPermissionDenied(Manifest.permission.CAMERA) + fun onCameraDenied() { + Toast.makeText(context, "当前操作需要您授权相机权限!", Toast.LENGTH_SHORT).show() + } + + @OnNeverAskAgain(Manifest.permission.CAMERA) + fun onCameraNeverAskAgain() { + Toast.makeText(context, "您已永久拒绝授权相机权限!", Toast.LENGTH_SHORT).show() + } } \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_baseline_camera_alt_24.xml b/app/src/main/res/drawable/ic_baseline_camera_alt_24.xml new file mode 100644 index 0000000..47483ef --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_camera_alt_24.xml @@ -0,0 +1,6 @@ + + + + diff --git a/app/src/main/res/layout/fragment_camera.xml b/app/src/main/res/layout/fragment_camera.xml new file mode 100644 index 0000000..e935007 --- /dev/null +++ b/app/src/main/res/layout/fragment_camera.xml @@ -0,0 +1,21 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_dashboard.xml b/app/src/main/res/layout/fragment_dashboard.xml index d137b00..201541e 100644 --- a/app/src/main/res/layout/fragment_dashboard.xml +++ b/app/src/main/res/layout/fragment_dashboard.xml @@ -4,7 +4,7 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - tools:context="com.navinfo.volvo.ui.dashboard.DashboardFragment"> + tools:context="com.navinfo.volvo.ui.dashboard.CameraFragment"> + android:background="@drawable/selector_bg_4_round_corner"> + android:background="@drawable/selector_bg_4_round_corner"> + + + + \ No newline at end of file diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 229464f..3e42417 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -3,4 +3,10 @@ + + + \ No newline at end of file