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 [.____]} [.____]} [.____]
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);
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
.
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)