Torch / Flashlight在Android应用程序中无法启动

时间:2014-10-28 23:39:41

标签: android android-studio

我正在练习构建Android应用程序,从手电筒开始,这将是一个很好的初学者步骤。让我的代码多次爆炸后,我让应用程序稳定,不再强行关闭。

然而,LED相机闪光灯并没有像我希望的那样开启。

任何关于我做错事情的见解都会有所帮助。

public class PMATorch extends Activity {

private Camera camera;
private Button button;
private Camera.Parameters param;
private boolean torchStat = false;
public Camera getCameraInstance() {
    Camera c = null;
    try {
        c = camera.open();
    } catch (Exception e) {
    }
    return c;
}

private void torchOn(){
    if (camera != null){
        Parameters param = camera.getParameters();
        param.setFlashMode(Parameters.FLASH_MODE_TORCH);
        camera.setParameters(param);
        camera.startPreview();
        torchStat = true;
    }
}
private void torchOff(){
    if (camera != null){
        Parameters param = camera.getParameters();
        param.setFlashMode(Parameters.FLASH_MODE_OFF);
        camera.setParameters(param);
        camera.stopPreview();
        torchStat = false;
    }
}

@Override
protected void onDestroy() {
    if (camera != null) {
        camera.release();
        camera = null;
    }
    super.onDestroy();
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_pmatorch);
    camera = getCameraInstance();
    button = (Button) findViewById(R.id.torchOnOff);
    button.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {

            if (torchStat = false) {
                torchOn();

            } else {
                torchOff();
            }
        }
    });
}
}

编辑:我拥有在AndroidManifest.xml中设置的权限和功能。

编辑2:将代码更新为我刚刚尝试运行的内容。

2 个答案:

答案 0 :(得分:2)

请尝试在您的torchOn()方法上使用Parameters.FLASH_MODE_ON,而不是使用Parameters.FLASH_MODE_TORCH

根据相机参数的documentation

  

Parameters.FLASH_MODE_ON:快照期间将始终触发Flash   Parameters.FLASH_MODE_TORCH:预览,自动对焦和快照期间持续发光。

根据我的理解,使用Parameters.FLASH_MODE_ON只能立即打开灯光或仅在拍摄照片时打开灯光。 Parameters.FLASH_MODE_TORCH不断发光,因此此选项符合按下按钮时打开灯的要求。

可以找到关于创建手电筒应用程序的精彩教程here

答案 1 :(得分:2)

private Camera camera;

永远不会分配任何东西。因此if (camera != null){中的torchOn将无法执行任何操作。你可能想做类似的事情:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    camera = getCameraInstance(); // << 

public Camera getCameraInstance() {
    Camera c = null;
    try {
        c = camera.open();
    } catch (Exception e) {
    }
    return c;
}

还有2个小问题: * catch (Exception e) {}隐藏了任何可能出错的地方。我至少会添加一个像Log.e("PMATorch", "getCameraInstance", e)这样的日志语句。 *宇宙问题:camera.open()乍一看尖叫NullPointerException。更改为Camera.open() - 该方法是静态的,属于该类。

E.g。 (如果你摆脱局部变量,IMO会更好地阅读,所以我也删除了它)

public Camera getCameraInstance() {
    try {
        return Camera.open();
    } catch (Exception e) {
        Log.e("PMATorch", "getCameraInstance", e);
        return null;
    }
}

进一步帮助调试此类问题。将日志添加到实际导致似乎不起作用的操作的位置。

private void torchOn(){
    if (camera != null){
        Log.d("PMATorch", "now actually turning on");
        ...

您会发现在许多情况下,您认为不起作用的代码实际上并未执行。当发生这种情况时,追溯到那里的路径,或者使用更多日志,或者使用调试器并逐步执行代码。