如何让手电筒应用程序中的手电筒关闭?
Posted
技术标签:
【中文标题】如何让手电筒应用程序中的手电筒关闭?【英文标题】:How do i get torch in flashlight app to turn off? 【发布时间】:2014-06-17 05:16:27 【问题描述】:我一直在为 android 制作手电筒应用程序,但遇到了几个问题,并且到目前为止能够修复它们。但是现在,当我运行该应用程序时,它会加载到我的 HTC 上并运行良好,直到我第四次按下手电筒电源按钮。我可以按一次它,它会打开。我第二次按下它,它就关闭了。我第三次按它,它又亮了。 我按了第四次,它不会关闭?帮忙?
public class MainActivity extends Activity
ImageButton powerButton;
private Camera camera;
private boolean isFlashOn;
private boolean hasFlash;
Parameters params;
@TargetApi(Build.VERSION_CODES.ECLAIR)
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
powerButton = (ImageButton) findViewById(R.id.power_button);
hasFlash = getApplicationContext().getPackageManager()
.hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH);
if (!hasFlash)
AlertDialog alert = new AlertDialog.Builder(MainActivity.this)
.create();
alert.setTitle("Notice");
alert.setMessage("I'm sorry, your device doesn't support flashlight!");
alert.setButton("Done", new DialogInterface.OnClickListener()
public void onClick(DialogInterface dialog, int which)
finish();
);
alert.show();
return;
getCamera();
toggleButtonImage();
powerButton.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
if (isFlashOn)
turnOffFlash();
else
turnOnFlash();
);
private void getCamera()
if (camera == null)
try
camera = Camera.open();
params = camera.getParameters();
catch (RuntimeException e)
Log.e("Failed to open camera. Alert: ", e.getMessage());
public void turnOnFlash()
if (!isFlashOn)
if (camera == null || params == null)
return;
params = camera.getParameters();
params.setFlashMode(Parameters.FLASH_MODE_TORCH);
camera.setParameters(params);
camera.startPreview();
isFlashOn = true;
toggleButtonImage();
private void turnOffFlash()
if (isFlashOn)
if (camera == null || params == null)
return;
params = camera.getParameters();
params.setFlashMode(Parameters.FLASH_MODE_OFF);
camera.setParameters(params);
camera.stopPreview();
isFlashOn = false;
toggleButtonImage();
private void toggleButtonImage()
if(isFlashOn)
powerButton.setImageResource(R.drawable.flashlight_on);
else
powerButton.setImageResource(R.drawable.flashlight_off);
@Override
protected void onDestroy()
super.onDestroy();
@Override
protected void onPause()
super.onPause();
turnOffFlash();
@Override
protected void onRestart()
super.onRestart();
@Override
protected void onResume()
super.onResume();
if(hasFlash)
turnOffFlash();
@Override
protected void onStart()
super.onStart();
getCamera();
@Override
protected void onStop()
super.onStop();
if (camera != null)
camera.release();
camera = null;
' 清单 - http://pastebin.com/Tw6LTemP ' Activity_main.xml - http://pastebin.com/Tga1agN7
【问题讨论】:
我知道其中的大部分内容都不相关,哈哈,但我只是展示了清单和所有内容都应该正确设置。 当然...嗯,它有助于缩小范围并显示相关,发布到所有其他内容的链接(pastebin) 好的,谢谢。完成! 【参考方案1】:至于您描述的症状,可能是 SurfaceView 崩溃。请从 logcat 发布您的错误日志。
另外,您在 onResume() 中的代码对我来说没有意义(尽管这不是您的问题的直接原因,对于您的问题的直接原因,请再次查看您的 logcat):
@Override
protected void onResume()
super.onResume();
if(hasFlash)
turnOffFlash();
我想你的意思是说 if (isFlashOn) turnOffFlash();但即使你纠正它,那仍然是错误的。
【讨论】:
是的,(isFlashOn) 就足够了。您建议我将 onResume() 更改为什么?这是我的 logcat 的链接:pastebin.com/sUS3tqDf 抱歉,logcat 没有告诉我们出了什么问题。在这一点上,我只是在 hasFlash/isFlashOn 上设置了一个断点,并通过它查看结果值是否符合您在每一步的期望。这会告诉你需要在 onResume() 中写什么【参考方案2】:我用来关闭手电筒的代码是:
private void turnOffFlash()
if (isFlashOn)
if (camera == null || params == null)
return;
params = camera.getParameters();
params.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
camera.setParameters(params);
camera.stopPreview();
isFlashOn = false;
【讨论】:
以上是关于如何让手电筒应用程序中的手电筒关闭?的主要内容,如果未能解决你的问题,请参考以下文章