Todo lo que necesitas saber sobre tecnología

Etiqueta: GitHub Página 1 de 2

¿Es ‘Copilot’ de IA un término genérico o una marca?

El término «copiloto» para los asistentes de IA parece estar en todas partes en el software empresarial actual. Como muchas cosas en la industria de la IA generativa, la forma en que se usa la palabra está cambiando. A veces se escribe con mayúscula y otras no. La elección de Copilot por parte de GitHub como marca fue el primer uso importante, seguido de que Microsoft nombrara a su asistente insignia de IA Copilot. Luego, el término copiloto rápidamente se volvió genérico. En el uso común, un copiloto de IA es un asistente de IA generativa, generalmente un modelo de lenguaje grande entrenado para una tarea específica. La confusión sobre un término podría llevar a que algunos clientes no sepan si lo que están adquiriendo es un producto de Microsoft, por ejemplo. Pero Microsoft no parece estar buscando apropiarse de la palabra copiloto, como la usan muchas otras compañías. El término copiloto se originó en el vuelo e implica una mano derecha competente para un profesional altamente calificado. Esto es lo que necesita saber sobre algunas de las muchas variedades de copiloto de IA. ¿Qué es el copiloto de Microsoft? Microsoft Copilot es un término general para una variedad de productos de IA generativa y chatbot que ahora están disponibles en todo el software de productividad de Microsoft. Para los usuarios empresariales, tenemos una guía para diferenciar las diversas iteraciones de Microsoft Copilot y las nuevas funciones e integraciones de Copilot. Microsoft utiliza dos construcciones para los nombres de productos Copilot: «en» o «para». En la hoja de trucos de TechRepublic sobre Microsoft Copilot, tenga en cuenta Copilot para seguridad y Copilots para finanzas, ventas y servicios, que probablemente se compren por separado para usos o departamentos específicos. Este es un caso interesante en el que Microsoft usa su propia marca de dos maneras a la vez (incluso después de todo el cambio de nombre de Copilot): los Copilots ofrecen capacidades muy similares, pero más específicas de la industria, en comparación con los Copilots en, por ejemplo. Por ejemplo, Copilot en Word puede ayudar con cualquier tarea de escritura, mientras que Copilot for Security se integra con productos de seguridad específicos. VER: Copilot en Bing solía llamarse Bing Chat antes de que Microsoft unificara un poco sus marcas. (TechRepublic) ¿Qué es GitHub Copilot? GitHub lanzó su producto Copilot en 2021 (GitHub ya había sido adquirido por Microsoft en ese momento). GitHub Copilot genera código basado en el código existente de un desarrollador; Está pensado como una versión AI de la programación en pareja. El GitHub Copilot original se construyó sobre OpenAI Codex, una variante del entonces actual GPT-3. GitHub cerró el círculo de la IA generativa con la incorporación de un chatbot a su versión más reciente, GitHub Copilot X. Más cobertura de IA de lectura obligada Microsoft Copilot vs GitHub Copilot Microsoft Copilot y GitHub Copilot tienen diferentes casos de uso principales. GitHub Copilot es específicamente para codificar, mientras que Microsoft Copilot se integra con una gran cantidad de software empresarial diferente. GitHub Copilot lee código, no lenguaje natural, y lo integra en un editor de código; Microsoft Copilot utiliza lenguaje natural y se integra con una variedad de productos de Microsoft. Por otro lado, Microsoft Copilot se puede utilizar para escribir código en algunos casos, como en Power Pages cuando se integra con Visual Studio Code. Microsoft Copilot para empresas comienza en $30,00 por usuario por mes con una licencia de Microsoft 365 Business Standard o Microsoft 365 Business Premium. GitHub Copilot comienza en $10 por usuario por mes. ¿Cuáles son otros productos Copilot? Salesforce no es un defensor de Microsoft de Copilot como marca. Einstein Copilot, lanzado en febrero de 2024, funciona en las ofertas de software como servicio de gestión de relaciones con clientes, inteligencia artificial y nube de datos de Salesforce. La empresa de software de automatización de procesos empresariales Appian llama Copilot a su compañero de IA generativa. Una empresa de software de prospección de ventas se llamó Copilot AI, pero no vende un robot de IA generativa; en cambio, ofrece respuestas predictivas a las conversaciones y campañas de LinkedIn. Hay muchas más empresas que utilizan Copilot para indicar un impulso generativo de IA para sus servicios. VER: Hay varias razones por las que las empresas o los usuarios individuales podrían querer desactivar las funciones de Microsoft Copilot que vienen con Windows 11. (TechRepublic) ¿Se puede utilizar copiloto como término genérico? Por ahora, “copilot” es una palabra flexible para productos de chatbot de IA genéricos y específicos de marca para usos comerciales específicos. Por ejemplo, Microsoft Copilot es un copiloto. A qué se refiere «copiloto» o cómo se denomina un chatbot de IA puede ser diferente según la organización. Los usos comunes del término indican el período del Salvaje Oeste de la IA en el que nos encontramos, y muestran que los profesionales todavía están trabajando en formas de utilizar la IA generativa para los negocios y que la IA generativa se está asentando en un papel de «asistente» en forma de chatbots personalizados. a productos y aplicaciones específicos. Probablemente verá la palabra copiloto escrita en minúsculas para indicar la versión genérica de los asistentes de IA. Las personas que crean la infraestructura Copilot en mayúsculas también han adoptado la versión genérica del término: el CEO de NVIDIA, Jensen Huang, utilizó copiloto como término genérico en NVIDIA GTC, al igual que muchas empresas en la sala de exposiciones de la conferencia. Otras empresas parecen mantenerse alejadas del término: IBM llama Asistente a su compañero de IA watsonx, al igual que Databricks con su Asistente Databricks.

Source link

Gráficos Y

YCharts es una biblioteca de gráficos ligera y extensible para el sistema Jetpack Compose.

Source link

El arsenal de Android: depuración

Strict Canary es una pequeña herramienta para admitir la aplicación suave del «modo estricto». Para obtener más información, consulte Modo estricto de Android. Descripción Creemos que los bloqueos o las ventanas de diálogo del modo estricto pueden ser realmente molestos, especialmente en un proyecto grande, por lo tanto, Strict Canary ofrece una implementación «suave» del modo estricto. Cuando se detecta una infracción, Strict Canary mostrará una notificación pequeña y amigable, como la siguiente notificación: Notificación grupal Además, se puede hacer clic en esta notificación. Al hacer clic, verá la lista de las 150 infracciones más recientes que han ocurrido desde que se inició la aplicación. Sin embargo, si desea tener más control sobre las infracciones, puede dividir esta notificación grupal en notificaciones más pequeñas para cada infracción. Puedes ver un ejemplo de notificaciones independientes a continuación: Contraído Expandido ¿Y qué piensas? ¡También se puede hacer clic en ellas! Haga clic en él para ver la información detallada. Vea los ejemplos de contenidos de notificaciones a continuación: Las infracciones más recientes Pantalla de infracciones detallada Descargar Nota al margen: la biblioteca se publica en mavenCentral, por lo que puede ser necesario agregar mavenCentral a su lista de repositorios en el archivo raíz gradle. allprojects { repositorios { // tus repositorios mavenCentral() } } Maven
com.github.st235
canario estricto
xxx
pompón
Implementación de Gradle ‘com.github.st235:strict-canary:xxx’ Ivy

PD: puede usar el script a continuación o la insignia de arriba para recuperar la última versión de curl -s «https://search.maven.org/solrsearch/select?q=g:com.github.st235+AND+a:strictcanary » | grep -oh ‘.últimaVersión.:.[^»]*’ | grep-oh ‘[0-9|.]*[0-9]$’ Módulo de uso Comencemos con la configuración de su módulo. Como Strict Canary envía notificaciones, no queremos permitir que sus usuarios las vean y arruinen su experiencia. A la luz de este requisito previo, la biblioteca proporciona una implementación no operativa para sustituir Strict Canary por un código auxiliar en las versiones de lanzamiento. Puede utilizar el recorte a continuación para separar la lógica de depuración y liberación. debugImplementation «st235.com.github:strict-canary:xxx» releaseImplementation «st235.com.github:strict-canary-noop:xxx» Configuración Para dejar que la magia ???? sucede que necesitas escribir un pequeño código. Prometo que estos serán sólo unos pocos cambios. Debe modificar su método Application#onCreate y proporcionar StrictCanaryDetectionPolicy a la instancia global de StrictCanary. anular diversión onCreate() { super.onCreate() StrictCanary.setDetectionPolicy( StrictCanaryDetectionPolicy.Builder(this) .detect(StrictCanaryViolation.Type.DISK_READ) .detect(StrictCanaryViolation.Type.DISK_WRITE) .rawBaseline(R.raw.strictcanary_baseline) .showAllViolationsAtOnce () // o .showEveryViolationAsSeparateNotification() .build() ) } La configuración básica parece bastante sencilla. Sin embargo, StrictCanaryDetectionPolicy.Builder admite funciones adicionales, como un archivo de línea base o un conmutador de detección de errores de terceros. Línea de base Quizás se pregunte: «¿Qué debo hacer si hay algunas infracciones que no puedo solucionar en este momento»? Tengo una respuesta para ti: necesitas usar un archivo de referencia. Baseline es un documento especial que le ayuda a ignorar algunas de sus infracciones del modo estricto. Para definir y utilizar el archivo correctamente es necesario seguir unas cuantas reglas sencillas: Cada número debe utilizar etiquetar y utilizar un atributo de ruta que ignore todo el archivo o especificar la entrada del código con la etiqueta; Todos los problemas deben agruparse en un grupo que utilice etiqueta. Sin embargo, no es posible definir un grupo vacío; es necesario especificar un atributo de identificación; Todos los grupos deben estar dentro de una etiqueta parental. .


StrictCanaryApplication.onCreate

PD: Ahora estás listo para comenzar. ¡Hagamos que el hilo principal vuelva a ser genial! Licencia miscelánea Licencia MIT Copyright (c) 2022 Alexander Dadukin Por la presente se concede permiso, de forma gratuita, a cualquier persona que obtenga una copia de este software y los archivos de documentación asociados (el «Software») para operar con el Software sin restricciones, incluso sin limitar los derechos de usar, copiar, modificar, fusionar, publicar, distribuir, sublicenciar y/o vender copias del Software, y permitir que las personas a quienes se proporciona el Software lo hagan, sujeto a las siguientes condiciones: Los derechos de autor anteriores Este aviso y este aviso de permiso se incluirán en todas las copias o partes sustanciales del Software. EL SOFTWARE SE PROPORCIONA «TAL CUAL», SIN GARANTÍA DE NINGÚN TIPO, EXPRESA O IMPLÍCITA, INCLUYENDO PERO NO LIMITADO A LAS GARANTÍAS DE COMERCIABILIDAD, IDONEIDAD PARA UN PROPÓSITO PARTICULAR Y NO INFRACCIÓN. EN NINGÚN CASO LOS AUTORES O TITULARES DE DERECHOS DE AUTOR SERÁN RESPONSABLES DE NINGÚN RECLAMO, DAÑO U OTRA RESPONSABILIDAD, YA SEA EN UNA ACCIÓN CONTRACTUAL, AGRAVIO O DE OTRA MANERA, QUE SURJA DE, FUERA DE O EN RELACIÓN CON EL SOFTWARE O EL USO U OTRAS NEGOCIOS EN EL SOFTWARE.

Source link

El arsenal de Android: complementos IDE

Complemento IntelliJ iDEA / Android Studio para proyectos de Android que utilizan la biblioteca Paparazzi que permite grabar, verificar y ver las instantáneas dentro del IDE. Instalar Puede instalar el complemento desde Preferencias -> Complementos y buscar el complemento. También puede descargar el complemento desde intelliJ iDEA Marketplace. Características Ver instantáneas doradas previamente grabadas para la clase de prueba abierta actualmente Ver instantáneas doradas del método de prueba enfocado actual Ver diferencias de fallas para la clase o método de prueba actual Grabar, verificar y eliminar instantáneas para pruebas individuales o para toda la clase de prueba Opciones de zoom para Actual Tamaño y ajuste a la ventana Totalmente compatible con archivos de prueba escritos en Java o Kotlin Pruebas Cualquier cambio realizado en el complemento debe probarse con el proyecto de muestra de paparazzi de Android. Contribuir Agradecemos las contribuciones y, si está interesado, eche un vistazo al documento CONTRIBUCIÓN. Licencia paparazzi-plugin tiene la licencia Apache, versión 2.0. Consulte LICENCIA para ver el texto completo.

Source link

El arsenal de Android: hilanderos

Sugerencia de soporte de Android Spinner Agregar al proyecto Gradle Agregue el siguiente código a su archivo raíz build.gradle allprojects { repositories { maven { url ‘https://jitpack.io’ } } } Y agregue el siguiente código de dependencia al archivo build.gradle de su módulo . dependencias {implementación ‘com.github.Mamoon-Alhawamdeh:AmazingSpinner:${latest-version}» } Uso

O Actividad interna o fragmento mAmazingSpinner1.onItemClickListener = AdapterView.OnItemClickListener { adaptador, v, posición, id -> Toast.makeText(this, adaptor.getItemAtPosition(position).toString(), Toast.LENGTH_LONG).show() } O mAmazingSpinner1. text.toString() Personalización Puede utilizar estilos y propiedades de TextInputLayout o estilos y propiedades de Spinner. ¿Encuentra útil esta biblioteca? ❤️ Apóyalo uniéndote a los observadores de estrellas de este repositorio. ⭐ Licencia MIT Copyright (c) 2020 Mamoon Al-hawamdeh Por la presente se concede permiso, de forma gratuita, a cualquier persona que obtenga una copia de este software y los archivos de documentación asociados (el «Software») para operar con el Software sin restricciones, incluyendo sin limitación, los derechos de usar, copiar, modificar, fusionar, publicar, distribuir, sublicenciar y/o vender copias del Software, y permitir que las personas a quienes se proporciona el Software lo hagan, sujeto a las siguientes condiciones: Lo anterior El aviso de derechos de autor y este aviso de permiso se incluirán en todas las copias o partes sustanciales del Software. EL SOFTWARE SE PROPORCIONA «TAL CUAL», SIN GARANTÍA DE NINGÚN TIPO, EXPRESA O IMPLÍCITA, INCLUYENDO PERO NO LIMITADO A LAS GARANTÍAS DE COMERCIABILIDAD, IDONEIDAD PARA UN PROPÓSITO PARTICULAR Y NO INFRACCIÓN. EN NINGÚN CASO LOS AUTORES O TITULARES DE DERECHOS DE AUTOR SERÁN RESPONSABLES DE NINGÚN RECLAMO, DAÑO U OTRA RESPONSABILIDAD, YA SEA EN UNA ACCIÓN CONTRACTUAL, AGRAVIO O DE OTRA MANERA, QUE SURJA DE, FUERA DE O EN RELACIÓN CON EL SOFTWARE O EL USO U OTRAS NEGOCIOS EN EL SOFTWARE.

Source link

Reproductor de YouTube

Reproductor multiplataforma YouTube kotlin. YouTubePlayer componible te permite insertar un reproductor de video de YouTube en tu aplicación Jetpack Compose.

Source link

El arsenal de Android – Gráficos

⚡ Biblioteca de gráficos de barras de rango para Android usando MPAndroidChart⚡ No había gráficos en MPAndroidChart para mostrar rangos. Nos vimos obligados a mostrar los gráficos de rango que queríamos utilizando un gráfico de velas con capacidad similar. Esta biblioteca se puede utilizar cuando desee crear gráficos que puedan representar rangos como el clima y la frecuencia cardíaca. Configuración de demostración de etiqueta de dibujo mínima/máx. predeterminada Repositorios de Gradle { google() mavenCentral() maven { url ‘https://jitpack.io’ } // Para usar MPAndroidChart } dependencias { implementación ‘io.github.ParkSangGwon:range-bar- chart:xyz’ //implementation ‘io.github.ParkSangGwon:range-bar-chart:0.0.6’ } Si cree que esta biblioteca es útil, presione el botón de estrella en la parte superior. Cómo usar El uso de esta biblioteca es perfectamente consistente con el de MPAndroidChart Lea el documento oficial. Puede entender inmediatamente una explicación detallada mirando el código del proyecto de muestra. RangeBarEntry Configuración Gráfico diversión privada RangeBarChart.setup() { setScaleEnabled(false) setDrawGridBackground(false) setBackgroundColor(Color.TRANSPARENT) descripción.isEnabled = false xAxis.apply { posición = XAxis.XAxisPosition.BOTTOM setDrawGridLines(false) } axisLeft.apply { setDrawGridLines(false) axisMinimum = -20f axisMaximum = 40f } axisRight.isEnabled = false legend.isEnabled = false data = RangeBarData(createSet()) } Crear conjunto de datos RangeBarDataSet(null, «RangeBar»).apply { color = Color.parseColor( «#2BDD9E») barWidth = 0.4f isHighlightEnabled = true highLightColor = Color.CYAN minColor = Color.parseColor(«#22BCFE») maxColor = Color.parseColor(«#FC351E») setDrawValues(false) valueTextSize = 12f valueFormatter = object: ValueFormatter() { override fun getFormattedValue(value: Float): String = «${value.toInt()}°C» } } Agrega tus entradas privadas fun getWeatherEntries(): Lista {valores val = listamutableDe() valores.add(RangeBarEntry(1f, -7f, 1f)) valores.add(RangeBarEntry(2f, -4f, 4f)) valores.add(RangeBarEntry(3f, 2f, 11f)) valores.add(RangeBarEntry(4f) , 8f, 18f)) valores.add(RangeBarEntry(5f, 14f, 23f)) valores.add(RangeBarEntry(6f, 19f, 26f)) valores.add(RangeBarEntry(7f, 23f, 28f)) valores.add(RangeBarEntry (8f, 25f, 33f)) valores.add(RangeBarEntry(9f, 17f, 25f)) valores.add(RangeBarEntry(10f, 10f, 18f)) valores.add(RangeBarEntry(11f, 3f, 11f)) valores.add (RangeBarEntry(12f, -3f, 4f)) valores de retorno } diversión privada RangeBarChart.addData() { val datos = datos ?: devolver val rangeBarDataSet = data.getDataSetByIndex(0) ?: devolver valores val = getWeatherEntries() rangeBarDataSet.values = valores data.notifyDataChanged() notifyDataSetChanged() } Personalizar la variable RangeBarDataSet Descripción barWidth Ajustar el ancho del tablero minColor Min color int maxColor Max color int Preguntas frecuentes ¿Puedo usar la función/variable de BarChart? Sí, RangeBarChart es una clase implementada heredando de BarChart. Para que pueda utilizar todas las funciones que utiliza BarChart. ¿En qué se diferencia de los gráficos de velas japonesas? Los gráficos de velas deben especificar un punto inicial y final, así como un mínimo y un máximo. Se utiliza con el fin de utilizar gráficos de cotizaciones, no para mostrar solo el rango que queremos. RangeBarChart solo muestra los rangos mínimo y máximo. Licencia Copyright 2022 Ted Park Licenciado bajo la Licencia Apache, Versión 2.0 (la «Licencia»); no puede utilizar este archivo excepto de conformidad con la Licencia. Puede obtener una copia de la Licencia en http://www.apache.org/licenses/LICENSE-2.0 A menos que lo exija la ley aplicable o se acuerde por escrito, el software distribuido bajo la Licencia se distribuye «TAL CUAL», SIN GARANTÍAS NI CONDICIONES DE NINGÚN TIPO, ya sean expresas o implícitas. Consulte la Licencia para conocer el idioma específico que rige los permisos y limitaciones de la Licencia.«`

Source link

El arsenal de Android: enlaces profundos

En una aplicación de Android podemos definir patrones de URI que asignan URI a actividades utilizando filtros de intención. Para obtener más información sobre esto, debe leer esta documentación proporcionada por Google https://developer.android.com/training/app-links Una vez que hayamos definido qué URI maneja nuestra aplicación en nuestro manifiesto, podemos inspeccionar el URI de Intenciones del enlace entrante y decida cómo actuar en consecuencia. La API Deep Linking se encarga de manejar los enlaces entrantes asignando patrones de URI a los de Command. Estos comandos se pueden usar para iniciar una actividad, mostrar un fragmento, mostrar alguna otra interfaz de usuario o cualquier otra cosa que pueda hacer en el contexto de la actividad que maneja sus enlaces profundos. El enfoque está inspirado en el patrón Front Controller de Martin Fowler. Agregar dependencias Paso 1. Agregue el repositorio JitPack a su archivo de compilación allprojects { repositorios { … maven { url ‘https://jitpack.io’ } } } Paso 2. Agregue las dependencias { implementación ‘com.github.justeattakeaway :android-deep-links:1.0.0’ } Guía de uso Primero debemos designar una actividad que manejará los enlaces profundos entrantes y agregar los filtros de intención necesarios para la actividad en nuestro AndroidManifest.xml de la siguiente manera.





Con nuestro filtro de intención definido, podemos definir nuestro enrutamiento; para el enfoque más simple, usamos la función de extensión deepLinkRouter para realizar la mayor parte de la configuración por nosotros. clase EjemploDeepLinkActivity: ComponentActivity() { anular diversión onCreate(savedInstanceState: ¿Paquete?) { super.onCreate(savedInstanceState) deepLinkRouter { esquemas(«https») hosts(«simple.site.com») «/home» mapTo { HomeCommand() } «/productos/[a-zA-Z0-9]*» mapTo { ProductCommand() } }.route(intent.data ?: Uri.EMPTY) } } En el ejemplo asignamos rutas /home a un HomeCommand y también a /product/[a-zA-Z0-9]* a un ProductCommand respectivamente. La parte de la ruta es lo que sigue a la parte del host del URI, como https://simple.site.com/products/123, y en nuestro mapeo la definimos como Regex. Para ProductCommand lo asignamos a una expresión regular que coincide con un ID de producto del patrón. [a-zA-Z0-9]* Comandos Con nuestro mapeo definido y asignado a comandos, necesitamos hacer que nuestros comandos hagan algo. Normalmente, un comando simplemente iniciará una actividad, pero puede hacer más (más sobre esto más adelante). El siguiente comando es para el patrón de ruta /home. clase HomeCommand: Comando() { anular diversión ejecutar() = navegar { contexto -> contexto.startActivity(Intent(context, HomeActivity::class.java)) } } Al observar el ejemplo de HomeCommand, observe el bloque navegar { .. }. Los comandos deben terminar con un bloque de navegación {} y el bloque debe definir lo que debe suceder una vez que se complete el comando. La razón de esto es que los comandos pueden funcionar con corrutinas (más sobre esto más adelante) y, a veces, un comando puede tardar más en completarse y también pasar por cambios de configuración de Android. El bloque de navegación {} se llamará en un momento en el que sea seguro hacerlo en el ciclo de vida de la interfaz de usuario de Android y se le dará el contexto actual para que pueda realizar de forma segura cosas como la navegación por intención. Aparte de la larga explicación para el bloque de navegación, un comando es en su mayoría simple y todo lo que hace es redirigir a una actividad, en este caso HomeActivity. El siguiente ejemplo es el ProductCommand que está asignado al patrón /products/[a-zA-Z0-9]* clase ProductCommand: Command() { valor privado productId por pathSegment(1) anular diversión ejecutar() = navegar { contexto -> contexto.startActivity( Intent(context, ProductActivity::class.java) .putExtra(«productId», productId ) ) } } Este comando extrae un segmento de ruta de la posición 1 en el URI, que es la parte que coincidió [a-zA-Z0-9]*dandonos el ID del producto. Logramos esto utilizando el conveniente delegado de propiedad pathSegment(index). Al igual que con pathSegment(index), también podemos usar queryParam(name) para obtener los parámetros de consulta del URI; si eso no es suficiente, puede acceder a un uri de propiedad que le proporcionará android.net.Uri. ProductCommand concluye navegando { } construyendo un Intent para ProductActivity pasando el ID del producto extraído del Uri como un intent adicional. Probando sus enlaces profundos Para probar los enlaces, puede usar un comando de shell ADB para iniciar su aplicación y darle un enlace; el siguiente ejemplo muestra cómo iniciar con un enlace que se asigna a HomeCommand. adb shell am start -W -a android.intent.action.VIEW -d «https://simple.site.com/home» com.jet.android.links En el comando especificamos qué aplicación iniciar usando el nombre del paquete com.jet.android.links. Puede leer más sobre esto en los documentos oficiales para desarrolladores de Android https://developer.android.com/training/app-links/deep-linking#testing-filters De manera similar, para asignar a ProductCommand, podemos usar el patrón URI con la identificación del producto. como sigue. adb shell am start -W -a android.intent.action.VIEW -d «https://simple.site.com/products/abcd1234» com.jet.android.links Requisitos del comando Interceptar un enlace profundo y entregarlo en un El comando es útil, podemos inspeccionar el enlace profundo y enrutarlo a la aplicación a una actividad u otra. A veces, sin embargo, es posible que necesitemos más información del usuario que realiza un vínculo profundo a la aplicación o podemos exigirle que cumpla con un estado particular, como estar autenticado o estar ubicado geográficamente. Para manejar estas situaciones podemos usar Requisitos de comando, una manera elegante de suspender un comando hasta que se cumplan los requisitos. El siguiente ejemplo muestra cómo lograr esto utilizando las funciones require() y satisfacción(Any) de la API de enlace. clase OrderDetailsCommand: Command() { valor privado orderId por pathSegment(1) var privado loginResult: LoginResult? = nulo anular diversión ejecutar() { lanzar { loginResult = require() } navegar { contexto -> contexto.startActivity( Intent(context, OrderDetailsActivity::class.java) .putExtra(«orderId», orderId) .putExtra(«loginName «, loginResult!!.name) ) } } } En el comando anterior, cuando lleguemos a la línea loginResult = require() nuestro comando se suspenderá y esperará el valor de require(). Para que el comando continúe, debemos indicarle al enrutador/controlador que satisfaga (cualquiera) el requisito. El siguiente ejemplo muestra una configuración de enrutador de enlace profundo que asigna un enlace profundo entrante con el patrón de ruta /orders/[a-zA-Z0-9]* al comando OrderDertails. Esto coincidirá con un enlace profundo como https://requirements.site.com/orders/abcd1234 clase EjemploDeepLinkActivity: ComponentActivity() { enrutador de valor privado por lazy { deepLinkRouter { esquemas(«https») hosts(«requirements.site. com») «/home» mapTo { HomeCommand() } «/pedidos/[a-zA-Z0-9]*» mapTo { OrderDetailsCommand() } } } val privado loginForResult = RegisterForActivityResult(StartActivityForResult()) { val loginName = it.data!!.getStringExtra(«loginName»)!! router.satisfy(LoginResult(nombre = loginName)) } anular diversión onCreate(savedInstanceState: ¿Paquete?) { super.onCreate(savedInstanceState) router.onRequirement(this) { if (it == LoginResult::class.java) { startLoginActivity() } } router.route(intent.data?: Uri.EMPTY) } private fun startLoginActivity() { loginForResult.launch(Intent(this, LoginActivity::class.java)) } } Usamos la API de resultados de actividad para iniciar una nueva actividad LoginActivity, el usuario ingresa su nombre y regresa con un botón Iniciar sesión. Cuando el usuario regresa a EjemploDeepLinkActivity, extraemos el argumento loginName del resultado Intent (el nombre que ingresaron en el campo de nombre en la pantalla de inicio de sesión) y luego llamamos a router.satisfy(LoginResult(name = loginName)) pasando en el nombre de inicio de sesión. Para iniciar LoginActivity necesitamos decirle al enrutador qué hacer cuando un comando encuentra un requisito router.onRequirement(this) { if (it == LoginResult::class.java) { startLoginActivity() } } Logramos esto llamando a onRequirement y si hemos probado el requisito de LoginResult y si es verdadero, iniciamos la actividad de inicio de sesión usando startLoginActivity() que simplemente inicia LoginActivity. Finalización del comando Cuando se completa un comando, el comportamiento predeterminado al usar la función de extensión deepLinkRouter para configurar un enrutador llamará a la función de navegación (Contexto) del comando y luego llamará a terminar() en la actividad. Si desea hacer algo diferente, puede proporcionar su propia devolución de llamada de finalización de comando. router.onCommandComplete(this) { cuando (it) { es DeepLinkRouter.Result.Complete -> { // TODO hacer algo antes de navegarlo.navigate(this) // TODO hacer algo después de navegar finalizar() } es DeepLinkRouter.Result. Cancelado -> { // TODO maneja la cancelación del comando } } } Mirando el ejemplo, llamamos a onCommpandComplete(LifecycleOwner, (DeepLinkRouter.Result) -> Unit) con una devolución de llamada que puede manejar el resultado y luego debe llamarlo.navigate(this) para ejecutar los comandos de la función de navegación manualmente. Luego puedes finalizar() la actividad (el patrón habitual) o hacer otra cosa. Además de manejar la finalización del comando, también podemos definir qué sucede cuando se cancela el comando; esto ocurrirá si se cancela la rutina del comando Job. Referencias LICENCIA Copyright 2022 Just Eat Takeaway Licenciado bajo la Licencia Apache, Versión 2.0 (la «Licencia»); no puede utilizar este archivo excepto de conformidad con la Licencia. Puede obtener una copia de la Licencia en http://www.apache.org/licenses/LICENSE-2.0 A menos que lo exija la ley aplicable o se acuerde por escrito, el software distribuido bajo la Licencia se distribuye «TAL CUAL», SIN GARANTÍAS NI CONDICIONES DE NINGÚN TIPO, ya sean expresas o implícitas. Consulte la Licencia para conocer el idioma específico que rige los permisos y limitaciones de la Licencia.

Source link

El arsenal de Android: registro

Esta es una biblioteca que permite que módulos o bibliotecas Java/Kotlin puros que utilizan SLF4J como marco de registro se establezcan como puente en la plataforma Google Android en combinación con la utilidad de registro Timber de Jake Wharton. Está basado en el proyecto patrickfav/slf4j-timber con una versión moderna que utiliza Kotlin y la última versión de SLF4J (actualmente v2.0.6). Atención de uso: desde la versión 0.0.3 el artefacto se migra de JitPack a Maven Central. Agregue el artefacto slf4j-timber de este repositorio como una dependencia en el módulo de su aplicación: dependencias { implementación(«com.jakewharton.timber:timber:5.0.1») implementación(«io.github.unveloper:slf4j-timber:0.0. 8») } En los módulos Java/Kotlin puros debería estar presente el artefacto SLF4J: dependencias { implementation(«org.slf4j:slf4j-api:2.0.6») } Y eso es básicamente todo. SLF4J buscará automáticamente implementaciones de ILoggerFactory en el classpath (así que no agregue este paralelo a org.slf4j:slf4j-android). Consulte el código fuente para ver una aplicación de ejemplo. Uso de artefacto obsoleto De v0.0.1 a v0.0.3 Siga las pautas de jitpack.io para agregar el repositorio JitPack a su archivo de compilación si no lo ha hecho. Normalmente, esto significa una edición de su archivo settings.gradle.kts para agregar una nueva definición de repositorio en el bloque de repositorios, como esto: dependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories { google() mavenCentral() maven(«https ://jitpack.io») } } Luego agregue el antiguo artefacto slf4j-timber (com.github.unveloper:slf4j-timber) de este repositorio como una dependencia en el módulo de su aplicación: dependencias { implementación(«com.jakewharton.timber :timber:5.0.1») implementación(«com.github.unveloper:slf4j-timber:0.0.3») } Dependencias por versión slf4j-timber Timber SLF4J 0.0.8 5.0.1 2.0.6 0.0.7 5.0.1 2.0.5 0.0.6 5.0.1 2.0.4 0.0.5 5.0.1 2.0.3 0.0.4 5.0.1 2.0.2 0.0.3 5.0.1 2.0.1 0.0.2 5.0.1 2.0.0 0.0. 1 5.0.1 2.0.0 Descripción Mapeo de nivel de registro Las prioridades se convertirán al nivel de prioridad de LogCat y se pasarán a Timber.log(…);. Los Log.isLoggable() no se respetan aquí, ya que Timber debería ser responsable de decidir cuándo registrar qué. La siguiente tabla muestra la asignación de los niveles de registro SLF4J a los niveles de registro LogCat. SLF4J Android/Timber TRACE VERBOSE DEPURACIÓN INFORMACIÓN DE DEPURACIÓN INFORMACIÓN ADVERTENCIA ADVERTENCIA ERROR ERROR Asignación de nombres de registrador Las instancias de registrador creadas usando LoggerFactory se nombran según el nombre dado como parámetro o el nombre de clase completo de la clase dada como parámetro. No se producirá ningún truncamiento ya que Timber se encarga de esto por sí mismo. Limitaciones La implementación del enlace Android-Timber actualmente no admite marcadores. Todos los métodos de registro que tienen un parámetro Marcador simplemente delegan al método correspondiente sin un parámetro Marcador, es decir, el parámetro Marcador se ignora silenciosamente. Licencia Copyright (C) 2015-2022 unveloper Copyright (C) 2005-2012 El proyecto de código abierto de Android con licencia Apache, versión 2.0 (la «Licencia»); no puede utilizar este archivo excepto de conformidad con la Licencia. Puede obtener una copia de la Licencia en http://www.apache.org/licenses/LICENSE-2.0 A menos que lo exija la ley aplicable o se acuerde por escrito, el software distribuido bajo la Licencia se distribuye «TAL CUAL», SIN GARANTÍAS NI CONDICIONES DE NINGÚN TIPO, ya sean expresas o implícitas. Consulte la Licencia para conocer el idioma específico que rige los permisos y limitaciones de la Licencia.

Source link

El arsenal de Android – Ubicación

Antes de comenzar: Requisitos básicos para la barra de búsqueda: antes de comenzar a usar el SDK de Places para Android, necesita un proyecto con una cuenta de facturación y la API de Places habilitada. Recomendamos crear varios propietarios de proyecto y administradores de facturación, para que siempre tengas a alguien con estos roles disponible para tu equipo. Para obtener más información, consulta Configurar en Cloud Console. *Buscar cualquier ubicación usando la biblioteca de Google Places *Elija cualquier ubicación del mapa *Editar ubicación y agregar más detalles Configurar proyecto Agregue esto a su proyecto build.gradle allprojects { repositories { maven { url «https://jitpack.io» } } text { appcompat = ‘1.3.0’ material = ‘1.3.0’ google_places = ‘2.5.0’ } } Agregue esto a su proyecto build.gradle Dependencias dependencias { implementación ‘com.github.appsfeature:location-picker:2.6’ } Dependencias de bibliotecas de soporte necesarias { implementación «androidx.appcompat:appcompat:$rootProject.ext.appcompat» implementación «com.google.android.material:material:$rootProject.ext.material» } Métodos de uso clase pública MainActivity extiende AppCompatActivity implementa LocationPickerCallback { TextView tvStatus privado; @Override protected void onCreate(Bundle saveInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tvStatus = findViewById(R.id.tv_status); } public void onPick(Ver vista) { LocationPicker.getInstance() .setLocationCallback(this) .open(this, CountryCode.India); } @Override public void onLocationSelected(Detalle de LocationPickerDetail) { tvStatus.setText(detail.getLatLong()); } @Override public void onCanceled(Exception e) { } } public class AppApplication extiende la aplicación { instancia privada estática de AppApplication; aplicación estática pública getInstance() { instancia de retorno; } @Override public void onCreate() { super.onCreate(); instancia = esto; LocationPicker.getInstance() .setProperty(LocationProperties.Builder() .setEnableSearchBar(true) .setEnableAddressLine1(true) .setEnableAddressLine2(true) .setEnableCityDetails(true) .setEnableTranslucentStatus(true) .setHintAddressLine1(«Detalle de la tienda») .setApiKey(getString (R.string.google_api_key))); } } Es necesario agregar el archivo google-services.json en el directorio raíz de la aplicación.


Personalizar recursos XML
Continuar
Mostrar selector de ubicación
Ingresar N° Piso / Piso / Punto de Referencia
Línea de dirección 2
Detalle de la ciudad


12p
16sp

Source link

Página 1 de 2

Funciona con WordPress & Tema de Anders Norén