问题
I am developing a flashlight app and the thing is that the app is working as expected, but not when "home" or "back" key is pressed. i want my app to keep the torch light on even when the user presses "Home" key so that user can do other works while torch is on. On back key, the flash turning off is fine. Here is my code. Please help me with it, thanx a lot to all.
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;
}
}
回答1:
Got solution.
What you should do is, write all the code like following in onBackPressed
. I merge two methods code in one method.
@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");
}
And remove all the code from onStop()
and onPause()
method. Because when you press Home
key, it calls first onPause()
and then onStop()
. I implement your code and worked fine for me.
回答2:
Change you onPause()
to this and also onStop()
if you need to
@Override
protected void onPause() {
super.onPause();
}
and add this
@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;
}
回答3:
Got it, The answer is to simply superimpose onPause() method and then, turn off the flash in the onBackPressed() method.
@Override
protected void onPause() {
super.onPause();
}
this is onBackPressed()
@Override
protected void onBackPressed() {
super.onBackPressed();
myparas = mycamera.getParameters();
myparas.setFlashMode(Parameters.FLASH_MODE_OFF);
mycamera.setParameters(myparas);
mycamera.stopPreview();
flashon=false;
}
Although now I can see that the answers provided above are also suggesting same as wel.. So its a well proven answer now I guess. @akshat should go for it..
回答4:
Here I Modified the code set !
It worked for me ! Thanks
@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;
// }
}
来源:https://stackoverflow.com/questions/17161711/flashlight-app-getting-closed-in-background