且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

《Android应用开发攻略》——2.9 简单的手电筒应用程序

更新时间:2022-09-27 12:55:48

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();
       }
}