2015-10-30 60 views
10

私は新しいAndroid カメラ2 APIでテストしており、各フレームをカメラから制御したいと考えています。私がこれを行うには、ImageReaderを作成し、解像度と画像フォーマットを設定します。その後Androidカメラ2 api BufferQueueが放棄されました

ImageReader imageReader = ImageReader.newInstance(1280,720,ImageFormat.YUV_420_888,1); 
imageReader.setOnImageAvailableListener(new ImageReader.OnImageAvailableListener() { 
    @Override 
    public void onImageAvailable(ImageReader reader) { 
     Image image = reader.acquireLatestImage(); 
     Log.i(MainActivity.LOG_TAG,"imageReader: "+System.currentTimeMillis()); 
     image.close(); 
    } 
},null); 

私は、パラメータTEMPLATE_PREVIEWでCaptureRequest新しいを作成し、彼imageReaderにターゲットを追加します。 cameraCaptureSessionのために私は、私はカメラを開き、私は例外を取得し、プレビューで私が持っているもののビューを開始し、この要求

try { 
    final CaptureRequest.Builder builder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); 

    builder.addTarget(imageReader.getSurface()); 

    mCameraDevice.createCaptureSession(
      Arrays.asList(imageReader.getSurface()), 
      new CameraCaptureSession.StateCallback() { 
       @Override 
       public void onConfigured(CameraCaptureSession session) { 
        mSession = session; 
        try { 
         mSession.setRepeatingRequest(builder.build(),null,null); 
        } catch (CameraAccessException e) { 
         e.printStackTrace(); 
        } 
       } 
       @Override 
       public void onConfigureFailed(CameraCaptureSession session) { 

       } 
      }, 
      null 
    ); 
} catch (CameraAccessException e) { 
    e.printStackTrace(); 
} 

でsetRepeatingRequest新しいを作成します。しかし例外の前に私はいくつかのプレビュー画像を得て、それ以降は例外があります

10-30 16:00:32.850 1390-1894/.camera2tutorial E/BufferQueueProducer﹕ [unnamed-1390-1] dequeueBuffer: BufferQueue has been abandoned 
10-30 16:00:32.850 1390-1894/.camera2tutorial E/Legacy-CameraDevice-JNI﹕ LegacyCameraDevice_nativeProduceFrame: Error while producing frame No such device (-19). 
10-30 16:00:32.850 1390-1894/.camera2tutorial W/SurfaceTextureRenderer﹕ Surface abandoned, dropping frame. 
    android.hardware.camera2.legacy.LegacyExceptionUtils$BufferQueueAbandonedException 
      at android.hardware.camera2.legacy.LegacyExceptionUtils.throwOnError(LegacyExceptionUtils.java:64) 
      at android.hardware.camera2.legacy.LegacyCameraDevice.produceFrame(LegacyCameraDevice.java:516) 
      at android.hardware.camera2.legacy.SurfaceTextureRenderer.drawIntoSurfaces(SurfaceTextureRenderer.java:699) 
      at android.hardware.camera2.legacy.GLThreadManager$1.handleMessage(GLThreadManager.java:103) 
      at android.os.Handler.dispatchMessage(Handler.java:98) 
      at android.os.Looper.loop(Looper.java:145) 
      at android.os.HandlerThread.run(HandlerThread.java:61) 

私はこれをどのように修正できますか?

私は、あなたはMsession定義されているところはどこでも、おそらく、あなたはあなたが作成するImageReaderへの参照を保持していることを確認しますサムスンギャラクシーS5とAndroid API 21

答えて

8

を使用しています。

ImageReaderから取得したサーフェスは、弱いポインタとほぼ同等です。ImageReaderがガベージコレクションを行うことを妨げません。そのため、(名前に基づいて)ImageReaderが破壊されている可能性が高く、放棄エラーが発生します。

+0

メソッドからローカル変数を削除しましたが、例外が解決されました。ありがとう! –

+3

@ mr.leoこの回答を受け入れたものとみなしてください。このソリューションは私の場合でも役に立ちました。面白いのは、それはプラットフォーム固有であるということです.NexuesやAndroid 6を実行している他のデバイスではうまくいきましたが、Android 5を実行しているHTC Oneでは失敗しました。Androidの断片化の美しさ。 – stoiczek

+0

@stoiczekどのようにしてImageReaderへの参照を具体的に保持しましたか? ( "captureRequest.addTarget(imageReader.getSurface())"以外) – Denis

1

私のアプリで活動を切り替えるとき、私は同じ問題を抱えていたし、それが唯一のfalseを返すされたonSurfaceTextureDestroyed()を呼び出した後だった、しかし、私がやったことは、私は

public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) { 
      Log.e(TAG, "onSurfaceTextureDestroyed"); 
      if(cameraDevice != null){ 
       closeCamera(); 

       cameraDevice = null; 
      } 
      return false; 
     } 

にそれを変更し、それは私のために働いています。

+0

ありがとうございます。これは私のために働いた。歓声.. –

+0

私は真の返信とその仕事。 –

関連する問題