2017-08-31 4 views
1

私は表面クラスを使用してどのようなカメラのフィルムに表示する:SurfaceViewをカメラに関連付けようとすると `UnsupportedOperationException`がスローされるのはなぜですか?

SurfaceView view = (SurfaceView) findViewById(R.id.camera_view); 
Surface appSurface = view.getHolder().getSurface(); 

私はCameraManagerのAPIにSurfaceオブジェクトを渡す:

CameraManager manager = (CameraManager) this.getSystemService(Context.CAMERA_SERVICE); 
manager.openCamera(
    manager.getCameraIdList()[0], 
    new CameraDevice.StateCallback() { 
     @Override 
     public void onOpened(CameraDevice camera) {     
      // Why this line throws an exception? 
      camera.createCaptureSession(
       Collections.singletonList(appSurface), 
       new CameraCaptureSession.StateCallback() {...}, 
       null); 
     } 

     // other @Override methods 
     ... 
    }, 
    new Handler(getMainLooper()) 
); 

そして、次の例外受け取る:

FATAL EXCEPTION: main                        
Process: com.google.android.apps.internal.smartcamera.tagger, PID: 8563                        
java.lang.UnsupportedOperationException: Unknown error -22                         
at android.hardware.camera2.legacy.LegacyExceptionUtils.throwOnError(LegacyExceptionUtils.java:77)                          
at android.hardware.camera2.legacy.LegacyCameraDevice.getSurfaceSize(LegacyCameraDevice.java:583)                         
at android.hardware.camera2.utils.SurfaceUtils.getSurfaceSize(SurfaceUtils.java:68) 

SurfaceUtilsクラス(ネイティブCコード)はSurfaceのサイズを正しく読み取れません。 なぜですか?

答えて

0

これをManafiest.xmlに追加してください。

<uses-permission android:name="android.permission.CAMERA" /> 
<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
+0

私はそれらを持っている、それは問題を解決しません。 – mercury0114

3

表面はそれから入手したソースに弱いポインタです。

ImageReaderが有効範囲外になり、ガベージコレクションが行われ、カメラデバイスが放棄されたサーフェスに移動し、例外がスローされます。タイミングはややランダムです。なぜなら、これはいつも見えないからです。

イメージリーダーをどこかに永続的に保存します(イメージを取得するためにイメージリーダーを使用する必要があります)。

+0

あなたの発言に感謝します。しかし、 'ImageReader'オブジェクトをグローバル変数にすることは役に立ちませんでした。より多くのデバッグをした後、私はImageReaderがまったく問題ではないことを認識しました(これを反映するように質問を修正しました)。問題は何らかの理由で.xmlファイルから取得された** SurfaceViewがCameraManagerクラス**と一緒に動作しないということです。 – mercury0114

+0

アプリケーションを実行してからlogcatの出力を完全に取得すると便利です。障害ポイントでの例外よりも多少ログが記録される可能性があります。 XMLレイアウトからのSurfaceViewがここではうまくいかない理由はありません。 –

関連する問題