feat: 增加拍摄界面

This commit is contained in:
2022-12-28 11:03:29 +08:00
parent acbc7c957b
commit 2337dfd8dd
13 changed files with 269 additions and 5 deletions

View File

@@ -1,18 +1,24 @@
package com.navinfo.volvo
import android.Manifest
import android.content.DialogInterface
import android.os.Bundle
import android.widget.Toast
import com.google.android.material.bottomnavigation.BottomNavigationView
import androidx.appcompat.app.AppCompatActivity
import androidx.navigation.findNavController
import androidx.navigation.ui.AppBarConfiguration
import androidx.navigation.ui.setupWithNavController
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.navinfo.volvo.R
import com.navinfo.volvo.databinding.ActivityMainBinding
import permissions.dispatcher.*
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
@NeedsPermission(Manifest.permission.CAMERA)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
@@ -32,4 +38,29 @@ class MainActivity : AppCompatActivity() {
// setupActionBarWithNavController(navController, appBarConfiguration)
navView.setupWithNavController(navController)
}
@OnShowRationale(Manifest.permission.CAMERA)
fun showRationaleForCamera(request: PermissionRequest) {
// showRationaleDialog(R.string.permission_camera_rationale, request)
// Toast.makeText(context, "当前操作需要您授权相机权限!", Toast.LENGTH_SHORT).show()
MaterialAlertDialogBuilder(this)
.setTitle("提示")
.setMessage("当前操作需要您授权读写SD卡权限")
.setPositiveButton("确定", DialogInterface.OnClickListener { dialogInterface, i ->
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()
}
}

View File

@@ -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<Any>(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)
}
}

View File

@@ -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)
}
}

View File

@@ -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<String>().apply {
value = "This is dashboard Fragment"
}
val text: LiveData<String> = _text
}

View File

@@ -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()
}
}