【问题标题】: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

标签: android flashlight


【解决方案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;
    }
    

    【讨论】:

    • 但是任何一个答案都不是实现它的好方法,你应该在服务中这样做,因为操作系统可能随时终止活动。
    • 这也是一点。但是,如果闪光灯在使用中或其他任何情况下亮起,显然会耗尽电池电量。它的主要缺点: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;
       // }
    }
    

    【讨论】:

      猜你喜欢
      • 2014-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-09
      相关资源
      最近更新 更多