2016-02-26 25 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

所以你推薦使用任何示例代碼,因爲即時通訊新的如果你可以感謝 –