2.9 简单的手电筒应用程序
Saketkumar Srivastav
2.9.1 问题
你希望在断电或者其他没有光线的条件下,将智能手机作为手电筒使用。
2.9.2 解决方案
开启智能手机或者Android设备上的相机LED闪光灯,并且保持长亮,以充当手电筒。在术语方面有些纠结,英国将手电筒称作“torch”,而北美称为“flashlight”(这反映在代码中使用的Parameter常量中的名称),尽管手电筒通常不会闪烁(flash),但是相机闪光灯会闪烁,因此,用相机的闪光灯作为手电筒非常好!
2.9.3 讨论
以下是应用开发之前的设计步骤:
1 . 访问手机的Camera对象。
2 . 访问Camera对象的参数。
3 . 获得相机支持的闪光灯模式。
4 . 在ON状态下将闪光灯参数设置为FLASH_MODE_TORCH,在OFF状态下设置为FLASH_OFF。
例2-11中的代码实现了应用程序必需的逻辑。
例2-11:将Android设备转化为手电筒
if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH)) {
mTorch = (ToggleButton) findViewById(R.id.toggleButton1);
mTorch.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
try{
if(cam != null){
cam = Camera.open();
}
camParams = cam.getParameters();
List<String> flashModes = camParams.getSupportedFlashModes();
if(isChecked){
if (flashModes.contains(Parameters.FLASH_MODE_TORCH)) {
camParams.setFlashMode(Parameters.FLASH_MODE_TORCH);
}else{
showDialog(MainActivity.this, FLASH_TORCH_NOT_SUPPORTED);
}
}else{
camParams.setFlashMode(Parameters.FLASH_MODE_OFF);
}
cam.setParameters(camParams);
cam.startPreview();
}catch (Exception e) {
e.printStackTrace();
cam.stopPreview();
cam.release();
}
}
});
}else{
showDialog(MainActivity.this, FLASH_NOT_SUPPORTED);
}
例2-12中实现的基本逻辑如下:
1 . 检查设备中闪光灯是否存在。
2 . 获得Camera对象,并且打开以供访问。
3 . 获得捕捉到的Camera对象的参数。
4 . 用getSupportedFlashModes()检查当前Camera对象所支持的闪光灯模式。
5 . 如果切换状态为ON,将相机闪光灯模式设置为FLASH_MODE_TORCH;否则,设置为FLASH_MODE_OFF。
例2-12:手电筒错误处理
public void showDialog (Context context, int dialogId){
switch(dialogId){
case FLASH_NOT_SUPPORTED:
builder = new AlertDialog.Builder(context);
builder.setMessage("Sorry, Your phone does not support Torch Mode")
.setCancelable(false)
.setNeutralButton("Close", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
finish();
}
});
alertDialog = builder.create();
alertDialog.show();
break;
case FLASH_TORCH_NOT_SUPPORTED:
builder = new AlertDialog.Builder(context);
builder.setMessage("Sorry, Your camera flash does not support torch feature")
.setCancelable(false)
.setNeutralButton("Close", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
finish();
}
});
alertDialog = builder.create();
alertDialog.show();
}
}