Introducci贸n a HMS Core

1

Pasos para el desarrollo de aplicaciones con Huawei

2

Debugging en la nube con Huawei

3

驴Qu茅 es HMS Core?

4

Creaci贸n del proyecto en Android Studio

5

Creaci贸n de la aplicaci贸n en App Gallery Connect

6

Configuraci贸n de firma SHA-256

7

Configuraci贸n de APIs

8

Configuraci贸n de Android Studio y Gradle

9

Probando la sincronizaci贸n de la aplicaci贸n

Autenticaci贸n con HMS Account Kit

10

Dise帽ando nuestra pantalla de login

11

Agregando los m茅todos de autenticaci贸n

12

Verificando la autenticaci贸n

13

Agregando el m茅todo de logout

Construyendo nuestra c谩mara de selfies con HMS ML Kit

14

Machine Learning con Huawei

15

Agregando los permisos para acceder a la c谩mara

16

Dise帽ando la pantalla personalizada de la c谩mara

17

Creando la capa de gr谩ficos de la c谩mara

18

Creando el layout para nuestro rostro

19

Creando el layout del lente de la c谩mara

20

Creando nuestra actividad de c谩mara

21

Agregando nuestra c谩mara personalizada a la actividad

22

Agregando los m茅todos de verificaci贸n de rostro

23

Agregando la detecci贸n de rostro y sonrisa individual

24

Agregando la detecci贸n de rostro y sonrisa grupal

25

Tomar nuestra imagen y agregar un m茅todo de re-toma de foto

26

Guardar la foto en nuestra galeria

Aplicando notificaciones push con HMS Push kit

27

Crear el servicio de push notifications

28

Agregar el servicio de HMS Push kit

29

Verificar la conectividad de las notificaciones en App Gallery Connect

Conclusiones y consejos

30

Tips y soluci贸n de inconvenientes frecuentes

31

驴Qu茅 m谩s tiene Huawei?

No tienes acceso a esta clase

隆Contin煤a aprendiendo! 脷nete y comienza a potenciar tu carrera

Creando nuestra actividad de c谩mara

20/31
Recursos

Aportes 2

Preguntas 0

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad?

o inicia sesi贸n.

Ser铆a interesante que en este curso se tomaran el tiempo para detallar ciertos conceptos. Por ejemplo, en esta clase, los c谩lculos realizados para que el foco de la c谩mara y el rostro 鈥渘o se salgan de los l铆mites鈥, convierten la experiencia en un reto de copiar y pegar c贸digo; al menos para m铆.
Sin archivos o enlaces que permitan al estudiante reforzar el tema o la clase 鈥 solo una observaci贸n.

LensEnginePreview

package com.sandoval.hselfiecamera.camera

import android.content.Context
import android.content.res.Configuration
import android.util.AttributeSet
import android.util.Log
import android.view.SurfaceHolder
import android.view.SurfaceView
import android.view.ViewGroup
import com.huawei.hms.common.size.Size
import com.huawei.hms.mlsdk.common.LensEngine
import com.sandoval.hselfiecamera.overlay.GraphicOverlay
import java.io.IOException

class LensEnginePreview(context: Context, attrs: AttributeSet?) : ViewGroup(context, attrs) {

    private val mContext: Context = context
    private val mSurfaceView: SurfaceView
    private var mStartRequested: Boolean
    private var mSurfaceAvailable: Boolean
    private var mLensEngine: LensEngine? = null
    private var mOverlay: GraphicOverlay? = null

    init {
        mStartRequested = false
        mSurfaceAvailable = false
        mSurfaceView = SurfaceView(context)
        // Nuestra vista va a pedir un callback para agregar el lente
        this.addView(mSurfaceView)
    }

    override fun onLayout(
        changed: Boolean,
        left: Int,
        top: Int,
        right: Int,
        bottom: Int
    ) {
        var previewWidth = 320
        var previewHeight = 240
        if (mLensEngine != null) {
            val size: Size? = mLensEngine!!.displayDimension
            if (size != null) {
                previewHeight = size.height
                previewWidth = size.width
            }
        }
        if (mContext.resources
                .configuration.orientation == Configuration.ORIENTATION_PORTRAIT
        ) {
            val tmp = previewWidth
            previewWidth = previewHeight
            previewHeight = tmp
        }

        val viewWidth = right - left
        val viewHeight = bottom - top
        val childWidth: Int
        val childHeight: Int
        var childXOffset = 0
        var childYOffset = 0
        val widthRatio = viewWidth.toFloat() / previewWidth.toFloat()
        val heightRation = viewHeight.toFloat() / previewHeight.toFloat()

        if (widthRatio > heightRation) {
            childWidth = viewWidth
            childHeight = (previewHeight.toFloat() * heightRation).toInt()
            childYOffset = (childHeight - viewHeight) / 2
        } else {
            childWidth = (previewHeight.toFloat() * heightRation).toInt()
            childHeight = viewHeight
            childXOffset = (childWidth - viewWidth) / 2
        }
        for (i in 0 until this.childCount) {
            getChildAt(i).layout(
                -1 * childXOffset, -1 * childYOffset, childWidth - childXOffset,
                childHeight - childYOffset
            )
        }
        try {
            startIfReady()
        } catch (e: IOException) {
            Log.e("Error", "No se pudo iniciar la camara")
        }
    }

    @Throws(IOException::class)
    fun start(lensEngine: LensEngine?, overlay: GraphicOverlay?) {
        mOverlay = overlay
        start(lensEngine)
    }

    @Throws(IOException::class)
    fun start(lensEngine: LensEngine?) {
        if (lensEngine == null) {
            stop()
        }
        mLensEngine = lensEngine
        if (mLensEngine != null) {
            mStartRequested = true
            // Vamos a crear una funcion que nos va a decir
            //si la camara esta lista
        }
    }

    fun stop() {
        if (mLensEngine != null) {
            mLensEngine!!.close()
        }
    }

    fun release() {
        if (mLensEngine != null) {
            mLensEngine!!.release()
            mLensEngine = null
        }
    }

    @Throws(IOException::class)
    fun startIfReady() {
        if (mStartRequested && mSurfaceAvailable) {
            mLensEngine!!.run(mSurfaceView.holder)
            if (overlay != null) {
                val size: Size = mLensEngine!!.displayDimension
                val min: Int = size.width.coerceAtMost(size.height)
                val max: Int = size.width.coerceAtLeast((size.height))
                if (Configuration.ORIENTATION_PORTRAIT == mContext.resources.configuration.orientation) {
                    mOverlay!!.setCameraInfo(min, max, mLensEngine!!.lensType)
                } else {
                    mOverlay!!.setCameraInfo(max, min, mLensEngine!!.lensType)
                }
                mOverlay!!.clear()
            }
            mStartRequested = false
        }
    }

    private inner class SurfaceCallback : SurfaceHolder.Callback {

        override fun surfaceChanged(
            holder: SurfaceHolder?,
            format: Int,
            width: Int,
            height: Int
        ) {
        }

        override fun surfaceDestroyed(holder: SurfaceHolder?) {
            mSurfaceAvailable = false
        }

        override fun surfaceCreated(holder: SurfaceHolder?) {
            mSurfaceAvailable = true
            try {
                startIfReady()
            } catch (e: IOException) {
                Log.e("Error: ", "No pudimos iniciar la camra $e")
            }
        }
    }
}