Todo lo que necesitas saber sobre tecnología

Etiqueta: aplicaciones de android Página 1 de 3

Google Maps puede hacer que sea más fácil recordar los lugares que visitó (APK Tavown)

Google Maps puede hacer que sea más fácil recordar los lugares que visitó (APK Tavown)

Rita El Khoury / Android Authoritytl; dr La pestaña You en Google Maps tiene una nueva sección llamada «sus lugares recientes». Esta sección muestra una lista de todos los lugares recientes que visitó. Puede clasificar ubicaciones con varios tipos de filtros, guardar una ubicación, compartir una ubicación y eliminar una ubicación de su historial. ¿Tiene problemas para recordar la tienda a la que fue hace unos días? O tal vez desee compartir la ubicación de un restaurante que comió el otro día. Google Maps está obteniendo una función que mostrará todos los lugares que visitó recientemente en un solo lugar. Cuando toque la pestaña Usted en Google Maps, verá una sección llamada sus listas, que contiene varias listas como amigos, favoritos, viajes guardados, etc. Mientras exploraba la versión 25.34.00.796159725 de la aplicación, descubrimos que se ha agregado una nueva sección por encima de la sección de sus listas. Esta nueva sección se llama «sus lugares recientes». ¿No quieres perderte lo mejor de Android Authority? Como sugiere el título, la sección de sus lugares recientes le mostrará una lista de todos los lugares que visitó recientemente. Por encima de esa lista se encuentra un carrusel de filtros, que incluyen el historial de área, categoría, guardado y mapas. Cada uno de estos filtros proporciona múltiples formas de filtrar. Por ejemplo, cuando toque la categoría, verá opciones para filtrar por comida y bebida, cultura, compras, atracciones y hoteles. A la derecha de cada ubicación enumerada, verá un icono de marcador y un menú de tres puntos. Como probablemente pueda adivinar, Bookmark le permite guardar una ubicación en una lista. Mientras tanto, los tres puntos verticales abren un menú donde puede compartir esa ubicación, consulte el historial de visitas y mapas, o elimine una ubicación de su historial. Esta nueva sección de pestañas no es la única característica nueva que encontramos esconderse en Google Maps recientemente. También aprendimos que Google está trabajando en algo para que sea más fácil compartir una lista de resultados de búsqueda con otros. ⚠️ Un desgarro de APK ayuda a predecir características que pueden llegar a un servicio en el futuro basado en el código de trabajo en progreso. Sin embargo, es posible que tales características predichas no lleguen a una versión pública. Gracias por ser parte de nuestra comunidad. Lea nuestra política de comentarios antes de publicar.

5 Administradores de contraseñas que debe usar en lugar de LastPass

5 Administradores de contraseñas que debe usar en lugar de LastPass

Joe Hindy / Android Authority fue un momento en que LastPass era el administrador de contraseñas que todos deberían usar. Esa declaración sigue en pie, pero con un pequeño giro: LastPass es ahora el administrador de contraseñas número uno de todos deberían mantenerse lejos. ¿La razón de esto? Múltiples rondas de fugas y una serie de vulnerabilidades de seguridad. Give LastPass Un pase duro, porque hay muchas opciones mejores disponibles, las que son más seguras y convenientes, se preguntará por qué no cambia antes (o comienza a usar una en primer lugar si aún no está en el barco de seguridad). En donde cae, aquí hay cinco administradores de contraseñas que recomiendo usar en lugar de LastPass. ¿Cuál cree que es la mejor alternativa de último paso? Tiene todo lo que esperaría de una aplicación creada para manejar sus datos más confidenciales. Su nivel gratuito es uno de los más generosos, está disponible en todas las plataformas, e incluso ofrece un autohospero si te sientes aventurero. El plan individual premium cuesta solo $ 10 al año, una recomendación fácil para los extras que trae. Incluso si se queda con los propios servidores de Bitwarden para el almacenamiento, sabe que sus datos son seguros porque es de código abierto y auditado independientemente. Además, migrar sus datos de LastPass es muy fácil utilizando las herramientas incluidas. La interfaz podría no ser tan elegante como sus alternativas más caras, pero es perfectamente funcional, y su seguridad supera con creces cualquier advertencia estética menor. 1Password 1Password es fácilmente la experiencia de usuario más pulida y elegante que encontrará en un administrador de contraseñas. Si desea que la administración de contraseñas se sienta menos como una tarea, esta es la que debe ir. Nuestra propia Rita El-Khoury lo jura, especialmente por sus características de compartir familiares de primer nivel y una fiabilidad sólida. No hay nivel gratuito, pero teniendo en cuenta la longitud y la amplitud de las características que ofrece, vale la pena cada centavo. Si bien 1Password no es de código abierto, se audita de forma independiente, el informe más reciente en febrero de 2025 no encontró vulnerabilidades. Si está dispuesto a pagar la tranquilidad, 1Password debería ser su primera parada. Dashlane Dashlane también es uno de los administradores de contraseñas más ricos en funciones, tanto que podría abrumar a los principiantes. Empaca en extras como una VPN incorporada y un monitoreo web oscuro (características que obtiene de los planes pagados de Google One), pero aquí están integrados directamente en su administrador de contraseñas. Honestamente, tiene más sentido tener estas características horneadas en su administrador de contraseñas en sí. Hay un nivel gratuito, pero es muy limitado. Si te tomas en serio Dashlane, querrás el plan premium. El único inconveniente importante es que el precio ha aumentado en los últimos tiempos, lo que no se sentó bien con sus usuarios, y tampoco hay una opción de pago única. Proton de pasar el mismo equipo centrado en la privacidad detrás de Proton Mail, Proton Calendar, Proton Drive y Proton VPN, Proton Pass conlleva el mismo cifrado fuerte y la filosofía de privacidad por diseño. Es de código abierto, bellamente diseñado y seguro hasta el núcleo. El nivel pagado desbloquea ventajas como alias de correo electrónico ilimitados y monitoreo web oscuro para sus cuentas. El plan gratuito es sólido, pero deja a cabo conceptos básicos como almacenamiento de tarjetas de crédito y archivos adjuntos, siempre que el primero, al menos, haría que el nivel libre sea mucho más atractivo. Aún así, Proton Pass parece una aplicación de 2025, no de 2015, y está mejorando rápidamente. Dicho esto, todavía hay algunos bordes ásperos y características faltantes, como el soporte de relojes inteligentes. Enpasskarandeep Singh / Android AuthorityEnpass es mi administrador personal de contraseñas de elección, y lo he estado usando durante años. Estoy en un plan de abuelo que me brinda todas las características del antiguo profesional, lo que significa que puedo guardar contraseñas ilimitadas, tarjetas de crédito, notas y archivos sin restricción. El diseño de la aplicación no es de vanguardia (han pasado un par de años desde una actualización importante), pero hace el trabajo. Su manejo de bóveda es un poco atípico: Enpass no aloja sus datos en sus propios servidores. En su lugar, lo almacena en su servicio en la nube preferido (Google Drive, OneDrive, iCloud y similares). Esa separación agrega una capa adicional de seguridad entre la aplicación y su bóveda real. El nivel gratuito es restrictivo, pero los planes pagados se encuentran entre los más asequibles. Y, francamente, sigue siendo millas mejor que en cualquier último paso. Los administradores de contraseñas son algo que todos sabemos que deberíamos estar usando, pero muchos de nosotros no. Todavía veo a la gente que depende de la memoria, reutilizando la misma contraseña en todas sus cuentas, lo que solo está pidiendo problemas. Y también es inconveniente. Olvida qué variación de contraseña usó para un servicio, y está atascado restableciendo su contraseña cada vez que intenta iniciar sesión. Los administradores de contraseñas modernas, con el desbloqueo de la cara y las huellas digitales, hacen la vida mucho más fácil y mucho más seguro. Esa es una razón sólida para comenzar a usarlos. ¿Qué Administrador de contraseñas usa? Cuéntanos en los comentarios a continuación. Gracias por ser parte de nuestra comunidad. Lea nuestra política de comentarios antes de publicar.

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

Página 1 de 3

Funciona con WordPress & Tema de Anders Norén