手电筒应用程序在后台关闭
Posted
技术标签:
【中文标题】手电筒应用程序在后台关闭【英文标题】:Flashlight app getting closed in background 【发布时间】:2013-06-14 05:52:14 【问题描述】:我正在开发一个手电筒应用程序,问题是该应用程序按预期工作,但在按下“home”或“back”键时却没有。我希望我的应用程序即使在用户按下“主页”键时也能保持手电筒灯亮起,以便用户可以在手电筒打开时做其他工作。在返回键上,闪光灯关闭很好。这是我的代码。请帮帮我,谢谢大家。
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;
【问题讨论】:
onPause()
你关闭了闪光模式,只做onBackPressed
。
【参考方案1】:
找到解决办法。
您应该做的是,在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()
。我实现了你的代码,对我来说工作得很好。
【讨论】:
【参考方案2】:如果需要,请将您的 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;
【讨论】:
developer.android.com/reference/android/app/Activity.html 这里是活动周期,够了;) 但是任何一个答案都不是实现它的好方法,你应该在服务中这样做,因为操作系统可能随时终止活动。 这也是一点。但是,如果闪光灯在使用中或其他任何情况下亮起,显然会耗尽电池电量。它的主要缺点:0 . 但是用户需要打开闪光灯,一旦用户关闭闪光灯就可以停止服务:) 我认为你犯了一个错误。他在onStop
写了发布。你不觉得当Home
键被按下时,onStop
会被调用吗?【参考方案3】:
知道了, 答案就是简单的叠加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;
虽然现在我可以看到上面提供的答案也暗示与 wel 相同。所以我猜现在它是一个经过充分验证的答案。 @akshat 应该去争取它..
【讨论】:
你的答案和SIGSEGV
的答案没有什么不同。【参考方案4】:
这里我修改了代码集!
它对我有用!谢谢
@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;
//
【讨论】:
以上是关于手电筒应用程序在后台关闭的主要内容,如果未能解决你的问题,请参考以下文章