Permalink
Switch branches/tags
Nothing to show
Find file
ff72df7 Feb 10, 2015
181 lines (157 sloc) 6.1 KB
package us.yydcdut.androidltest.otheractivity;
import android.app.Activity;
import android.content.Context;
import android.graphics.SurfaceTexture;
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.os.Bundle;
import android.util.Size;
import android.view.Surface;
import android.widget.CompoundButton;
import android.widget.Switch;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
import us.yydcdut.androidltest.R;
/**
* Created by yuyidong on 14-12-18.
*/
public class FlashActivity extends Activity {
private CameraCaptureSession mSession;
private CaptureRequest.Builder mBuilder;
private CameraDevice mCameraDevice;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.flash_activity);
try {
init();
} catch (CameraAccessException e) {
e.printStackTrace();
}
Switch flashSwitch = (Switch) findViewById(R.id.switch_flash);
//default of flash mode is on
flashSwitch.setChecked(true);
flashSwitch.setOnCheckedChangeListener(new MyCheckedChangeListener());
}
private CameraManager mCameraManager;
@SuppressWarnings("ResourceType")
private void init() throws CameraAccessException {
mCameraManager = (CameraManager) FlashActivity.this.getSystemService(Context.CAMERA_SERVICE);
//here to judge if flash is available
CameraCharacteristics cameraCharacteristics = mCameraManager.getCameraCharacteristics("0");
boolean flashAvailable = cameraCharacteristics.get(CameraCharacteristics.FLASH_INFO_AVAILABLE);
if (flashAvailable) {
mCameraManager.openCamera("0", new MyCameraDeviceStateCallback(), null);
} else {
Toast.makeText(FlashActivity.this, "Flash not available", Toast.LENGTH_SHORT).show();
//todo: throw Exception
}
mCameraManager.openCamera("0", new MyCameraDeviceStateCallback(), null);
}
private SurfaceTexture mSurfaceTexture;
private Surface mSurface;
/**
* camera device callback
*/
class MyCameraDeviceStateCallback extends CameraDevice.StateCallback {
@Override
public void onOpened(CameraDevice camera) {
mCameraDevice = camera;
//get builder
try {
mBuilder = camera.createCaptureRequest(CameraDevice.TEMPLATE_MANUAL);
//flash on, default is on
mBuilder.set(CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AF_MODE_AUTO);
mBuilder.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_TORCH);
List<Surface> list = new ArrayList<Surface>();
mSurfaceTexture = new SurfaceTexture(1);
Size size = getSmallestSize(mCameraDevice.getId());
mSurfaceTexture.setDefaultBufferSize(size.getWidth(), size.getHeight());
mSurface = new Surface(mSurfaceTexture);
list.add(mSurface);
mBuilder.addTarget(mSurface);
camera.createCaptureSession(list, new MyCameraCaptureSessionStateCallback(), null);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
@Override
public void onDisconnected(CameraDevice camera) {
}
@Override
public void onError(CameraDevice camera, int error) {
}
}
private Size getSmallestSize(String cameraId) throws CameraAccessException {
Size[] outputSizes = mCameraManager.getCameraCharacteristics(cameraId)
.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP)
.getOutputSizes(SurfaceTexture.class);
if (outputSizes == null || outputSizes.length == 0) {
throw new IllegalStateException(
"Camera " + cameraId + "doesn't support any outputSize.");
}
Size chosen = outputSizes[0];
for (Size s : outputSizes) {
if (chosen.getWidth() >= s.getWidth() && chosen.getHeight() >= s.getHeight()) {
chosen = s;
}
}
return chosen;
}
/**
* session callback
*/
class MyCameraCaptureSessionStateCallback extends CameraCaptureSession.StateCallback {
@Override
public void onConfigured(CameraCaptureSession session) {
mSession = session;
try {
mSession.setRepeatingRequest(mBuilder.build(), null, null);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
@Override
public void onConfigureFailed(CameraCaptureSession session) {
}
}
/**
* switch listener
*/
class MyCheckedChangeListener implements CompoundButton.OnCheckedChangeListener {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
try {
if (isChecked) {
mBuilder.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_TORCH);
mSession.setRepeatingRequest(mBuilder.build(), null, null);
} else {
mBuilder.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_OFF);
mSession.setRepeatingRequest(mBuilder.build(), null, null);
}
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
}
private void close() {
if (mCameraDevice == null || mSession == null) {
return;
}
mSession.close();
mCameraDevice.close();
mCameraDevice = null;
mSession = null;
}
@Override
protected void onDestroy() {
super.onDestroy();
close();
}
}