Flashlight app getting closed in background

孤街醉人 提交于 2019-12-11 23:43:49

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!