Commit fb7d4083 authored by wanglei's avatar wanglei

...

parent 2d0c748c
...@@ -19,3 +19,11 @@ ...@@ -19,3 +19,11 @@
# If you keep the line number information, uncomment this to # If you keep the line number information, uncomment this to
# hide the original source file name. # hide the original source file name.
#-renamesourcefileattribute SourceFile #-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>( ...@@ -75,6 +75,11 @@ abstract class BaseFragment<VB : ViewBinding>(
LogEx.logDebug(TAG, "lifecycle $tagNo onDestroyView ${javaClass.simpleName} $onDestroyViewI") 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) { inline fun <VB : ViewBinding> BaseFragment<VB>.viewBind(block: VB.() -> Unit) {
......
...@@ -24,16 +24,17 @@ class CameraUtils( ...@@ -24,16 +24,17 @@ class CameraUtils(
) { ) {
private val TAG = "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 preview: Preview? = null
private var camera: Camera? = null private var camera: Camera? = null
private var lensFacing: Int = CameraSelector.LENS_FACING_BACK
private var cameraProvider: ProcessCameraProvider? = null 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 { init {
cameraExecutor = Executors.newSingleThreadExecutor() cameraExecutor = Executors.newSingleThreadExecutor()
...@@ -53,20 +54,26 @@ class CameraUtils( ...@@ -53,20 +54,26 @@ class CameraUtils(
}, ContextCompat.getMainExecutor(activity)) }, ContextCompat.getMainExecutor(activity))
} }
/** /**
*解绑 *解绑
*/ */
fun unBind() { fun unBind() {
cameraProvider?.unbindAll() cameraProvider?.unbindAll()
imageAnalyzer?.clearAnalyzer() imageAnalyzer?.clearAnalyzer()
cameraProvider = null cameraProvider = null
imageAnalyzer = null imageAnalyzer = null
preview = null
camera = null
} }
/** /**
* 销毁时调用 * 销毁时调用
*/ */
fun onDestroy() { fun onDestroy() {
unBind()
cameraExecutor?.shutdown() cameraExecutor?.shutdown()
cameraExecutor = null cameraExecutor = null
} }
......
...@@ -38,12 +38,12 @@ class CreateFragment : BaseFragment<FragmentCreateBinding>(FragmentCreateBinding ...@@ -38,12 +38,12 @@ class CreateFragment : BaseFragment<FragmentCreateBinding>(FragmentCreateBinding
FunctionUIBean(KEY_WIFI, R.mipmap.h_wifi, resources.getString(R.string.wifi)), 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_TEXT, R.mipmap.h_text, resources.getString(R.string.text)),
FunctionUIBean(KEY_EMAIL, R.mipmap.h_email, resources.getString(R.string.email)), 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_EVENT, R.mipmap.h_event, resources.getString(R.string.event)),
FunctionUIBean(KEY_CONTACT, R.mipmap.h_contact, resources.getString(R.string.contact)), // 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_WEBSITE, R.mipmap.h_website, resources.getString(R.string.website)),
FunctionUIBean(KEY_LOCATION, R.mipmap.h_loction, resources.getString(R.string.location)), // 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_TELEPHONE, R.mipmap.h_telephone, resources.getString(R.string.telephone)),
FunctionUIBean(KEY_MESSAGE, R.mipmap.h_message, resources.getString(R.string.message)), // FunctionUIBean(KEY_MESSAGE, R.mipmap.h_message, resources.getString(R.string.message)),
) )
) )
adapter?.itemClick = ::itemClick adapter?.itemClick = ::itemClick
......
...@@ -136,7 +136,7 @@ class HistoryFragment : BaseFragment<FragmentHistoryBinding>(FragmentHistoryBind ...@@ -136,7 +136,7 @@ class HistoryFragment : BaseFragment<FragmentHistoryBinding>(FragmentHistoryBind
private fun changeRvData(isCreateOrScan: Boolean) { private fun changeRvData(isCreateOrScan: Boolean) {
val uiRefresh = { val uiRefresh = {
val createList = viewModel.historyList.filter { it.isCreateOrScan == isCreateOrScan } val createList = viewModel.historyList.filter { it.isCreateOrScan == isCreateOrScan }
binding.tvEmpty.isVisible = createList.isEmpty() binding.llEmpty.isVisible = createList.isEmpty()
adapter?.submitList(createList) adapter?.submitList(createList)
} }
if (viewModel.dataRefreshFinish.get()) { if (viewModel.dataRefreshFinish.get()) {
......
...@@ -111,7 +111,7 @@ class MainActivity : BaseActivity<ActivityMainBinding>(ActivityMainBinding::infl ...@@ -111,7 +111,7 @@ class MainActivity : BaseActivity<ActivityMainBinding>(ActivityMainBinding::infl
override fun onDestroy() { override fun onDestroy() {
super.onDestroy() super.onDestroy()
cameraUtils?.onDestroy() cameraUtils?.unBind()
} }
override fun configSystemBar() { override fun configSystemBar() {
......
...@@ -4,9 +4,11 @@ import android.Manifest ...@@ -4,9 +4,11 @@ import android.Manifest
import android.content.Intent import android.content.Intent
import android.content.pm.PackageManager import android.content.pm.PackageManager
import android.hardware.camera2.CameraMetadata.FLASH_MODE_OFF import android.hardware.camera2.CameraMetadata.FLASH_MODE_OFF
import android.net.Uri
import android.view.View import android.view.View
import android.widget.SeekBar import android.widget.SeekBar
import androidx.camera.core.ImageCapture.FLASH_MODE_ON import androidx.camera.core.ImageCapture.FLASH_MODE_ON
import androidx.lifecycle.lifecycleScope
import com.base.scanqr.R import com.base.scanqr.R
import com.base.scanqr.base.BaseFragment import com.base.scanqr.base.BaseFragment
import com.base.scanqr.bean.TextUIBean import com.base.scanqr.bean.TextUIBean
...@@ -15,12 +17,15 @@ import com.base.scanqr.qr.QRImageAnalyzer ...@@ -15,12 +17,15 @@ import com.base.scanqr.qr.QRImageAnalyzer
import com.base.scanqr.ui.email.EmailCodeActivity import com.base.scanqr.ui.email.EmailCodeActivity
import com.base.scanqr.ui.text.TextCodeActivity import com.base.scanqr.ui.text.TextCodeActivity
import com.base.scanqr.ui.wifi.WifiCodeActivity 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.IntentUtils.intentSafPickImage
import com.base.scanqr.utils.LogEx import com.base.scanqr.utils.LogEx
import com.base.scanqr.utils.PermissionUtils.checkCameraPermission import com.base.scanqr.utils.PermissionUtils.checkCameraPermission
import com.base.scanqr.utils.QRCodeUtils import com.base.scanqr.utils.QRCodeUtils
import com.google.gson.Gson import com.google.gson.Gson
import com.gyf.immersionbar.ktx.immersionBar import com.gyf.immersionbar.ktx.immersionBar
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import java.util.concurrent.atomic.AtomicBoolean import java.util.concurrent.atomic.AtomicBoolean
...@@ -28,6 +33,7 @@ class ScanFragment : BaseFragment<FragmentScanBinding>(FragmentScanBinding::infl ...@@ -28,6 +33,7 @@ class ScanFragment : BaseFragment<FragmentScanBinding>(FragmentScanBinding::infl
private var zoomPair = Pair(0f, 100f) private var zoomPair = Pair(0f, 100f)
private val qrImageAnalyzer = QRImageAnalyzer()
override fun initView() { override fun initView() {
super.initView() super.initView()
} }
...@@ -40,7 +46,9 @@ class ScanFragment : BaseFragment<FragmentScanBinding>(FragmentScanBinding::infl ...@@ -40,7 +46,9 @@ class ScanFragment : BaseFragment<FragmentScanBinding>(FragmentScanBinding::infl
} else { } else {
val activity = requireActivity() as MainActivity? val activity = requireActivity() as MainActivity?
activity ?: return 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 ...@@ -51,7 +59,7 @@ class ScanFragment : BaseFragment<FragmentScanBinding>(FragmentScanBinding::infl
if (!hasFlash) { if (!hasFlash) {
binding.flFlash.visibility = View.GONE binding.flFlash.visibility = View.GONE
} }
val qrImageAnalyzer = QRImageAnalyzer()
qrImageAnalyzer.parseAction = { qrCodeValue, valueType -> qrImageAnalyzer.parseAction = { qrCodeValue, valueType ->
handleScan(qrCodeValue, valueType) handleScan(qrCodeValue, valueType)
} }
...@@ -132,10 +140,12 @@ class ScanFragment : BaseFragment<FragmentScanBinding>(FragmentScanBinding::infl ...@@ -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? val activity = requireActivity() as MainActivity?
activity?.cameraUtils?.unBind() activity?.cameraUtils?.unBind()
cameraInit.set(false)
} }
override fun onDestroy() { override fun onDestroy() {
...@@ -149,7 +159,18 @@ class ScanFragment : BaseFragment<FragmentScanBinding>(FragmentScanBinding::infl ...@@ -149,7 +159,18 @@ class ScanFragment : BaseFragment<FragmentScanBinding>(FragmentScanBinding::infl
binding.flImage.setOnClickListener { binding.flImage.setOnClickListener {
val activity = requireActivity() as MainActivity? val activity = requireActivity() as MainActivity?
val intent = intentSafPickImage() 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 { binding.flFlash.setOnClickListener {
val activity = requireActivity() as MainActivity? val activity = requireActivity() as MainActivity?
...@@ -187,6 +208,7 @@ class ScanFragment : BaseFragment<FragmentScanBinding>(FragmentScanBinding::infl ...@@ -187,6 +208,7 @@ class ScanFragment : BaseFragment<FragmentScanBinding>(FragmentScanBinding::infl
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
scanJump.set(false)
immersionBar { immersionBar {
statusBarColor("#00FFFFFF") statusBarColor("#00FFFFFF")
} }
......
...@@ -2,8 +2,12 @@ package com.base.scanqr.utils ...@@ -2,8 +2,12 @@ package com.base.scanqr.utils
import android.content.Context import android.content.Context
import android.graphics.Bitmap import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.net.Uri
import java.io.File import java.io.File
import java.io.FileOutputStream import java.io.FileOutputStream
import java.io.IOException
import java.io.InputStream
object BitmapUtils { object BitmapUtils {
...@@ -21,4 +25,25 @@ object BitmapUtils { ...@@ -21,4 +25,25 @@ object BitmapUtils {
false 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 @@ ...@@ -20,6 +20,7 @@
app:layout_constraintTop_toTopOf="parent" /> app:layout_constraintTop_toTopOf="parent" />
<ImageView <ImageView
android:visibility="gone"
android:id="@+id/ivVip" android:id="@+id/ivVip"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
......
...@@ -29,6 +29,7 @@ ...@@ -29,6 +29,7 @@
android:layout_gravity="center_vertical|end" android:layout_gravity="center_vertical|end"
android:layout_marginEnd="16dp" android:layout_marginEnd="16dp"
android:src="@mipmap/h_vip" android:src="@mipmap/h_vip"
android:visibility="gone"
tools:ignore="ContentDescription" /> tools:ignore="ContentDescription" />
</FrameLayout> </FrameLayout>
...@@ -108,7 +109,8 @@ ...@@ -108,7 +109,8 @@
android:layout_height="32dp" android:layout_height="32dp"
android:layout_marginHorizontal="5dp" android:layout_marginHorizontal="5dp"
android:background="@drawable/bg_ecf6ee_10" android:background="@drawable/bg_ecf6ee_10"
android:gravity="center"> android:gravity="center"
android:visibility="gone">
<ImageView <ImageView
...@@ -171,15 +173,30 @@ ...@@ -171,15 +173,30 @@
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
tools:listitem="@layout/item_history" /> tools:listitem="@layout/item_history" />
<TextView <LinearLayout
android:id="@+id/tv_empty" android:id="@+id/ll_empty"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center" 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:text="NO QRCode"
android:textColor="#999999" android:textColor="#666666"
android:textSize="20sp" android:textSize="18sp" />
android:visibility="gone" /> </LinearLayout>
</FrameLayout> </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