2015-05-08 30 views
0

嘿家伙我正在使用在线教程手电筒应用程序。我对应用做了一些改变。如果用户进入主屏幕或锁定屏幕,我希望手电筒保持开启状态。但是,当我这样做并打开默认相机应用程序,然后再次打开我的手电筒应用程序,手电筒不再工作。手电筒应用程序onResume不起作用?

步骤来重现错误:

  1. 在App开启(开启闪光灯自动)
  2. 按下主屏幕按钮(闪光灯岿然不动)
  3. 打开默认的摄像头应用程序(闪光灯关闭)
  4. 开放手电筒应用程序(开/关按钮不起作用,闪光灯保持关闭)

我的代码:

package ali.simpleflaslight; 

import android.app.Activity; 
import android.os.Bundle; 
import android.app.AlertDialog; 
import android.content.DialogInterface; 
import android.content.pm.PackageManager; 
import android.hardware.Camera; 
import android.hardware.Camera.Parameters; 
import android.media.MediaPlayer; 
import android.media.MediaPlayer.OnCompletionListener; 
import android.view.View; 
import android.widget.ImageButton; 

public class MainActivity extends Activity { 

    ImageButton btnSwitch; 
    private Camera camera; 
    private boolean isFlashOn; 
    private boolean hasFlash; 
    Parameters params; 
    MediaPlayer mp; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     try { 
     //================================== Flash Switch Button =============================// 
     btnSwitch = (ImageButton) findViewById(R.id.btnSwitch); 
     //================================== First Check =====================================// 
     hasFlash = getApplicationContext().getPackageManager() 
      .hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH); 

     if (!hasFlash) { 
      AlertDialog alert = new AlertDialog.Builder(MainActivity.this) 
      .create(); 
      alert.setTitle("Error"); 
      alert.setMessage("Sorry, your device doesn't support a flashlight!"); 
      alert.setButton("OK", new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int which) { 
       // closing the application 
       finish(); 
      } 
      }); 
      alert.show(); 
      return; 
     } 
     getCamera(); 
     toggleButtonImage(); 
     btnSwitch.setOnClickListener(new View.OnClickListener() {@ 
      Override 
      public void onClick(View v) { 
      if (isFlashOn) { 
       // turn off flash 
       turnOffFlash(); 
      } else { 
       // turn on flash 
       turnOnFlash(); 
      } 
      } 
     }); 
     } catch (Exception e) {} 
    } 
    //====================================== Getting Camera Parameters ===========================// 
    private void getCamera() { 
     try { 
     if (camera == null) { 
      try { 
      camera = Camera.open(); 
      params = camera.getParameters(); 
      } catch (Exception e) {} 
     } 
     } catch (Exception e) {} 
    } 
    //====================================== Turning On Flash ====================================// 
    private void turnOnFlash() { 
     try { 
     if (!isFlashOn) { 
      if (camera == null || params == null) { 
      return; 
      } 
      //Play Sound 
      playSound(); 

      params = camera.getParameters(); 
      params.setFlashMode(Parameters.FLASH_MODE_TORCH); 
      camera.setParameters(params); 
      camera.startPreview(); 
      isFlashOn = true; 

      //Changing Button/Switch Image 
      toggleButtonImage(); 
     } 
     } catch (Exception e) {} 
    } 
    //====================================== Turning Off Flash ===================================// 
    private void turnOffFlash() { 
     try { 
     if (isFlashOn) { 
      if (camera == null || params == null) { 
      return; 
      } 
      //Play Sound 
      playSound(); 

      params = camera.getParameters(); 
      params.setFlashMode(Parameters.FLASH_MODE_OFF); 
      camera.setParameters(params); 
      camera.stopPreview(); 
      isFlashOn = false; 

      //Changing Button/Switch Image 
      toggleButtonImage(); 
     } 
     } catch (Exception e) {} 
    } 
    //====================================== Toggle Image ========================================// 
    private void toggleButtonImage() { 
     try { 
     if (isFlashOn) { 
      btnSwitch.setImageResource(R.drawable.btn_switch_on); 
     } else { 
      btnSwitch.setImageResource(R.drawable.btn_switch_off); 
     } 
     } catch (Exception e) {} 
    } 
    //====================================== Play Sound ==========================================// 
    private void playSound() { 
    try { 
     if (isFlashOn) { 
     mp = MediaPlayer.create(MainActivity.this, R.raw.light_switch_off); 
     } else { 
     mp = MediaPlayer.create(MainActivity.this, R.raw.light_switch_on); 
     } 
     mp.setOnCompletionListener(new OnCompletionListener() { 

     @Override 
     public void onCompletion(MediaPlayer mp) { 
      // TODO Auto-generated method stub 
      mp.release(); 
     } 
     }); 
     mp.start(); 
    } catch (Exception e) {} 
    } 

    @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 
    protected void onStop() { 
    super.onStop(); 
    // on stop release the camera 
    /*if (camera != null) { 
     camera.release(); 
     camera = null; 
    }*/ 
    } 
} 

我在onStop中评论代码后,该应用停止工作。看到Playstore中支持后台闪存的所有顶级手电筒应用程序,如果遵循上述步骤停止工作是令人惊讶的。然而,对于我来说,这个应用只会停止做任何事情,因为我尝试了一些流行短语。有没有解决这个问题的方法?

编辑:

把getCamera的的onResume之前(和做与上面相同的步骤)后的错误:

05 - 08 19: 41: 10.955 4378 - 4378/ali.simpleflaslight W/System.err﹕ java.lang.RuntimeException: getParameters failed(empty parameters) 
 
05 - 08 19: 41: 10.955 4378 - 4378/ali.simpleflaslight W/System.err﹕ at android.hardware.Camera.native_getParameters(Native Method) 
 
05 - 08 19: 41: 10.955 4378 - 4378/ali.simpleflaslight W/System.err﹕ at android.hardware.Camera.getParameters(Camera.java: 2075) 
 
05 - 08 19: 41: 10.955 4378 - 4378/ali.simpleflaslight W/System.err﹕ at ali.simpleflaslight.MainActivity.turnOffFlash(MainActivity.java: 114) 
 
05 - 08 19: 41: 10.956 4378 - 4378/ali.simpleflaslight W/System.err﹕ at ali.simpleflaslight.MainActivity.access$100(MainActivity.java: 15) 
 
05 - 08 19: 41: 10.956 4378 - 4378/ali.simpleflaslight W/System.err﹕ at ali.simpleflaslight.MainActivity$2.onClick(MainActivity.java: 56) 
 
05 - 08 19: 41: 10.956 4378 - 4378/ali.simpleflaslight W/System.err﹕ at android.view.View.performClick(View.java: 4764) 
 
05 - 08 19: 41: 10.956 4378 - 4378/ali.simpleflaslight W/System.err﹕ at android.view.View$PerformClick.run(View.java: 19833) 
 
05 - 08 19: 41: 10.956 4378 - 4378/ali.simpleflaslight W/System.err﹕ at android.os.Handler.handleCallback(Handler.java: 739) 
 
05 - 08 19: 41: 10.956 4378 - 4378/ali.simpleflaslight W/System.err﹕ at android.os.Handler.dispatchMessage(Handler.java: 95) 
 
05 - 08 19: 41: 10.956 4378 - 4378/ali.simpleflaslight W/System.err﹕ at android.os.Looper.loop(Looper.java: 135) 
 
05 - 08 19: 41: 10.956 4378 - 4378/ali.simpleflaslight W/System.err﹕ at android.app.ActivityThread.main(ActivityThread.java: 5292) 
 
05 - 08 19: 41: 10.956 4378 - 4378/ali.simpleflaslight W/System.err﹕ at java.lang.reflect.Method.invoke(Native Method) 
 
05 - 08 19: 41: 10.956 4378 - 4378/ali.simpleflaslight W/System.err﹕ at java.lang.reflect.Method.invoke(Method.java: 372) 
 
05 - 08 19: 41: 10.956 4378 - 4378/ali.simpleflaslight W/System.err﹕ at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java: 908) 
 
05 - 08 19: 41: 10.956 4378 - 4378/ali.simpleflaslight W/System.err﹕ at com.android.internal.os.ZygoteInit.main(ZygoteInit.java: 703)

回答

0

首先,你必须try/catch块,其中catch(Exception e)块呢绝对没有 - 从来没有这样做 - 这可能是编程例外的最糟糕的方法之一。至少在catch块中添加e.printStackTrace(),然后监控logcat的异常情况 - 我敢肯定你会发现有一些正在被记录。其次,每次只有一个应用程序可以使用相机。最佳做法是release()相机在onPause()方法和open()它再次在onResume()。正如你想让手电筒一直处于工作状态,那么对你来说可能是不可接受的 - 相机 - 内置相机几乎肯定会按照最佳做法进行操作,并且当它拨打电话open()时,手电筒将会关闭,然后它将会release()让相机处于“重置”阶段。

尝试从onCreate(...)法去调用getCamera(),并把它放在onResume()代替(调用turnOnFlash()之前。

+0

谢谢您的回答,我说的printStackTrace我的渔获。 –