Android学习之手电筒程序(兼容6.0系统)

改进版FlashLightManager 请点击


Android自带的硬件类Camera在API21(5.0)之后被抛弃了,出现了Camera2,在做使用手机闪光灯的时候特意了解了一下。

直接上代码


package com.example.flashlighttest;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.graphics.SurfaceTexture;
import android.hardware.Camera;
import android.hardware.camera2.CameraAccessException;
import android.hardware.camera2.CameraCaptureSession;
import android.hardware.camera2.CameraCharacteristics;
import android.hardware.camera2.CameraDevice;
import android.hardware.camera2.CameraManager;
import android.hardware.camera2.CameraMetadata;
import android.hardware.camera2.CaptureRequest;
import android.hardware.camera2.params.StreamConfigurationMap;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.Surface;
import android.view.View;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by linzhiyong on 0020 06.20 .
 */
@SuppressLint("NewApi")
public class FlashLightActivity extends Activity{

    private final String TAG = "FlashLightActivity";

    /** Camera相机硬件操作类 */
    private Camera camera = null;

    /** Camera2相机硬件操作类 */
    private CameraManager manager = null;
    private CameraDevice cameraDevice;
    private CameraCaptureSession captureSession = null;
    private CaptureRequest request = null;
    private SurfaceTexture surfaceTexture;
    private Surface surface;
    private String cameraId = null;
    private boolean isSupportFlashCamera2 = false;
    private final CameraCaptureSession.StateCallback stateCallback = new CameraCaptureSession.StateCallback() {

        public void onConfigured(CameraCaptureSession arg0) {
            captureSession = arg0;
            CaptureRequest.Builder builder;
            try {
                builder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
                builder.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_TORCH);
                builder.addTarget(surface);
                request = builder.build();
                captureSession.capture(request, null, null);
            } catch (CameraAccessException e) {
                Log.e(TAG, e.getMessage());
            }
        };

        public void onConfigureFailed(CameraCaptureSession arg0) {
        };
    };

    private boolean isOpen = false;
    
    private ProgressDialog dialog = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        final TextView textView = new TextView(this);
        textView.setText("开启闪光灯");
        setContentView(textView);
        
        TextView textView1 = new TextView(this);
        textView1.setText("开启闪光灯");
        dialog = new ProgressDialog(this);
        try {
            dialog.setContentView(textView1);
            dialog.show();
		} catch (Exception e) {
			e.printStackTrace();
		}
        textView.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View view) {
//            	startActivity(new Intent(FlashLightActivity.this, MainActivity.class));
                if (isOpen) {
                    if (isLOLLIPOP()) {
                        if (cameraDevice != null) {
                            cameraDevice.close();
                        }
                    } else {
                        turnLightOffCamera(camera);
                    }
                    isOpen = false;
                    setText(textView, "闪光灯已关闭!");
                } else {
                    if (isLOLLIPOP()) {
                        try {
                            openCamera2Flash();
                        } catch (CameraAccessException e) {
                            Log.e(TAG, e.getMessage());
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    } else {
                        turnLightOnCamera(camera);
                    }
                    isOpen = true;
                    setText(textView, "闪光灯已开启!");
                }
            }
        });
        // 初始化Camera硬件
        this.manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
        if (isLOLLIPOP()) {
            initCamera2();
        } else {
            camera = Camera.open();
        }
    }

    /**
     *
     * @param view
     * @param context
     */
    private void setText(final TextView view, final String context) {
        FlashLightActivity.this.runOnUiThread(new Runnable() {

            @Override
            public void run() {
                view.setText(context);
            }
        });
    }

    /**
     * 初始化Camera2
     */
    private void initCamera2() {
        try {
            for (String cameraId : this.manager.getCameraIdList()) {
                CameraCharacteristics characteristics = this.manager.getCameraCharacteristics(cameraId);
                // 过滤掉前置摄像头
                Integer facing = characteristics.get(CameraCharacteristics.LENS_FACING);
                if (facing != null && facing == CameraCharacteristics.LENS_FACING_FRONT) {
                    continue;
                }
                StreamConfigurationMap map = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
                if (map == null) {
                    continue;
                }
                this.cameraId = cameraId;
                // 判断设备是否支持闪光灯
                this.isSupportFlashCamera2 = characteristics.get(CameraCharacteristics.FLASH_INFO_AVAILABLE);
            }
        } catch (CameraAccessException e) {
            Log.e(TAG, e.getMessage());
        }
    }

    /**
     * 调用Camera2开启闪光灯
     *
     * @throws CameraAccessException
     */
    private void openCamera2Flash() throws CameraAccessException {
        manager.openCamera(cameraId, new CameraDevice.StateCallback() {

            @Override
            public void onOpened(CameraDevice camera) {
                cameraDevice = camera;
                createCaptureSession();
            }

            @Override
            public void onError(CameraDevice camera, int error) {
            }

            @Override
            public void onDisconnected(CameraDevice camera) {
            }
        }, null);
    }

    /**
     * createCaptureSession
     */
    @SuppressWarnings({ "rawtypes", "unchecked" })
    private void createCaptureSession() {
        this.surfaceTexture = new SurfaceTexture(0, false);
		this.surfaceTexture.setDefaultBufferSize(1280, 720);
        this.surface = new Surface(this.surfaceTexture);
        ArrayList localArrayList = new ArrayList(1);
        localArrayList.add(this.surface);
        try {
            this.cameraDevice.createCaptureSession(localArrayList, this.stateCallback, null);
        } catch (CameraAccessException e) {
            Log.e(TAG, e.getMessage());
        }
    }

    /**
     * 通过设置Camera打开闪光灯
     *
     * @param mCamera
     */
    public void turnLightOnCamera(Camera mCamera) {
        Camera.Parameters parameters = camera.getParameters();
        List<String> flashModes = parameters.getSupportedFlashModes();
        String flashMode = parameters.getFlashMode();
        if (!Camera.Parameters.FLASH_MODE_TORCH.equals(flashMode)) {
            // 开启闪光灯
            if (flashModes.contains(Camera.Parameters.FLASH_MODE_TORCH)) {
                parameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
                mCamera.setParameters(parameters);
            }
        }
    }

    /**
     * 通过设置Camera关闭闪光灯
     *
     * @param mCamera
     */
    public void turnLightOffCamera(Camera mCamera) {
        Camera.Parameters parameters = mCamera.getParameters();
        List<String> flashModes = parameters.getSupportedFlashModes();
        String flashMode = parameters.getFlashMode();
        if (!Camera.Parameters.FLASH_MODE_OFF.equals(flashMode)) {
            // 关闭闪光灯
            if (flashModes.contains(Camera.Parameters.FLASH_MODE_OFF)) {
                parameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
                mCamera.setParameters(parameters);
            }
        }
    }

    /**
     * 判断Android系统版本是否 >= LOLLIPOP(API21)
     *
     * @return boolean
     */
    private boolean isLOLLIPOP() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            return true;
        } else {
            return false;
        }
    }

}



demo下载

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值