我正在练习构建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:将代码更新为我刚刚尝试运行的内容。
答案 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");
...
您会发现在许多情况下,您认为不起作用的代码实际上并未执行。当发生这种情况时,追溯到那里的路径,或者使用更多日志,或者使用调试器并逐步执行代码。