2017-08-31 6 views
1

Je veux afficher ce que les films de la caméra à l'aide de la classe de surface:Pourquoi `UnsupportedOperationException` est-il lancé en essayant d'associer SurfaceView à la caméra?

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

Je passe l'objet de surface dans l'API CameraManager:

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()) 
); 

Et l'exception suivante:

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) 

Il semble que la classe SurfaceUtils (qui est un morceau de code c natif) ne parvient pas à lire correctement la taille de surface. Pourquoi?

Répondre

0

Essayez d'ajouter ceci à Manafiest.xml.

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

Je les ai, ça ne résout pas le problème. – mercury0114

3

Une surface est un pointeur faible à la source à partir de laquelle elle a été obtenue.

Votre ImageReader est hors de portée et récupère les déchets, et le périphérique de la caméra s'exécute dans une surface abandonnée, et déclenche une exception. Le timing sera quelque peu aléatoire, c'est pourquoi vous ne le voyez pas toujours.

Stockez votre lecteur d'image dans un endroit persistant (vous devez en tout cas l'utiliser pour récupérer des images).

+0

J'apprécie votre remarque. Cependant, faire de l'objet 'ImageReader' une variable globale n'a pas aidé. Après avoir fait plus de débogage moi-même j'ai réalisé que le ImageReader n'est pas du tout le problème (j'ai modifié la question pour refléter cela). Le problème est que, pour une raison quelconque, le ** SurfaceView obtenu à partir du fichier .xml ne correspond pas à la classe CameraManager **. – mercury0114

+0

Il serait utile d'avoir la sortie complète de logcat de l'application - il y a probablement un peu plus de journalisation que juste l'exception, au point de défaillance. Il ne devrait y avoir aucune raison qu'un SurfaceView d'une mise en page XML ne fonctionne pas ici. –