Files
SecurityDefenseDevice/app/src/main/java/com/example/defenseapplication/home/AddDeviceActivity.kt
2026-05-18 17:39:30 +08:00

195 lines
7.3 KiB
Kotlin

package com.example.defenseapplication.home
import android.Manifest
import android.app.Activity
import android.content.Intent
import android.content.pm.PackageManager
import android.os.Build
import android.os.Bundle
import android.os.Handler
import android.os.Looper
import android.view.View
import android.widget.Toast
import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.ContextCompat
import androidx.recyclerview.widget.GridLayoutManager
import com.example.defenseapplication.R
import com.example.defenseapplication.adapter.AddDeviceAdapter
import com.example.defenseapplication.adapter.Device
import com.example.defenseapplication.databinding.AddDeviceActivityBinding
import com.gyf.immersionbar.ImmersionBar
import com.maning.mlkitscanner.scan.MNScanManager
import com.maning.mlkitscanner.scan.callback.act.MNScanCallback
//添加设备页面
class AddDeviceActivity : AppCompatActivity() {
private lateinit var binding: AddDeviceActivityBinding
private lateinit var adapter: AddDeviceAdapter
private val mainHandler = Handler(Looper.getMainLooper())
private val requestPermissionsLauncher = registerForActivityResult(
ActivityResultContracts.RequestMultiplePermissions()
) { permissions ->
val cameraGranted = permissions[Manifest.permission.CAMERA] ?: false
val storageGranted = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
permissions[Manifest.permission.READ_MEDIA_IMAGES] ?: false
} else {
permissions[Manifest.permission.READ_EXTERNAL_STORAGE] ?: false
}
if (cameraGranted && storageGranted) {
startScan()
} else {
Toast.makeText(this, R.string.permission_denied, Toast.LENGTH_SHORT).show()
}
}
private fun checkPermissionsAndScan() {
val cameraPermission = ContextCompat.checkSelfPermission(
this,
Manifest.permission.CAMERA
)
val storagePermission = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
ContextCompat.checkSelfPermission(
this,
Manifest.permission.READ_MEDIA_IMAGES
)
} else {
ContextCompat.checkSelfPermission(
this,
Manifest.permission.WRITE_EXTERNAL_STORAGE
)
}
if (cameraPermission == PackageManager.PERMISSION_GRANTED &&
storagePermission == PackageManager.PERMISSION_GRANTED) {
startScan()
} else {
val permissionsToRequest = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
arrayOf(
Manifest.permission.CAMERA,
Manifest.permission.READ_MEDIA_IMAGES
)
} else {
arrayOf(
Manifest.permission.CAMERA,
Manifest.permission.WRITE_EXTERNAL_STORAGE
)
}
requestPermissionsLauncher.launch(permissionsToRequest)
}
}
private fun startScan() {
MNScanManager.startScan(this, object: MNScanCallback {
override fun onActivityResult(resultCode: Int, data: Intent?) {
when (resultCode) {
MNScanManager.RESULT_SUCCESS -> {
val result = data?.getStringArrayListExtra(MNScanManager.INTENT_KEY_RESULT_SUCCESS)
if (!result.isNullOrEmpty()) {
ToastUtils.showToast(this@AddDeviceActivity, "扫码成功: $result")
} else {
ToastUtils.showToast(this@AddDeviceActivity, "扫码结果为空")
}
}
MNScanManager.RESULT_FAIL -> {
val error = data?.getStringExtra(MNScanManager.INTENT_KEY_RESULT_ERROR)
ToastUtils.showToast(this@AddDeviceActivity, "扫码失败: $error")
}
MNScanManager.RESULT_CANCLE -> {
ToastUtils.showToast(this@AddDeviceActivity, "扫码取消")
}
}
}
})
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = AddDeviceActivityBinding.inflate(layoutInflater)
setContentView(binding.root)
ImmersionBar.with(this)
.statusBarDarkFont(true)
.titleBar(binding.topBar)
.init()
binding.ivBack.setOnClickListener {
finish()
}
binding.btnScanAdd.setOnClickListener {
checkPermissionsAndScan()
}
// 开始播放扫描动画,动画结束后再显示设备列表
startScanAnimationThenShowList()
}
private fun startScanAnimationThenShowList() {
// 显示动画层
binding.animationContainer.visibility = View.VISIBLE
binding.rvDevices.visibility = View.GONE
// 设置帧动画并启动
binding.ivScanAnimation.setImageResource(R.drawable.device_frame_animation)
val scanDrawable = binding.ivScanAnimation.drawable
if (scanDrawable is android.graphics.drawable.AnimationDrawable) {
scanDrawable.start()
}
// 模拟扫描过程
mainHandler.postDelayed({
// 停止动画
(binding.ivScanAnimation.drawable as? android.graphics.drawable.AnimationDrawable)?.stop()
// 隐藏动画层,显示列表
binding.animationContainer.visibility = View.GONE
binding.rvDevices.visibility = View.VISIBLE
setupDeviceList() // 加载设备列表
}, 3000) // 动画播放时长,可根据实际帧动画总时长调整
}
private fun setupDeviceList() {
val devices = listOf(
Device(getString(R.string.smart_hanging_defense), "device1"),
Device(getString(R.string.smart_defense_device), "device2")
)
if (devices.isEmpty()) {
binding.rvDevices.visibility = View.GONE
} else {
binding.rvDevices.visibility = View.VISIBLE
binding.rvDevices.layoutManager = GridLayoutManager(this, 2)
adapter = AddDeviceAdapter(devices) { device ->
val intent = Intent(this, AddFamilyActivity::class.java)
intent.putExtra("device_name", device.name)
startActivity(intent)
}
binding.rvDevices.adapter = adapter
}
}
override fun onPause() {
super.onPause()
// 停止所有可见 item 的动画
for (i in 0 until binding.rvDevices.childCount) {
val child = binding.rvDevices.getChildAt(i)
val holder = binding.rvDevices.getChildViewHolder(child) as? AddDeviceAdapter.ViewHolder
holder?.stopAnimation()
}
}
override fun onResume() {
super.onResume()
// 重新启动所有可见 item 的动画
for (i in 0 until binding.rvDevices.childCount) {
val child = binding.rvDevices.getChildAt(i)
val holder = binding.rvDevices.getChildViewHolder(child) as? AddDeviceAdapter.ViewHolder
holder?.startAnimation()
}
}
}