2016-02-26 46 views
0

林制作一个应用程序对于打开/关闭LED在手机的我能理解什么即时做错了,我得到这个错误释放后调用的方法()相机错误?

E/AndroidRuntime: FATAL EXCEPTION: Thread-42530 
java.lang.RuntimeException: Method called after release() 
    at android.hardware.Camera.startPreview(Native Method) 
    at com.mashi.flashlight.FlashLightCallingService.flashOn(FlashLightCallingService.java:104) 
    at com.mashi.flashlight.FlashLightCallingService$1.run(FlashLightCallingService.java:45) 
    at java.lang.Thread.run(Thread.java:856) 

我的代码是

public class FlashLightCallingService extends Service { 

    Boolean hasFlash; 
    Boolean isFlashOn=true ; 
    Camera camera; 
    Camera.Parameters parameters; 


    @Override 
    public void onCreate() { 

     hasFlash = getApplicationContext().getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH); 

    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 


     getCamera(); 
     if (hasFlash) 
     { 
       new Thread(new Runnable(){ 
        public void run() { 
         // TODO Auto-generated method stub 
         while(isFlashOn) 
         { 
          flashOn(); 
          //flashOff(); 
         } 

        } 
       }).start(); 
     } 
     else 
     { 
      System.exit(1); 
     } 
     return START_STICKY; 
    } 

    @Override 
    public IBinder onBind(Intent intent) { 
     return null; 
    } 


    @Override 
    public void onDestroy() { 
     super.onDestroy(); 

     isFlashOn=false; 
     if (camera != null) { 
      camera.stopPreview(); 
      camera.release(); 
      camera = null; 
     } 
    } 

    public void getCamera(){ 

     if (camera==null) 
     { 
      try { 
       camera=Camera.open(); 
       parameters=camera.getParameters(); 
      }catch (Exception e) 
      { 
       e.printStackTrace(); 
      } 
     } 
    } 


    public void flashOn(){ 
      parameters = camera.getParameters(); 
      parameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH); 
      camera.setParameters(parameters); 
      camera.startPreview(); 
    } 

    public void flashOff(){ 
      parameters = camera.getParameters(); 
      parameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF); 
      camera.setParameters(parameters); 
      camera.stopPreview(); 

    } 


} 

抱歉语言但英语不是我的语言

+0

我已经做只是使用ansynctask和更良好或与此代码就在我设置isFlashOn =假做线程。睡觉(250)和其他东西在if循环中获得threade如果(isFlashOn)我已经完成了这个工作并且对我有效,也许有人像我一样有相同的问题 –

回答

0

您有一个线程在服务被销毁后继续运行。线程在Service完成onDestroy()回调后调用摄像头对象的方法。

至少你应该确定你的线程在服务被销毁时停止,并且它在释放后不能再调用相机上的方法。

而且,你永远不应该有充分的理由在一个Android应用程序要做到这一点:

 System.exit(1); 
+0

你能帮我一下吗?因为在我的摧毁中, “isFlashOn = false”,所以在这个时候循环会停止吗? –

+0

如果您正在访问两个不同线程之间的值,则必须同步对该值的访问权限,否则可能会出现竞争条件。在Java中,线程不会立即看到彼此的变化。 –

+0

所以你推荐使用任何示例代码,因为即时通讯新的如果你可以感谢 –