2014-11-05 43 views
4

我想lockCanvas(),因爲我想在預覽前修改相機圖片。我在onPreviewFrame上執行。onPreviewFrame和異常鎖定表面

代碼是在這裏:

public class MyPreview implements Camera.PreviewCallback { 

     @Override 
     public void onPreviewFrame(byte[] data, Camera camera) { 
      Log.d("Camera", "Got a camera frame"); 

      Canvas c = null; 

      try { 
        c = mCamSH.lockCanvas(null); 

        Log.d("SOMETHING", "Got Bitmap"); 
      } finally { 
       if (c != null) { 
        mCamSH.unlockCanvasAndPost(c); 
       } 
      } 
     } 

    } //public class MyPreview implements Camera.PreviewCallback  

不幸的是我總是得到一個循環這個錯誤,問題是與C = mCamSH.lockCanvas(NULL); :

E/SurfaceHolder﹕ Exception locking surface 
    java.lang.IllegalArgumentException 
      at android.view.Surface.lockCanvasNative(Native Method) 
      at android.view.Surface.lockCanvas(Surface.java:76) 
      at android.view.SurfaceView$4.internalLockCanvas(SurfaceView.java:831) 
      at android.view.SurfaceView$4.lockCanvas(SurfaceView.java:811) 
      at cz.mrp.camera.CamActivity$MyPreview.onPreviewFrame(CamActivity.java:100) 
      at android.hardware.Camera$EventHandler.handleMessage(Camera.java:773) 
      at android.os.Handler.dispatchMessage(Handler.java:99) 
      at android.os.Looper.loop(Looper.java:137) 
      at android.app.ActivityThread.main(ActivityThread.java:4517) 
      at java.lang.reflect.Method.invokeNative(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:511) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:993) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:760) 
      at dalvik.system.NativeStart.main(Native Method) 

整個代碼是在這裏:http://pastebin.com/WJs1kyfq

使用GT-S7562設備上的Android 4.0.4。

我已經嘗試過在StackOverflow上搜索並使用谷歌,但沒有找到任何可以幫助我的東西。感謝您的時間!

+0

我面臨同樣的問題,但它只發生在S8 /你是如何解決這個問題的? – 2017-08-07 11:17:58

回答

1

爲什麼使用

c = mCamSH.lockCanvas(null); 

試試這個:

c = mCamSH.lockCanvas(); 

@Edit 您試圖呼籲mCamSH架lockCanvas。 但是,這個支架被相機使用,所以畫布已經被它鎖定。

要保持簡短:我不認爲你可以調用lockCanvas內onPreviewFrame

+0

感謝您的評論。不幸的是,這個問題仍然是一樣的:(從lockCanvas中刪除參數並沒有幫助。 – Petr 2014-11-05 14:50:45

8

你不能做到這一點。

Surface不是緩衝區,它是生產者 - 消費者安排中的緩衝區隊列。一次只能有一個製作人,這就是相機,所以你不能鎖定Surface進行軟件渲染。除非您的應用程序也是消費者,否則無法從Surface中讀取數據,因此無法使用您當前的安排修改該框架。

解決這個問題的最有效方法取決於您要做什麼。如果您只是想在預覽中放置疊加層,則可以使用具有透明背景的自定義視圖來完成此操作。如果您想在將圖像保存爲靜止圖像之前修改圖像,那麼在將其保存到磁盤之前,還要修改單個靜幀。如果您想修改它以進行視頻錄製,則可以使用SurfaceTexture作爲預覽目標(這會在應用中爲您提供生產者和消費者端),然後使用GLES修改圖像。 Grafika中的「show + capture camera」活動演示了後者。

另請參閱Android System-Level Graphics Architecture文檔。

2

我找到了解決方案。

您必須刪除此代碼,因爲畫布已被相機鎖定。

mCam.setPreviewDisplay(mCamSH); 

爲了顯示相機預覽,必須使用畫布上的變量(byte [] data)手動繪製。

+0

在我的情況下,我無法刪除該行,但是你的建議對我有很大幫助! – 2017-10-27 23:18:18