打开和关闭Android后置闪关灯

package fengxing.primer.study2;

import android.content.Context;
import android.hardware.camera2.CameraAccessException;
import android.hardware.camera2.CameraManager;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.widget.CompoundButton;
import android.widget.Switch;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;

import java.util.List;

public class CameraActivity extends AppCompatActivity {

    private static final String TAG = CameraActivity.class.getSimpleName();
    //相机特新管理
    private CameraManager cameraManager;
    //回调函数
    private CameraManager.TorchCallback torchCallback;

    private String[] cameraList;
    //开关
    private Switch aSwitch;

    @RequiresApi(api = Build.VERSION_CODES.M)
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_camera);
        initFlashLight();
        initListener();
    }

    /**
     * 设置switch开关监听
     */
    private void initListener() {
        aSwitch = findViewById(R.id.switch_light);
        aSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @RequiresApi(api = Build.VERSION_CODES.M)
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if (cameraList==null)return;
                try {
                    cameraManager.setTorchMode(cameraList[0],isChecked);
                } catch (CameraAccessException e) {
                    e.printStackTrace();
                }
                Log.d(TAG, "onCheckedChanged: "+cameraList.toString());
            }
        });
    }

    /**
     * 初始化闪光灯
     */
    @RequiresApi(api = Build.VERSION_CODES.M)
    private void initFlashLight() {
        cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
        torchCallback = new CameraManager.TorchCallback(){
            //闪关灯改变
            @Override
            public void onTorchModeChanged(@NonNull String cameraId, boolean enabled) {
                super.onTorchModeChanged(cameraId, enabled);
                Log.d(TAG, "onTorchModeChanged: "+cameraId+"   "+ enabled);
            }

            //闪关灯不可用
            @Override
            public void onTorchModeUnavailable(@NonNull String cameraId) {
                super.onTorchModeUnavailable(cameraId);
                Log.d(TAG, "onTorchModeUnavailable: ");
                Toast.makeText(getApplicationContext(),"电筒不可用",Toast.LENGTH_SHORT);
            }
        };

        //获取相机列表
        try {
           cameraList = cameraManager.getCameraIdList();
        } catch (CameraAccessException e) {
            e.printStackTrace();
        }

        //使其在一个handle机制中运行
        cameraManager.registerTorchCallback(torchCallback,new Handler());
    }

    @RequiresApi(api = Build.VERSION_CODES.M)
    @Override
    protected void onDestroy() {
        super.onDestroy();
        cameraManager.unregisterTorchCallback(torchCallback);
    }
}
Android Studio 11版并未发布官方确切版本,通常最新版本的是Android Studio 4.x系列。然而,我可以为你解释如何在Android Studio(假设当前使用的是较新的版本)中动态地打开后置摄像头。在实际开发中,你可以按照以下步骤操作: 1. 首先,确保你的项目已经添加了CameraX库,这是Android 10及以上版本推荐使用的拍照框架。如果你还没有集成,可以在build.gradle文件中添加依赖: ```groovy dependencies { implementation 'androidx.camera:camera-core:1.0.0' implementation 'androidx.camera:camera-camera2:1.0.0' } ``` 2. 在需要打开摄像头的Activity或Fragment中,创建`CameraSelector`选择后置摄像头: ```java private CameraSelector cameraSelector = new CameraSelector.Builder() .requireLensFacing(CameraSelector.LENS_FACING_BACK) .build(); ``` 3. 使用`CameraManager`请求权限并启动相机: ```java CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE); String[] cameraIds = manager.getCameraIdList(); if (cameraIds != null && cameraIds.length > 0) { String selectedCameraId = cameraIds[0]; // 假设只有一个后置相机 try { manager.openCamera(selectedCameraId, lensFacingCallback, null); } catch (CameraAccessException e) { Log.e("Camera", "Error opening camera", e); } } // 创建相机回调(LensFacingCallback)处理镜头方向变化等事件 private final CameraDevice.StateCallback lensFacingCallback = new CameraDevice.StateCallback() { @Override public void onOpened(@NonNull CameraDevice camera) { // 进行后续的拍照、预览设置 } // 其他方法... }; ``` 4. 在`onOpened()`方法中,可以配置相机视图(如SurfaceView或TextureView),然后开始预览。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值