求助:实现监听系统手电筒开关并显示Toast的Android应用
实现Android手电筒状态监听(系统操作触发Toast提示)
你的代码无法工作的核心原因是:Android系统并没有提供android.hardware.action.Action_Torch_On这类广播来通知手电筒状态变化,自定义广播接收器自然无法接收到任何系统触发的事件。
正确的做法是使用Android官方提供的CameraManager.TorchCallback(API 23及以上可用),它专门用于监听设备手电筒的状态变更。以下是完整实现步骤:
1. 申请必要权限
在AndroidManifest.xml中添加权限:
<!-- Android 11及以下 --> <uses-permission android:name="android.permission.CAMERA" /> <!-- Android 12及以上,更精细的手电筒控制权限 --> <uses-permission android:name="android.permission.CAMERA_CONTROL_FLASH_TORCH" />
2. 实现TorchCallback监听逻辑
在Activity或Service中注册回调,监听手电筒的开启/关闭状态:
import android.Manifest; import android.content.pm.PackageManager; import android.hardware.camera2.CameraAccessException; import android.hardware.camera2.CameraManager; import android.os.Bundle; import android.widget.Toast; import androidx.appcompat.app.AppCompatActivity; import androidx.core.app.ActivityCompat; public class MainActivity extends AppCompatActivity { private CameraManager.TorchCallback torchCallback; private CameraManager cameraManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 初始化CameraManager cameraManager = (CameraManager) getSystemService(CAMERA_SERVICE); // 申请权限(如果未授权) if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA_CONTROL_FLASH_TORCH) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA, Manifest.permission.CAMERA_CONTROL_FLASH_TORCH}, 100); return; } // 初始化TorchCallback initTorchCallback(); } private void initTorchCallback() { torchCallback = new CameraManager.TorchCallback() { @Override public void onTorchModeChanged(String cameraId, boolean enabled) { super.onTorchModeChanged(cameraId, enabled); // 手电筒状态变更时触发 runOnUiThread(() -> { String toastMsg = enabled ? "手电筒已开启" : "手电筒已关闭"; Toast.makeText(MainActivity.this, toastMsg, Toast.LENGTH_SHORT).show(); }); } @Override public void onTorchModeUnavailable(String cameraId) { super.onTorchModeUnavailable(cameraId); // 手电筒不可用时触发(比如被其他应用占用) Toast.makeText(MainActivity.this, "手电筒不可用", Toast.LENGTH_SHORT).show(); } }; // 注册回调 try { // 监听所有可用摄像头的手电筒状态 for (String cameraId : cameraManager.getCameraIdList()) { cameraManager.registerTorchCallback(torchCallback, null); } } catch (CameraAccessException e) { e.printStackTrace(); Toast.makeText(this, "监听手电筒状态失败", Toast.LENGTH_SHORT).show(); } } @Override protected void onDestroy() { super.onDestroy(); // 注销回调,避免内存泄漏 if (torchCallback != null) { cameraManager.unregisterTorchCallback(torchCallback); } } @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == 100) { boolean allGranted = true; for (int result : grantResults) { if (result != PackageManager.PERMISSION_GRANTED) { allGranted = false; break; } } if (allGranted) { initTorchCallback(); } else { Toast.makeText(this, "需要授权才能监听手电筒状态", Toast.LENGTH_SHORT).show(); } } } }
关键说明
- 为什么不用BroadcastReceiver?:Android系统没有对外暴露手电筒状态变化的系统广播,自定义广播只能由你自己的应用发送,无法监听系统或其他应用的操作。
- TorchCallback的优势:这是Android官方提供的API,能准确监听所有应用(包括系统)对手电筒的状态修改,覆盖API 23+的所有设备。
- 权限注意事项:Android 12+需要单独申请
CAMERA_CONTROL_FLASH_TORCH权限,低版本用CAMERA权限即可。
内容的提问来源于stack exchange,提问作者Dhwani Patel
相关产品推荐
相关产品推荐

