web-dev-qa-db-fra.com

Android camerax ne montre rien

J'ai mis en place un nouvel échantillon, voici n lien qui décrit la nouvelle API de Camerax à partir de Google Codelabs, mais TextureView ne montre rien et jette la prochaine exception:

OpenGlrenderer: [surfacetexture-0-7609-1] DequeueImage: surfacetexture n'est pas attaché à une vue

Un autre échantillon de caméra en tant qu'application de caméra2 et de caméra natale fonctionne bien, j'ai utilisé l'émulateur avec un niveau API Q Beta 3

 Class CameraxFragment: Fragment (), TextureView.surfaceTexTurelistener {
 
 [. ____] Objet de compagnon {
 Fun NewInstance (): Fragment = CameraxFRAGment () [.____] 
 
 privé val request_code_permissions = 10 [.____] [.____] Val privé requis_permissions = Arrayof (manifeste.permission.camera, manifeste.permission.write_external_storage) 
 Remplacer le plaisir OncrateView (Inflatériel: Layoutinflater, Conteneur: Viewgroup ?, SavedInstanCetate: Bundle?): Vue? = gonfler.inflate (r.layout.fragment_camera, conteneur, false) [.____] 
 remplacer l'amusement surViewCaré (vue: vue, sauvegarde: bundle?) {
 super.onviewCreated (vue, SavedInstancestate) 
 ViewFinder.surfacetexTurelistener = Ceci [.____]} 
 
 Fun privé startcamera () {
 Camerax.unbindall () [. ____] [ .____] Val PreviewConfig = prévisionnateurConfig.builder (). Appliquer {[.____] SetTargetaSpectratio (rationnel (1, 1)) 
 SettargeResolution (taille (320, 320)) [. ____]}. Construire () 
 
 Val Aperçu = Aperçu (PrévisivageConfig) 
 aperçu.setonpreviewOutPutUpdatelistener {[.] ViewFinder.surfacetexture = it.surfacetexture 
 updatetransform () [) [ .____]} 
 [.____] Val imagececapeureconfig = ImagecapTeureconfig.builder () 
 SettargetaSpectratio (Rational (1, 1)) [.____]SetCapTuremode (Imagecapture.Capturemode.min_Latency) [.____]} .build () 
 
 [.____] Val ImageCapture = ImageCecapTeulfig) 
 CaptureButton.setonClickListener {
 Val Fichier = fichier (environnement.getexternalstoragePublicDirectory (environnement.directory_dcim), "$ {system.currenttimemillis ()}. JPG") [.____] Imagecapture.takepicture (fichier, objet: Imagecapture.onimagesavedListener {
 Remplacer ONERROR (ERREUR: Imagecapture.USECASEError, Message: String, T: Disphable?) {[.____] T? .PrintStackTrace () [.____]} [.____] Remplacer l'ONIMAGEED ONIMAGEUD (FILE: Fichier) {
 Val msg = "Capture de photo a réussi: $ {fichier.absolutepath}" [.____] toast.maketext (requérementecontext (), msg, toast.longueur_short).. () [.____] } 
}) [.____]} [.____] [.____] [.____] camerax.bindtolifecycle (ceci, aperçu, imagecapture) [.____]} [.____] Fun privé UpdateTransform () {
 Val Matrix = Matrix () 
 Val Centrex = Vieffinder.Width/2f [F.] Val Centrey = Viewnfinder.Height/2f [f.] Val RotationDegrés = quand (visionnement.display.rotation) {
 surface.rotation_0 -> 0 [.____] surface.rotation_90 -> 90 [.____] surface.180 -> 180 
 Surface. Rotation_270 -> 270 
 sinon -> Retour [.____]} 
 matrix.postrotate (-Rotationdegrees.tofloat (), Centrex, Centery) 
 ViewFinder.setTransform (Matrix) 
} [.____] [.____] 
 Remplacer ONSURFADEXTRESSURGEDANGEDANGEDANGE (surface: surfacetexture, largeur: int, hauteur: int) {
} 
 Fun OnsurfaceTextureUtUndaté (Surface: Surfametexture) {[.____]} 
 
 Remplacer le Fun ONSURFACETexture (Surface: SurfaceTexture): Boolean {
 Retourner vrai [.____]} 
 
 
 [. ____] ?, largeur: int, hauteur: int) {
 Si (AllpermissionsGranced ()) {
 Viewfinder.post {startcamera ()} 
} else {
 Requestpermissions (Requis_permissions, demande_code_permissions) 
} [____.] ViewFinder.addonLayOutchangelistener {_, _, _, _, _, _, _, _ - _ -] updatetransform () 
} [.____]} [.____] [. ____] 
 Remplacer le plaisir ONREQUESTERMANGISGISSEMMISMANGISSULGISSULGISSULGISSULGISTRUMTIVATIONSULTSULTULTSULTSULTURE (Autorisations: InTurray) {
 Si (DemandeCode = Demande_Code_Perrissions) {[ .____] Si (AllpermissionsGranced ()) {
 ViewFinder.post {startcamera ()} [.____]} else {
 toast.maketext (requisEtext (), "PE Les rmissions ne sont pas accordées ", toast.longueur_short) .Show () 
} [.____]} [.____]} [.____]} 
 Fun privé AllotermissionsGranceGranted (): Boolean { [.____] pour (permission dans requis_permissions) {
 si (contextCompat.checkecurmission (requisecontext.checkfermission (requisecontext (), autorisation)! = packagemanager.permission_granted) {
 renvoie false [ .____]} 
 retourne vrai [.____]} [.____]} [.____]
7
Max

Le kotlin code de Oscar wahltinez en Java:

ViewGroup parent = (ViewGroup) textureView.getParent();
parent.removeView(textureView);
parent.addView(textureView, 0);
SurfaceTexture surfaceTexture = previewOutput.getSurfaceTexture();
textureView.setSurfaceTexture(surfaceTexture);
3
Ahwar

Je suis confronté au même problème lors de la suite de Codelabs. J'ai verrouillé l'écran puis la retourna et soudainement fonctionné normalement, la fonction de capture fonctionnait également. Je n'ai aucune idée de cette situation, mais vous pouvez essayer de cette façon de travailler. J'utilise q beta 3 en pixel 3.

PS: Vous pouvez simplement déclencher l'événement OnStop et Onstart pour l'activité (par exemple: Appuyez à nouveau sur ACCUEIL et Ouvrez l'application), l'aperçu en direct fonctionnera. À mon avis, je pense que ce problème concerne le CameraX.bindToLifecycle.

2
Tuan Nguyen

Ce code est travaillé pour moi

  val parent = viewFinder.parent as ViewGroup
  parent.removeView(viewFinder)
  parent.addView(viewFinder, 0)
  val surfaceTexture: SurfaceTexture = it.surfaceTexture
  viewFinder.setSurfaceTexture(surfaceTexture)
0
terng03412