2012-01-09 37 views
3

我正在使用相机闪光灯的手电筒应用程序。它似乎工作正常,但有时会调用camera.release()导致大约一分钟左右的挂起。我已经包含下面的代码。我看了一堆例子,我没有看到任何可能导致这种事情的东西。有任何想法吗?app挂在camera.release()

//latest 
    public void setOn(boolean on, Context context) {  

    if (lock) { 
     Log.i(TAG, "lock: true"); 
     return; 
    } 


    if (on) {   
     if (mCamera == null) { 
      mCamera = Camera.open(); 
     } 

     Parameters params = mCamera.getParameters(); 
     params.setFlashMode(MODE_TORCH); 
     mCamera.setParameters(params); 
     mCamera.startPreview(); 
    } else { 
     if (mCamera != null) {    
      try {     
       Parameters params = mCamera.getParameters(); 
       params.setFlashMode(MODE_OFF); 
       mCamera.setParameters(params);     
      } finally { 
       new Thread(new Runnable() { 
        public void run() { 
         Log.i(TAG, "new Thread - start"); 
         lock = true; 
         mCamera.setPreviewCallback(null); 
         mCamera.stopPreview(); 
         mCamera.release(); 
         mCamera = null; 
         lock = false; 
         Log.i(TAG, "new Thread - end"); 
        } 
       }).start();          
      } 
     } 
    } 
} 


//original 
public void setOn(boolean on, Context context) {   
    Camera camera = mCamera; 
    if (on) {   
     if (camera == null) { 
      mCamera = camera = Camera.open(); 
     } 

     Parameters params = camera.getParameters(); 
     params.setFlashMode(MODE_TORCH); 
     camera.setParameters(params); 
     camera.startPreview(); 
    } else { 
     if (camera != null) { 

      try {     
       Parameters params = camera.getParameters(); 
       params.setFlashMode(MODE_OFF); 
       camera.setParameters(params);     
      } finally { 
       camera.stopPreview(); 
       camera.release(); 
       mCamera = camera = null; 
      } 
     } 
    } 
} 
+0

在该设备会发生这种情况?我们在Android 4.3,4.0和5.0(4.2没有这个问题)的Nexus 10上有完全相同的问题 – DoDo 2014-11-15 21:22:18

回答

1

尝试把它放在一个线程在后台运行,所以它不会挂断用户界面。

new Thread(new Runnable(){ 
    public void run(){ 
     camera.setPreviewCallback(null); // PreviewCallback de_init. 
     camera.stopPreview(); // stop Preview 
     camera.release(); 
    } 
}).start(); 
+1

谢谢; UI不再悬挂。然而camera.release()仍然挂在这个新线程中。任何线索为什么? – user1137832 2012-01-09 02:51:29

+0

看看这个线程讨论问题 – 2012-01-09 02:56:10

+0

对不起哪个线程? – user1137832 2012-01-09 03:08:35

0

对我来说,工作的解决办法是:

Try{ 
    camera.stopPreview(); 
    camera.setPreviewCallback(null); 
    camera.release(); 
    camera = null; 
} catch (Exception e){ 
    //... 
} 
0

I`ve解决了这个isuue添加发布之前camera.unlock()()

camera.stopPreview(); 
camera.setPreviewCallback(null); 
camera.unlock(); 
camera.release(); 
camera = null; 

测试上更多的设备需要...

+1

不幸的是,这并不能解决我们在Nexus 10上遇到的问题。 – DoDo 2014-11-15 21:23:41

0

只需拨打电话

mCamera.stopPreview(); 
mCamera.setPreviewCallback(null); 
mCamera.release(); 

你必须调用setPreviewCallback(空)betweeen stopPreview和camera.releass