Commit fb7d4083 authored by wanglei's avatar wanglei

...

parent 2d0c748c
......@@ -19,3 +19,11 @@
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile
-keep class com.base.scanqr.bean.** { *; }
-keep class com.google.gson.reflect.** { *; }
-keep class com.google.gson.stream.** { *; }
-keepattributes *Annotation*
-keep class * extends com.google.gson.TypeAdapter
-keep class * extends com.google.gson.JsonSerializer
-keep class * extends com.google.gson.Deserializer
-keep class com.google.gson.TypeAdapters{*;}
\ No newline at end of file
......@@ -75,6 +75,11 @@ abstract class BaseFragment<VB : ViewBinding>(
LogEx.logDebug(TAG, "lifecycle $tagNo onDestroyView ${javaClass.simpleName} $onDestroyViewI")
}
override fun onStop() {
super.onStop()
fragmentInit = false
}
}
inline fun <VB : ViewBinding> BaseFragment<VB>.viewBind(block: VB.() -> Unit) {
......
......@@ -24,16 +24,17 @@ class CameraUtils(
) {
private val TAG = "CameraUtils"
private var cameraExecutor: ExecutorService? = null
private var cameraExecutor: ExecutorService? = null//activity销毁时销毁
//每次暂停都可暂停和赋空
private var imageAnalyzer: ImageAnalysis? = null
private var preview: Preview? = null
private var camera: Camera? = null
private var lensFacing: Int = CameraSelector.LENS_FACING_BACK
private var cameraProvider: ProcessCameraProvider? = null
private var imageAnalyzer: ImageAnalysis? = null
var cameraReadyCallBack: (() -> Unit)? = null
private var lensFacing: Int = CameraSelector.LENS_FACING_BACK
var cameraReadyCallBack: (() -> Unit)? = null
init {
cameraExecutor = Executors.newSingleThreadExecutor()
......@@ -53,20 +54,26 @@ class CameraUtils(
}, ContextCompat.getMainExecutor(activity))
}
/**
*解绑
*/
fun unBind() {
cameraProvider?.unbindAll()
imageAnalyzer?.clearAnalyzer()
cameraProvider = null
imageAnalyzer = null
preview = null
camera = null
}
/**
* 销毁时调用
*/
fun onDestroy() {
unBind()
cameraExecutor?.shutdown()
cameraExecutor = null
}
......
......@@ -38,12 +38,12 @@ class CreateFragment : BaseFragment<FragmentCreateBinding>(FragmentCreateBinding
FunctionUIBean(KEY_WIFI, R.mipmap.h_wifi, resources.getString(R.string.wifi)),
FunctionUIBean(KEY_TEXT, R.mipmap.h_text, resources.getString(R.string.text)),
FunctionUIBean(KEY_EMAIL, R.mipmap.h_email, resources.getString(R.string.email)),
FunctionUIBean(KEY_EVENT, R.mipmap.h_event, resources.getString(R.string.event)),
FunctionUIBean(KEY_CONTACT, R.mipmap.h_contact, resources.getString(R.string.contact)),
FunctionUIBean(KEY_WEBSITE, R.mipmap.h_website, resources.getString(R.string.website)),
FunctionUIBean(KEY_LOCATION, R.mipmap.h_loction, resources.getString(R.string.location)),
FunctionUIBean(KEY_TELEPHONE, R.mipmap.h_telephone, resources.getString(R.string.telephone)),
FunctionUIBean(KEY_MESSAGE, R.mipmap.h_message, resources.getString(R.string.message)),
// FunctionUIBean(KEY_EVENT, R.mipmap.h_event, resources.getString(R.string.event)),
// FunctionUIBean(KEY_CONTACT, R.mipmap.h_contact, resources.getString(R.string.contact)),
// FunctionUIBean(KEY_WEBSITE, R.mipmap.h_website, resources.getString(R.string.website)),
// FunctionUIBean(KEY_LOCATION, R.mipmap.h_loction, resources.getString(R.string.location)),
// FunctionUIBean(KEY_TELEPHONE, R.mipmap.h_telephone, resources.getString(R.string.telephone)),
// FunctionUIBean(KEY_MESSAGE, R.mipmap.h_message, resources.getString(R.string.message)),
)
)
adapter?.itemClick = ::itemClick
......
......@@ -136,7 +136,7 @@ class HistoryFragment : BaseFragment<FragmentHistoryBinding>(FragmentHistoryBind
private fun changeRvData(isCreateOrScan: Boolean) {
val uiRefresh = {
val createList = viewModel.historyList.filter { it.isCreateOrScan == isCreateOrScan }
binding.tvEmpty.isVisible = createList.isEmpty()
binding.llEmpty.isVisible = createList.isEmpty()
adapter?.submitList(createList)
}
if (viewModel.dataRefreshFinish.get()) {
......
......@@ -111,7 +111,7 @@ class MainActivity : BaseActivity<ActivityMainBinding>(ActivityMainBinding::infl
override fun onDestroy() {
super.onDestroy()
cameraUtils?.onDestroy()
cameraUtils?.unBind()
}
override fun configSystemBar() {
......
......@@ -4,9 +4,11 @@ import android.Manifest
import android.content.Intent
import android.content.pm.PackageManager
import android.hardware.camera2.CameraMetadata.FLASH_MODE_OFF
import android.net.Uri
import android.view.View
import android.widget.SeekBar
import androidx.camera.core.ImageCapture.FLASH_MODE_ON
import androidx.lifecycle.lifecycleScope
import com.base.scanqr.R
import com.base.scanqr.base.BaseFragment
import com.base.scanqr.bean.TextUIBean
......@@ -15,12 +17,15 @@ import com.base.scanqr.qr.QRImageAnalyzer
import com.base.scanqr.ui.email.EmailCodeActivity
import com.base.scanqr.ui.text.TextCodeActivity
import com.base.scanqr.ui.wifi.WifiCodeActivity
import com.base.scanqr.utils.BitmapUtils.uriToBitmap
import com.base.scanqr.utils.IntentUtils.intentSafPickImage
import com.base.scanqr.utils.LogEx
import com.base.scanqr.utils.PermissionUtils.checkCameraPermission
import com.base.scanqr.utils.QRCodeUtils
import com.google.gson.Gson
import com.gyf.immersionbar.ktx.immersionBar
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import java.util.concurrent.atomic.AtomicBoolean
......@@ -28,6 +33,7 @@ class ScanFragment : BaseFragment<FragmentScanBinding>(FragmentScanBinding::infl
private var zoomPair = Pair(0f, 100f)
private val qrImageAnalyzer = QRImageAnalyzer()
override fun initView() {
super.initView()
}
......@@ -40,7 +46,9 @@ class ScanFragment : BaseFragment<FragmentScanBinding>(FragmentScanBinding::infl
} else {
val activity = requireActivity() as MainActivity?
activity ?: return
activity.launcher.launch(arrayOf(Manifest.permission.CAMERA)) {}
activity.launcher.launch(arrayOf(Manifest.permission.CAMERA)) {
initCamera()
}
}
}
......@@ -51,7 +59,7 @@ class ScanFragment : BaseFragment<FragmentScanBinding>(FragmentScanBinding::infl
if (!hasFlash) {
binding.flFlash.visibility = View.GONE
}
val qrImageAnalyzer = QRImageAnalyzer()
qrImageAnalyzer.parseAction = { qrCodeValue, valueType ->
handleScan(qrCodeValue, valueType)
}
......@@ -132,10 +140,12 @@ class ScanFragment : BaseFragment<FragmentScanBinding>(FragmentScanBinding::infl
}
}
override fun onPause() {
super.onPause()
override fun onStop() {
super.onStop()
val activity = requireActivity() as MainActivity?
activity?.cameraUtils?.unBind()
cameraInit.set(false)
}
override fun onDestroy() {
......@@ -149,7 +159,18 @@ class ScanFragment : BaseFragment<FragmentScanBinding>(FragmentScanBinding::infl
binding.flImage.setOnClickListener {
val activity = requireActivity() as MainActivity?
val intent = intentSafPickImage()
activity?.launcher?.launch(intent)
activity?.launcher?.launch(intent) { result ->
val uri: Uri? = result.data?.data
uri ?: return@launch
lifecycleScope.launch(Dispatchers.IO) {
val bitmap = requireContext().uriToBitmap(uri)
bitmap?.let {
launch(Dispatchers.Main) {
qrImageAnalyzer.processImage(requireContext(), bitmap)
}
}
}
}
}
binding.flFlash.setOnClickListener {
val activity = requireActivity() as MainActivity?
......@@ -187,6 +208,7 @@ class ScanFragment : BaseFragment<FragmentScanBinding>(FragmentScanBinding::infl
override fun onResume() {
super.onResume()
scanJump.set(false)
immersionBar {
statusBarColor("#00FFFFFF")
}
......
......@@ -2,8 +2,12 @@ package com.base.scanqr.utils
import android.content.Context
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.net.Uri
import java.io.File
import java.io.FileOutputStream
import java.io.IOException
import java.io.InputStream
object BitmapUtils {
......@@ -21,4 +25,25 @@ object BitmapUtils {
false
}
}
fun Context.uriToBitmap(uri: Uri): Bitmap? {
return try {
// 获取ContentResolver实例
val contentResolver = contentResolver
// 打开InputStream
val inputStream: InputStream = contentResolver.openInputStream(uri) ?: return null
// 使用BitmapFactory解码InputStream
val bitmap: Bitmap = BitmapFactory.decodeStream(inputStream)
// 关闭InputStream
inputStream.close()
bitmap
} catch (e: IOException) {
e.printStackTrace()
null
}
}
}
\ No newline at end of file
......@@ -20,6 +20,7 @@
app:layout_constraintTop_toTopOf="parent" />
<ImageView
android:visibility="gone"
android:id="@+id/ivVip"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
......
......@@ -29,6 +29,7 @@
android:layout_gravity="center_vertical|end"
android:layout_marginEnd="16dp"
android:src="@mipmap/h_vip"
android:visibility="gone"
tools:ignore="ContentDescription" />
</FrameLayout>
......@@ -108,7 +109,8 @@
android:layout_height="32dp"
android:layout_marginHorizontal="5dp"
android:background="@drawable/bg_ecf6ee_10"
android:gravity="center">
android:gravity="center"
android:visibility="gone">
<ImageView
......@@ -171,15 +173,30 @@
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
tools:listitem="@layout/item_history" />
<TextView
android:id="@+id/tv_empty"
<LinearLayout
android:id="@+id/ll_empty"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:orientation="vertical"
android:visibility="visible">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:src="@mipmap/meiyou" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="14dp"
android:text="NO QRCode"
android:textColor="#999999"
android:textSize="20sp"
android:visibility="gone" />
android:textColor="#666666"
android:textSize="18sp" />
</LinearLayout>
</FrameLayout>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment