Android手电筒控制全攻略:从基础开关到状态监听(附完整代码)
Android手电筒控制全攻略从基础开关到状态监听附完整代码在移动应用开发中手电筒功能看似简单实则涉及相机硬件控制、状态同步、异常处理等多个技术要点。本文将带你深入Android手电筒控制的完整实现方案不仅涵盖基础API调用更重点解析如何构建健壮的状态监听体系解决多模块协同控制等实际问题。1. 手电筒控制基础架构Android系统通过CameraManager API提供手电筒控制能力但直接使用原始API会遇到几个典型问题需要处理相机权限和硬件可用性检查缺乏统一的状态管理机制多线程操作可能引发竞态条件我们首先构建一个基础控制类框架class FlashlightController private constructor(context: Context) { private val cameraManager: CameraManager context.getSystemService(Context.CAMERA_SERVICE) as CameraManager private var cameraId: String? null private var torchEnabled false init { initializeCamera() } private fun initializeCamera() { try { cameraId findFlashlightCameraId() } catch (e: CameraAccessException) { Log.e(TAG, Camera access error, e) } } // 其他方法实现... }注意CameraManager API要求Android 5.0(API 21)及以上版本且需要声明CAMERA权限2. 完整的生命周期管理手电筒控制需要妥善处理Activity/Fragment生命周期事件避免资源泄漏和状态不一致2.1 状态持久化方案方案优点缺点适用场景SharedPreferences实现简单不适合高频写入简单状态记录ViewModel生命周期感知进程终止会丢失单次会话状态持久化Service后台持续运行资源消耗大需要常驻后台推荐采用ViewModelSharedPreferences的组合方案class FlashlightViewModel(application: Application) : AndroidViewModel(application) { private val prefs PreferenceManager.getDefaultSharedPreferences(application) var isFlashlightOn: Boolean get() prefs.getBoolean(PREF_KEY_FLASHLIGHT, false) set(value) prefs.edit().putBoolean(PREF_KEY_FLASHLIGHT, value).apply() }2.2 多组件协同控制当多个组件都需要操作手电筒时需要建立中央控制机制使用单例模式确保全局唯一控制器实现观察者模式通知状态变化添加操作队列避免并发冲突object FlashlightManager { private val controller by lazy { FlashlightController(App.context) } private val listeners mutableListOfFlashlightListener() fun addListener(listener: FlashlightListener) { listeners.add(listener) listener.onStateChanged(controller.isEnabled) } fun toggleFlashlight() { controller.setTorchMode(!controller.isEnabled) listeners.forEach { it.onStateChanged(controller.isEnabled) } } }3. 高级状态监听与异常处理3.1 实时状态监听实现Android 6.0引入了TorchCallback API可以实时监听手电筒状态变化private val torchCallback object : CameraManager.TorchCallback() { override fun onTorchModeChanged(cameraId: String, enabled: Boolean) { if (cameraId thisFlashlightController.cameraId) { synchronized(thisFlashlightController) { torchEnabled enabled } dispatchStateChange(enabled) } } override fun onTorchModeUnavailable(cameraId: String) { if (cameraId thisFlashlightController.cameraId) { dispatchAvailabilityChange(false) } } } fun registerCallback() { cameraManager.registerTorchCallback(torchCallback, handler) }3.2 异常处理策略常见异常场景及处理方案CameraAccessException检查权限和相机服务状态IllegalStateException确保相机资源正确释放SecurityException验证权限声明和运行时请求fun setFlashlight(enabled: Boolean): Boolean { return try { cameraManager.setTorchMode(cameraId!!, enabled) true } catch (e: CameraAccessException) { Log.w(TAG, Failed to access camera, e) false } catch (e: IllegalArgumentException) { Log.w(TAG, Invalid camera ID, e) false } catch (e: SecurityException) { Log.w(TAG, Missing camera permission, e) false } }4. 完整实现与优化技巧4.1 完整控制器实现整合前述所有功能点的完整控制器类class AdvancedFlashlightController(context: Context) { private val cameraManager: CameraManager context.getSystemService(Context.CAMERA_SERVICE) as CameraManager private var cameraId: String? null private var handlerThread HandlerThread(FlashlightThread).apply { start() } private var handler Handler(handlerThread.looper) private val listeners mutableListOf(Boolean) - Unit() private val torchCallback object : CameraManager.TorchCallback() { override fun onTorchModeChanged(cameraId: String, enabled: Boolean) { notifyListeners(enabled) } } init { initializeCamera() cameraManager.registerTorchCallback(torchCallback, handler) } fun toggle(): Boolean { cameraId ?: return false val currentState isEnabled() return setTorchMode(!currentState) } fun cleanup() { cameraManager.unregisterTorchCallback(torchCallback) handlerThread.quitSafely() } // 其他辅助方法... }4.2 性能优化建议延迟初始化仅在需要时加载相机资源后台线程将耗时操作移出主线程资源释放及时注销回调避免内存泄漏电池状态检测低电量时禁用手电筒功能fun setTorchMode(enabled: Boolean): Boolean { if (isBatteryLow()) { Log.w(TAG, Battery too low for flashlight) return false } return try { cameraManager.setTorchMode(cameraId!!, enabled) true } catch (e: Exception) { Log.e(TAG, Failed to set torch mode, e) false } }在实际项目中我发现正确处理Activity重建场景特别重要。建议将手电筒状态保存在ViewModel中并在onCreate时恢复状态避免用户操作被意外中断。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2493669.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!