2012-02-13 21 views
0

我有一個應用程序,我試圖繪製一些圖表,因爲我已經使用了表面視圖..當我點擊「on」按鈕時,我的應用程序必須打開相機來獲取一些參數來繪製一些圖形同樣,當我點擊「關閉」按鈕時,我需要停止相機預覽以及繪製圖形。所有這些工作對我來說都是一次嘗試,但是當我試圖重複它時,我的應用程序崩潰了。 和錯誤顯示在爲什麼在我關閉或回顧活動時應用程序崩潰?

public void surfaceDestroyed(SurfaceHolder holder) { 
    // TODO Auto-generated method stub 
    System.out.println("Deleted"); 
    try { mCamera.setPreviewDisplay(sh); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); } 

    mCamera.stopPreview(); 
    mCamera.release(); 
    mCamera = null; 
} 

這裏是我的代碼....

public void startCamPreview() { 

    SurfaceView sv = (SurfaceView) findViewById(R.id.surfaceView); 

    final SurfaceHolder sh = sv.getHolder(); 

    mCamera = Camera.open(); 

    timer.start(); 

    try { 
     mCamera.setPreviewDisplay(sh); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    sh.addCallback(new Callback() { 

     @Override 
     public void surfaceDestroyed(SurfaceHolder holder) { 
      // TODO Auto-generated method stub 
      System.out.println("Deleted"); 
      try { mCamera.setPreviewDisplay(sh); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); } 

      mCamera.stopPreview(); 
      mCamera.release(); 
      mCamera = null; 
     } 

     @Override 
     public void surfaceCreated(SurfaceHolder holder) { 
      System.out.println("Created"); 

      mCamera.setPreviewCallback(new PreviewCallback() { 
       public void onPreviewFrame(byte[] data, Camera camera) { 

        Camera.Parameters params = camera.getParameters(); 

        int width = params.getPreviewSize().width; 
        int height = params.getPreviewSize().height; 
        byte[] mYUVData = new byte[data.length]; 
        int[] mRGBData = new int[width * height]; 
        System.arraycopy(data, 0, mYUVData, 0, data.length); 
        decodeYUV420SP(mRGBData, mYUVData, width, height); 
        int[] mRedHistogram = new int[256]; 
        calculateIntensityHistogram(mRGBData, mRedHistogram, 
          width, height, 0); 
        double imageRedMean = 0; 
        double redHistogramSum = 0; 
        for (int bin = 0; bin < 256; bin++) { 
         imageRedMean += mRedHistogram[bin] * bin; 
         redHistogramSum += mRedHistogram[bin]; 
        } // bin 
        imageRedMean /= redHistogramSum; 
        double[] mBinSquared; 
        mBinSquared = new double[256]; 
        for (int bin = 0; bin < 256; bin++) { 
         mBinSquared[bin] = ((double) bin) * bin; 
        } 
        double imageRed2ndMoment = 0; 
        for (int bin = 0; bin < 256; bin++) { 
         imageRed2ndMoment += mRedHistogram[bin] 
           * mBinSquared[bin]; 
        } // bin 
        imageRed2ndMoment /= redHistogramSum; 
        double imageRedStdDev = Math.sqrt((imageRed2ndMoment 
          - imageRedMean * imageRedMean)); 
        int val = (new Double(imageRedStdDev * 100000) 
          .intValue()); 



        for (int l = 0; l < 1; l++) { 

        } 
        int yVal=250; 
        if (imageRedStdDev < 15 && val != 0) 
        { 

         mp.release(); 
         show=true; 
         g.addPoint(yVal); 
         g.addPoint(yVal); 
         float flt=(float)Math.random(); 
         g.addPoint(yVal+flt*25); 
         g.addPoint(yVal); 
         g.addPoint(yVal); 
         flt=(float)Math.random(); 
         g.addPoint(yVal-flt*20); 
         g.addPoint(yVal); 
         g.addPoint(yVal); 
         flt=(float)Math.random(); 
         g.addPoint(yVal-flt*30); 
         g.addPoint(yVal); 
         g.addPoint(yVal); 
         g.addPoint(yVal); 
         g.addPoint(yVal); 
         flt=(float)Math.random(); 
         g.addPoint(yVal+flt*35); 

         mp=MediaPlayer.create(getApplicationContext(), R.raw.heartbeat); 
         try { 
          mp.prepare(); 
         } catch (IllegalStateException e) { 
          // TODO Auto-generated catch block 
          e.printStackTrace(); 
         } catch (IOException e) { 
          // TODO Auto-generated catch block 
          e.printStackTrace(); 
         } 
         mp.start(); 
         //mp.setLooping(true); 
         Random r=new Random(); 
         no=r.nextInt(84-60)+60; 
         bpmText_View.setText(String.valueOf(no)); 
         try { 
          Thread.sleep(1500); 
         } catch (InterruptedException e) { 
          // TODO Auto-generated catch block 
          e.printStackTrace(); 
         } 


        } else { 
         show=false; 
         if(val==0){ 

          count++; 
          g.addPoint(yVal); 
          g.addPoint(yVal); 
          g.addPoint(yVal); 
          g.addPoint(yVal); 
          mp.release(); 
          mp=MediaPlayer.create(getApplicationContext(), R.raw.beep); 
          try { 
           mp.prepare(); 
          } catch (IllegalStateException e) { 
           // TODO Auto-generated catch block 
           e.printStackTrace(); 
          } catch (IOException e) { 
           // TODO Auto-generated catch block 
           e.printStackTrace(); 
          } 
          mp.start(); 
          bpmText_View.setText(String.valueOf(0)); 
         } 
         else{ 
         mp.release(); 
         count++; 
         g.addPoint(yVal); 
         g.addPoint(yVal); 
         g.addPoint(yVal); 
         g.addPoint(yVal); 

         mp=MediaPlayer.create(getApplicationContext(), R.raw.beep); 
         try { 
          mp.prepare(); 
         } catch (IllegalStateException e) { 
          // TODO Auto-generated catch block 
          e.printStackTrace(); 
         } catch (IOException e) { 
          // TODO Auto-generated catch block 
          e.printStackTrace(); 
         } 
         mp.start(); 
         bpmText_View.setText(String.valueOf(0)); 


         } 
        } 
       } 

      }); 
     } 

     @Override 
     public void surfaceChanged(SurfaceHolder holder, int format, 
       int width, int height) { 
      System.out.println("Changed"); 
      Camera.Parameters parameters = mCamera.getParameters(); 
      parameters.setPreviewSize(320, 240); 
      parameters.setPreviewFrameRate(15); 
      parameters.setSceneMode(Camera.Parameters.SCENE_MODE_NIGHT); 
      parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO); 
      mCamera.setParameters(parameters); 
      mCamera.startPreview(); 
      g.invalidate(); 
     } 
    }); 
    // fl.addView(b); 
} 

這是我的日誌貓顯示

02-13 15:06:09.023:E/AndroidRuntime(13275):致命例外:main 02-13 15:06:09.023:E/AndroidRuntime(13275):java.lang.RuntimeException:在發佈後調用方法 02-13 15:06:09.023:E/AndroidRuntime(13275):在android.hardware.Camera.stopPreview(Native Method) 02-13 15:06:09.023:E/AndroidRuntime(13275):at com.yakshna.h2h.Graph $ 3.surfaceDestroyed(Graph.java:114) 02-13 15:06:09.023:E/AndroidRuntime(13275) ):在android.view.SurfaceView.reportSurfaceDestroyed(SurfaceView.java:587) 02-13 15:06:09.023:E/AndroidRuntime(13275):at android.view.SurfaceView.updateWindow(SurfaceView.java:481) 02-13 15:06:09.023:E/AndroidRuntime(13275):at android.view.SurfaceView.onWindowVisibilityChanged(SurfaceView.java:213) 02-13 15:06:09.023:E/AndroidRuntime(13275):at android .view.View.dispatchDetachedFromWindow(View.java:6222) 02-13 15:06:09.023:E/AndroidRuntime(13275):at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:1162) 02-13 15 :06:09.023:E/AndroidRuntime(13275):at android.view.ViewGroup.dispatchDetachedFromWindow(View Group.java:1162) 02-13 15:06:09.023:E/AndroidRuntime(13275):at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:1162) 02-13 15:06:09.023:E/AndroidRuntime(13275):在android.view.ViewRoot.dispatchDetachedFromWindow(ViewRoot.java:1751) 02-13 15:06:09.023:E/AndroidRuntime(13275):at android.view.ViewRoot.doDie(ViewRoot.java: 2832) 02-13 15:06:09.023:E/AndroidRuntime(13275):at android.view.ViewRoot.die(ViewRoot.java:2802) 02-13 15:06:09.023:E/AndroidRuntime(13275) :at android.view.WindowManagerImpl.removeViewImmediate(WindowManagerImpl.java:218) 02-13 15:06:09.023:E/AndroidRuntime(13275):at android.view.Window $ LocalWindowManager.removeViewImmediate(Window.java:436) 02-13 15:06:09.023:E/AndroidRuntime(13275):at android.app.ActivityThread.handleD estroyActivity(ActivityThread.java:2705) 02-13 15:06:09.023:E/AndroidRuntime(13275):at android.app.ActivityThread.access $ 2100(ActivityThread.java:117) 02-13 15:06:09.023 :E/AndroidRuntime(13275):at android.app.ActivityThread $ H.handleMessage(ActivityThread.java:968) 02-13 15:06:09.023:E/AndroidRuntime(13275):at android.os.Handler.dispatchMessage (Handler.java:99) 02-13 15:06:09.023:E/AndroidRuntime(13275):at android.os.Looper.loop(Looper.java:123) 02-13 15:06:09.023:E/AndroidRuntime(13275):at android.app.ActivityThread.main(ActivityThread.java:3687) 02-13 15:06:09.023:E/AndroidRuntime(13275):at java.lang.reflect.Method.invokeNative(Native方法) 02-13 15:06:09.023:E/AndroidRuntime(13275):at java.lang.reflect.Method.invoke(Method.java:507) 02-13 15:06:09.023:E/AndroidRuntime(13275):at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:842) 02-13 15:06:09.023:E/AndroidRuntime(13275):at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600) 02-13 15:06:09.023:E/AndroidRuntime(13275):at dalvik.system.NativeStart。主(本地方法)

+1

發佈錯誤。如果沒有,它會花費永久解決。 – 2012-02-13 14:58:32

回答

1

您mCamera.open()在不同的線程比你.startPreview():

編號:http://developer.android.com/reference/android/hardware/Camera.html

「這一類不是線程安全的,並且是爲使用一個事件線程,大多數長時間運行的操作(預覽,焦點,圖片捕捉等)都是異步發生的,並根據需要調用回調函數。回調函數將在事件線程open(int)被調用時調用。一次調用多個線程。「

0

我同意你需要發佈實際的錯誤,但在第一次檢查時,我打賭這是一個NullPointerException

我的第一個猜測是你有一個競爭條件。 mCamera定義在您的surfaceDestroyedstartCamPreview方法的外部,但是兩者都引用(包括Callback匿名類的封閉)。

相關問題