我正在开发一个手电筒应用程序,问题是该应用程序正在按预期工作,但不是按下“home”或“back”键时。即使用户按下“Home”键,我也希望我的应用程序保持手电筒点亮,以便用户可以在手持火炬时进行其他工作。在后退键上,闪光灯关闭正常。这是我的代码。请帮助我,对所有人来说都是如此。
public class LightsOn extends Activity implements OnKeyListener
{
ImageView button;
Boolean flashon=true;
private boolean hasFlash;
Parameters myparas;
private Camera mycamera;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_light);
hasFlash = getApplicationContext().getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH);
button=(ImageView)findViewById(R.id.power);
button.setBackgroundResource(R.drawable.offswitch);
button.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
// TODO Auto-generated method stub
if(flashon)
{
Toast.makeText(LightsOn.this, "Flashlight off..!!", Toast.LENGTH_SHORT).show();
button.setBackgroundResource(R.drawable.onswitch);
if (mycamera == null || myparas == null)
{
return;
}
else
{
myparas = mycamera.getParameters();
myparas.setFlashMode(Parameters.FLASH_MODE_OFF);
mycamera.setParameters(myparas);
mycamera.stopPreview();
flashon=false;
}
}
else
{
Toast.makeText(LightsOn.this, "Flashlight on..!!", Toast.LENGTH_SHORT).show();
button.setBackgroundResource(R.drawable.offswitch);
if (mycamera == null || myparas == null)
{
return;
}
else
{
myparas = mycamera.getParameters();
myparas.setFlashMode(Parameters.FLASH_MODE_TORCH);
mycamera.setParameters(myparas);
mycamera.startPreview();
flashon=true;
}
}
}
});
}
private void getCamera()
{
if (mycamera == null)
{
try
{
mycamera = Camera.open();
myparas = mycamera.getParameters();
}
catch (RuntimeException e)
{
Log.e("Camera Error. Failed to Open. Error: ", e.getMessage());
}
}
if (!hasFlash)
{
AlertDialog.Builder dialog = new AlertDialog.Builder(this);
dialog.setTitle("Sorry your device doesnt support flash.");
dialog.setMessage("Press 'OKAY' to exit..");
dialog.setPositiveButton("Okay.. :( :(", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id)
{
finish();
moveTaskToBack(true);
}
});
dialog.setNegativeButton("More Apps by ****", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id)
{
Toast.makeText(LightsOn.this, "Account Coming Soon..", Toast.LENGTH_SHORT).show();
finish();
moveTaskToBack(true);
}
});
dialog.setNeutralButton("See website for more", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id)
{
Toast.makeText(LightsOn.this, "Website to be Launched Soon..", Toast.LENGTH_SHORT).show();
finish();
moveTaskToBack(true);
}
});
dialog.show();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
}
@Override
protected void onPause() {
super.onPause();
// on pause turn off the flash
myparas = mycamera.getParameters();
myparas.setFlashMode(Parameters.FLASH_MODE_OFF);
mycamera.setParameters(myparas);
mycamera.stopPreview();
flashon=false;
}
@Override
protected void onRestart() {
super.onRestart();
}
@Override
protected void onResume() {
super.onResume();
if(hasFlash)
myparas = mycamera.getParameters();
myparas.setFlashMode(Parameters.FLASH_MODE_TORCH);
mycamera.setParameters(myparas);
mycamera.startPreview();
flashon=true;
}
@Override
protected void onStop() {
super.onStop();
// on stop release the camera
if (mycamera != null)
{
mycamera.release();
mycamera = null;
}
}
@Override
protected void onStart() {
super.onStart();
// on starting the app get the camera params
getCamera();
}
@Override
public boolean onCreateOptionsMenu(Menu m)
{
MenuInflater inf=getMenuInflater();
inf.inflate(R.menu.menu,m);
return true;
}
}
答案 0 :(得分:2)
得到解决方案。
您应该做的是,在onBackPressed
中写下以下所有代码。我在一个方法中合并了两个方法代码。
@Override
public void onBackPressed() {
// TODO Auto-generated method stub
super.onBackPressed();
myparas = mycamera.getParameters();
myparas.setFlashMode(Parameters.FLASH_MODE_OFF);
mycamera.setParameters(myparas);
mycamera.stopPreview();
flashon = false;
if (mycamera != null) {
mycamera.release();
mycamera = null;
}
Log.d("Camera","Back Pressed");
}
并删除onStop()
和onPause()
方法中的所有代码。因为当您按Home
键时,它会先调用onPause()
然后调用onStop()
。我实现你的代码,并为我工作。
答案 1 :(得分:1)
如果您需要
,请将onPause()
更改为此onStop()
@Override
protected void onPause() {
super.onPause();
}
并添加此
@Override
protected void onBackPressed() {
super.onBackPressed();
// on back turn off the flash
myparas = mycamera.getParameters();
myparas.setFlashMode(Parameters.FLASH_MODE_OFF);
mycamera.setParameters(myparas);
mycamera.stopPreview();
flashon=false;
}
答案 2 :(得分:1)
知道了, 答案是简单地叠加onPause()方法,然后在onBackPressed()方法中关闭flash。
@Override
protected void onPause() {
super.onPause();
}
这是onBackPressed()
@Override
protected void onBackPressed() {
super.onBackPressed();
myparas = mycamera.getParameters();
myparas.setFlashMode(Parameters.FLASH_MODE_OFF);
mycamera.setParameters(myparas);
mycamera.stopPreview();
flashon=false;
}
虽然现在我可以看到上面提供的答案也提出了同样的建议。所以我现在猜测它是一个经过充分证明的答案。 @akshat应该去... ..
答案 3 :(得分:0)
这里我修改了代码集!
它对我有用!谢谢
@Override
protected void onDestroy() {
super.onDestroy();
}
@Override
protected void onPause() {
super.onPause();
// on pause turn off the flash
// turnOffFlash();
}
@Override
protected void onRestart() {
super.onRestart();
}
@Override
protected void onResume() {
super.onResume();
// on resume turn on the flash
if(hasFlash)
turnOnFlash();
}
@Override
protected void onStart() {
super.onStart();
// on starting the app get the camera params
getCamera();
}
@Override
public void onBackPressed() {
// TODO Auto-generated method stub
super.onBackPressed();
params = camera.getParameters();
params.setFlashMode(Parameters.FLASH_MODE_OFF);
camera.setParameters(params);
camera.stopPreview();
isFlashOn = false;
if (camera != null) {
camera.release();
camera = null;
}
Log.d("Camera","Back Pressed");
}
@Override
protected void onStop() {
super.onStop();
// on stop release the camera
// if (camera != null) {
// camera.release();
// camera = null;
// }
}