Todo lo que necesitas saber sobre tecnología

Etiqueta: desarrollo de Android Página 1 de 2

Android 15 viene con una función que supera al iPhone

La brecha entre Android y iPhone se ha reducido considerablemente, y ambos sistemas operativos y sus dispositivos ofrecen características y experiencias similares. Si bien a menudo se considera que Google sigue en lugar de liderar en este espacio, recientemente ha introducido una nueva característica notable que en realidad llegará primero a Android, potencialmente en un futuro cercano. Google se está esforzando por alinear más estrechamente a Android con el iPhone, mientras las dos plataformas dominantes de teléfonos inteligentes compiten por los usuarios. En sus esfuerzos continuos, Google ha estado reforzando la seguridad de Android, integrando llamadas de WhatsApp en su marcador telefónico e incluso incorporando pases de Apple en su función de billetera. Con su última actualización, Google no sólo iguala una característica existente del iPhone, sino que la supera significativamente, superando inesperadamente a Apple en este aspecto. Android 15 contará con servicio SOS Forbes cubrió anteriormente la iniciativa de Google de incorporar un servicio satelital de emergencia como una nueva característica. Este movimiento pondrá a Android a la par con la funcionalidad SOS satelital que Apple ha ofrecido en su iPhone durante algunos años. La implementación de Google parece incluir un servicio de rescate Garmin prediseñado en su plan, lo que representa un avance significativo para garantizar la seguridad de su amplia base de usuarios. El problema con la función SOS de emergencia de Apple es su alcance limitado: está diseñada específicamente para emergencias. Para aquellos de nosotros que no escalamos montañas o navegamos por los océanos, muestra un indicador SOS en la pantalla cuando estamos fuera de cobertura, pero es una función que muchas personas nunca usan. Con el reciente lanzamiento de la vista previa para desarrolladores de Android 15, Google parece estar reduciendo la brecha al ofrecer a los usuarios la oportunidad de ampliar sus planes celulares para incluir un complemento satelital. Además, las principales aplicaciones de mensajería podrán utilizar esta red satelital, eliminando efectivamente los puntos negros de los celulares y evitando que los usuarios se vean sumergidos en agujeros negros de conectividad. ¿El servicio satelital funciona en dispositivos con Android 15? Mishaal Rahman señaló que “Android 15 DP2 introduce ciertos elementos de la interfaz de usuario para mantener una experiencia de usuario consistente en dispositivos con soporte de conectividad satelital. Además, la actualización mejora la compatibilidad de la plataforma para la conectividad satelital al introducir una nueva API que permite a las aplicaciones identificar cuándo un dispositivo se conecta a un satélite. Además, Android 15 permite que las aplicaciones SMS/MMS/RCS utilicen conectividad satelital para enviar y recibir mensajes”. Gizchina Noticias de la semana La novedad significativa radica en que determinadas redes pretenden incorporar la conectividad satelital LEO como opción de suscripción. Esto representa un avance con respecto a las expectativas iniciales, cuando Google introdujo prematuramente una función «Satellite SOS» en los teléfonos Pixel, junto con la detección de accidentes automovilísticos y el SOS de emergencia. La conectividad satelital de Apple todavía tiene restricciones relativas. “Con iPhone 14, iPhone 14 Pro, iPhone 15 o iPhone 15 Pro”, dice la descripción, “puedes vincular tu iPhone a un satélite para enviar mensajes de texto a los servicios de emergencia, solicitar asistencia en la carretera y compartir tu ubicación con amigos y familia, todo sin cobertura móvil o Wi-Fi”. Esperábamos que Android pudiera ir un paso más allá, ya que el código beta anterior indicaba una opción de mensajería satelital en colaboración con T-Mobile. Las posibilidades de lo que esto podría implicar eventualmente llegaron a los titulares cuando Elon Musk anunció que SpaceX había logrado velocidades de descarga de 17 mbps en un Galaxy S21 Ultra sin modificar. ¿Cómo funcionará el servicio satelital en Android 15? Según informó SamMobile después de la prueba de Samsung, el dispositivo no necesitaría ningún hardware especial para conectarse a un satélite. Por lo tanto, incluso en áreas cercanas sin cobertura de red celular convencional, un teléfono inteligente podría realizar o recibir llamadas y mensajes conectándose directamente a un satélite. Starlink ha estado probando un servicio de este tipo y parece que podríamos utilizarlo en los próximos meses. Esto apunta a un futuro en el que la conectividad satelital directa al teléfono se volverá más común y práctica. Por ahora, integrar la mensajería es un gran paso adelante. Parece confirmado que esta función llegará a Android 15, salvo cambios importantes. A medida que Android y iPhone se acercan, este parece ser un ejemplo en el que Google toma la iniciativa, y es probable que Apple haga lo mismo. Esta noticia llega poco después de la revelación de que Gemini podría llegar al iPhone y en medio de las afirmaciones de Apple sobre la demanda del Departamento de Justicia que podría convertir el iPhone en Android, lo que hace que esta semana sea bastante agitada. Descargo de responsabilidad: Es posible que algunas de las empresas de cuyos productos hablamos nos compensen, pero nuestros artículos y reseñas son siempre nuestras opiniones honestas. Para obtener más detalles, puede consultar nuestras pautas editoriales y conocer cómo utilizamos los enlaces de afiliados.

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