You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:实现监听系统手电筒开关并显示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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 11:20:29