手电筒应用程序在后台关闭

时间:2013-06-18 06:12:54

标签: android flashlight

我正在开发一个手电筒应用程序,问题是该应用程序正在按预期工作,但不是按下“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;

    }

}

4 个答案:

答案 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;
   // }
}