Cómo descargar archivos APK desde Google Play store


Puesto que se trata de la plataforma android  nuestros smartphones  basados en Android tienen características de inteligencia adicional que es ofrecida gracias  a las millones de aplicaciones disponibles desde Internet ,y eso  a esta alturas todos los usuarios de Android lo sabemos  ( o lo deberíamos sospechar)  siendo  lo mas  rápido  y seguro optar por descargar estas desde el sirio oficial:  Google Play Store , sobre todo en los tiempos actuales donde cada día surgen nuevas apps con objetivos  poco éticos enmascaradas en inocentes funcionalidades.

La Google Play Store es pues  una de las claves que hace que un terminal  Android sea genialmente eso pues disponer de un móvil o tablet certificados   y una cuenta de google nos permite el acceso a la tienda y con ellos a  infinidad de opciones.

A veces  hay terminales de  bajo coste que no todos traen la tienda de Google de Serie (los chinos suelen dar problemas aquí, pero no son los únicos : por ejemplo los terminales de Amazon ),   o simplemente no  pueden  acceder por problema en el firmware ,actualizaciones erróneas, fallos de red ,etc  , razón por las que puede nos interesase descargar las app en local desde nuestro pc para luego copiarla en una sd  y luego en el terminal desde un explorador de archivos realizar la instalación manualmente desde el propio apk con el instalador de paquetes

apple applications apps cell phone
Photo by Tracy Le Blanc on Pexels.com

 

¿Por qué no podemos descargar apk de google play store???

Google tiene algunas políticas estrictas que impiden a los usuarios de android que descarguen los  archivos de apk directamente a sus dispositivos para impedir la piratería.Ademas  hay otros asuntos relacionadas como si una aplicación específica que usted quiere está disponible en su país o si  oficialmente es soportados por  un  cierto dispositivo o no o a partir de una determinada version .

Obviamente , ante esta  problemática , existen muchas alternativas de Tiendas de aplicaciones en Internet que  almacena y  permiten descargar apk directamente , pero insistimos el riesgo puede ser viral, así que lo idea seria bajar el fichero apk desde Google play store directamente ¿pero como se pueden saltar restricciones de necesitar la app de Google Play para instalara cualquier app de Google Play en un terminal? Pues es posible y lo vamos  a ver a continuación

¿Cómo anular  restricciones y descargar Apk de Google Play Store?

Descargar archivos apk directamente desde Google play oficialmente no es posible por políticas de google. Sin embargo, hay una alternativa, como cada moneda tiene dos caras. Hay una aplicación llamada «Apk Downloader extensión» que ha hecho posible que sea posibe  descargar el APK desde Google Play Store. Esta aplicación realmente hacer maravillas y de alguna manera se las arregla para tirar desde servidores de la tienda oficial

Creo que esta opción  ofrece muchas ventajas pues .

  • Le da libertad para descargar aplicaciones que no están disponibles en su país.
  • Soporta todos los dispositivos.
  • Puede instalar  Apk desde play store, incluso si no  tiene instalado Google Play  en su dispositivo.

Esta  aplicación puede saltarse todas las restricciones de servicios de Google play y por lo tanto esta aplicación particular puede ser utilizada por ambos tipos de usuarios de android que tienen tienda activada o desactivada.

Extension ApK dowloader

La extensión de Chrome llamada  Apk Downloader  funciona perfectamente con casi todas las aplicaciones disponibles en la Google Play que sean gratuitas , así que si quiere descargar aplicaciones y almacenar su archivo Apk, puede descargar esta aplicación desde la tienda play en primer lugar en su pc   y luego llevarse el archivo al dispositivo donde lo quiera instalar.

Para usar esta extensión   en  su navegador siga estos pasos

  1. Descargue  la extensión desde aqui 
  2. Añada la extensión  a Google chrome
  3. Acepte la instalación de esta extensión
  4. Compruebe en la esquina superior derecha de la pantalla justo a la izquierda del icono de búsqueda que hay un icono naranja nuevo.

Ahora una vez instalada la extensión en Google Chrome ,sigue estos pasos para obtener el apk directamente desde Google Play Store.

  1. Ir a Play Store y seleccionar cualquier aplicación que desee descargar.
  2. Copiar la URL ( Ctrl+C)
  3. Pulse el botón de compartir de la esquina superior derecha de la pantalla justo a la izquierda del icono de búsqueda.extension
  4. Seleccione ‘Apk Downloader extensión‘ de las opciones sobre acciones.
  5. Copiar la url de la aplicación  con Ctrl+V en la caja de dialogo
  6. Pulsar Generate Donwload Linkapkdown.PNG
  7. Esperar hasta iniciar la descarga.
  8. El Apk se descargarán automáticamente sin la intervención de los servicios de Google Play.

Para instalar la apk  el archivo APK en su teléfono Android simplemente siga los pasos a continuación:

  1. Coloque el archivo APK en la tarjeta SD o memoria interna de su teléfono (preferiblemente tarjeta SD externa).
  2. Explore la memoria del teléfono / memoria externa y toque el archivo APK.
  3. Haga clic en ‘instalar’
  4.  Espere a que se instale el APK.
  5.  No ejecute la aplicación todavía.
  6. Una vez instalada  y puede abrir la aplicación

 

Descarga del APK desde otro Navegador

Quizás  si no tiene instalado el navegador Chrome,   la mejor opción para descargar los apks de Google Play sea usar algún servicio de descarga que nos pase el apk directamente de Google Play  como por ejemplo el servicio evozzi.com.

Estos son los pasos a seguir

  1. Ir a Play Store y seleccionar cualquier aplicación que desee descargar.
  2. Copiar la URL ( Ctrl+C)
  3. Ir  a https://apps.evozi.com/apk-downloader/
  4. Pulsr Ctrl+V enla caja para pegar la url desde Google Play
  5. Pulsar Generate Download Linkinstalla.PNG
  6. Solo tenemos que pulsar en el botón verde  y se iniciara la descarga del apk a local
  7. Coloque el archivo APK en la tarjeta SD o memoria interna de su teléfono (preferiblemente tarjeta SD externa).
  8. Explore la memoria del teléfono / memoria externa y toque el archivo APK.
  9. Haga clic en ‘instalar’
  10.  Espere a que se instale el APK.
  11.  No ejecute la aplicación todavía.
  12. Una vez instalada  y puede abrir la aplicación

 

Por cierto  ,para que ambos  funcionen debe activar la casilla de “Orígenes desconocidos” que encontrarás dentro de los ajustes de  Android y “Seguridad”.

 

 

 

Anuncio publicitario

Controle su Roomba con Arduino y Android


 

iRobot Roomba Create2 es una a  plataforma grande y muy asequible para el desarrollo de la robótica, costando alrededor de US$ 200 permitiendo  una variedad de métodos de programación. Como  comienzo mjrovi usó  un Arduino y una aplicación Android para mover el robot  por puerto serie  consiguiendo asi controlar  sus motores, LEDS y sonido.

Como uno de los ganadores de 2016 del concurso de robótica   en Instructables, mjrovi recibió como premio un iRobot Roomba Create2.

 

 

La Roomba es un robot de impulsión diferenciada, con 2 ruedas motrices y una rueda  central  guía. Su velocidad va hasta 500 mm/s y puede ser mandado a ir hacia arriba o hacia atrás.
Para señalización, contamos con cuatro 7 segmentos display y 5 LEDs :

  • Limpiar
  • Punto
  • Muelle
  • ADVERTENCIA/Check
  • Suciedad/escombros

Como sensores internos, tenemos entre otros:

  • Detector de acantilado (4 en el frente)
  • Detectores Bump (frente 2)
  • Codificadores de rueda

Para la programación, el documento: iRobot® Create® 2 abierto interfaz (OI) debe ser utilizado.El Roomba puede ser programado en 3 modos:

  1. Modo pasivo:Al enviar el comando de Start o cualquiera de los comandos de modo de limpieza (por ejemplo, punto limpio, muelle buscar), la OI entra en modo pasivo. Cuando la OI está en modo pasivo, puede solicitar y recibir datos de los sensores usando cualquiera de los comandos del sensor, pero no puede cambiar los parámetros de comando actuales para los actuadores (motores, altavoces, luces, controladores de lado de baja, salidas digitales) a otra cosa.
  2. Modo seguro :Le da un control completo de Roomba, con excepción de las siguientes condiciones relacionadas con la seguridad:
    Cargador conectado y alimentado:detección de una caída de rueda (en cualquier rueda),detección de un acantilado mientras se mueve hacia adelante (o hacia atrás con un pequeño radio de torneado, menos de un radio de robot) o si ocurre una de las condiciones relacionadas con la seguridad mientras que el OI es en modo seguro, Roomba detiene todos los motores y vuelve al modo pasivo.
  3. Modo completo:Le da un control completo sobre Roomba, todos de sus actuadores y todas las condiciones relacionadas con la seguridad que están restringidas cuando la OI en modo seguro, como el modo completo se apaga el acantilado, caída de rueda y características de seguridad cargador interno.

Comunicaciones

Para  programar la Romba  la lista de  materiales  usada es la siguiente:

  • iRobot Create2
  • Arduino UNO
  • Módulo Bluetooth HC-06
  • Pulsador

Para la comunicación entre la Roomba y Arduino, se utilizará el puerto Serial. Por defecto, Roomba comunica a 115.200 baudios, pero para comunicarse con Arduino, se cambiará a 19.200.

Hay 2 formas de establecer la tasa de baudios de Roomba:

  1. Mientras que apagar Roomba, continúan mantenga pulsado el botón de encendido o limpiar después de que la luz se ha apagado. Después de unos 10 segundos, Roomba juega una melodía descendente de las echadas. Roomba se comunicará a 19.200 baudios hasta que el procesador pierde energía de la batería o la tasa de baudios se modifica explícitamente a través de la OI.
  2. Utilizar el pin de cambio de tasa de baudios (pin 5 del conector mini-DIN) para cambiar la velocidad en baudios de Roomba. Después de encender la Roomba, esperar 2 segundos y luego pulso el cambio de la tasa de baudios baja tres veces. Cada impulso debe durar entre 50 y 500 milisegundos. Roomba se comunicará a 19200 baudios hasta que el procesador pierde energía de la batería o la tasa de baudios se modifica explícitamente a través de la OI.

 

El diagrama de arriba muestra cómo la Arduino debe conectarse al conector mini-DIN de Roomba

 

 

Lo primero creo que debe hacerse cuando un Roomba de programación es «Despertar» el robot y  Definir el modo (segura o completa)

Nosotros podemos  hacer  un «wake-up», enviar un poco de pulso al pin mini-DIN 5 (detección de dispositivo de entrada) como se muestra en la siguiente función:
void wakeUp (void)
{
setWarningLED(ON);
digitalWrite(ddPin, HIGH);
delay(100);
digitalWrite(ddPin, LOW);
delay(500);
digitalWrite(ddPin, HIGH);
delay(2000);
}

Para empezar a Roomba deberán enviarse 2 códigos de siempre: «START» [128] y el modo, en nuestro caso «Modo seguro» [131]. Si usted quiere un «modo completo», debe enviarse en su lugar el código [132].
void startSafe()
{
Roomba.write(128); //Start
Roomba.write(131); //Safe mode
delay(1000);
}

 

Como se describe en la introducción, el Roomba tiene 5 LEDs:

  • Energía/limpiar (bicolor rojo/verde e intensidad controladas)
  • Punto (verde, intensidad fija)
  • Muelle (verde, intensidad fija)
  • ADVERTENCIA/Check (naranja, intensidad fija)
  • Suciedad/escombros (azul, fija la intensidad)

 

Control de leds

Todos los LEDs pueden ser ordenados mediante código [139]
Para controlar el LED de encendido, debe enviar dos bytes de datos a Roomba: «color» y la «intensidad».
Color:

  • Verde = 0
  • Naranja = 128
  • rojo = 255

Intensidad:

  • Bajo = 0
  • Max = 255

La función setPowerLED (colores bytes, setIntensity bytes) lo hace:

void setPowerLED(byte setColor, byte setIntensity)
{
color = setColor;
intensity = setIntensity;
Roomba.write(139);
Roomba.write((byte)0x00);
Roomba.write((byte)color);
Roomba.write((byte)intensity);
}

Por ejemplo, para encender el LED de POWER de color naranja en la mitad de su intensidad, usted puede llamar a la función como bramido:setPowerLED (128, 128);

Encender los 4 LEDs restantes, deberán utilizarse las siguientes funciones:
setDebrisLED(ON);
setDockLED(ON);
setSpotLED(ON);
setWarningLED(ON);

Todas las funciones anteriores tiene un código similar a este:
void setDebrisLED(bool enable)
{
debrisLED = enable;
Roomba.write(139);
Roomba.write((debrisLED ? 1 : 0) + (spotLED ? 2 : 0) + (dockLED ? 4 : 0) + (warningLED ? 8 : 0));
Roomba.write((byte)color);
Roomba.write((byte)intensity);
}

Básicamente, la diferencia será la línea: debrisLED = habilitar;  debe modificarse permitiendo a cada uno de los otros LEDs (spotLED, dockLED, warningLED).

 

Envío de mensajes

Roomba tiene cuatro 4 displays de 7 segmentos que puede utilizar para enviar mensajes de dos maneras::
[163] código: Dígitos LED crudo (numérico)
[164] código: Dígitos LED de ASCII (aproximación de letras y códigos especiales)
Para mostrar números  debe enviar el código [163], siguiendo las 4 digitas a mostrar. La función: setDigitLEDs (bytes digit1 digit2 bytes, digit3 bytes, digit4 bytes) lo hace para usted:

void setDigitLEDs(byte digit1, byte digit2, byte digit3, byte digit4)
{
Roomba.write(163);
Roomba.write(digit1);
Roomba.write(digit2);
Roomba.write(digit3);
Roomba.write(digit4);
}

Por ejemplo, para mostrar «1, 2, 3, 4», debe llamar a la función: setDigitLEDs (1, 2, 3, 4);

Con el código [164], es posible enviar aproximación de ASCII.

La función setDigitLEDFromASCII (dígitos de byte, char letra) hace esto para nosotros:
void setDigitLEDFromASCII(byte digit, char letter)
{
switch (digit){
case 1:
digit1 = letter;
break;
case 2:
digit2 = letter;
break;
case 3:
digit3 = letter;
break;
case 4:
digit4 = letter;
break;
}
Roomba.write(164);
Roomba.write(digit1);
Roomba.write(digit2);
Roomba.write(digit3);
Roomba.write(digit4);
}

Para simplificar, crear una nueva función para enviar los 4 dígitos al mismo tiempo:
void writeLEDs (char a, char b, char c, char d)
{
setDigitLEDFromASCII(1, a);
setDigitLEDFromASCII(2, b);
setDigitLEDFromASCII(3, c);
setDigitLEDFromASCII(4, d);
}

Por ejemplo, para mostrar «STOP», usted debe llamar a la función: writeLEDs (‘s’, ‘ t ‘, ‘ o ‘, ‘p’);

Mover la  Roomba

Para la movilidad, Roomba tiene 2 motores independientes que pueden programarse para ejecutar 500mm/s. Hay varios comandos que pueden utilizarse para controlar el robot. Los principales son:

  • Código [137]: Unidad == > debe enviar +-velocidad en mm/s y +-radio en mm
  • Codigo [145] de código: Impulsión directa == > debe enviar izquierda velocidad en mm/s (+ para adelante y para atrás)
  • Código [146]: Unidad PWM == > debe enviar +-datos PWM para la izquierda y derecha las ruedas

 

A continuación el código para estas 3 opciones:

void drive(int velocity, int radius)
{
clamp(velocity, -500, 500); //def max and min velocity in mm/s
clamp(radius, -2000, 2000); //def max and min radius in mm

Roomba.write(137);
Roomba.write(velocity >> 8);
Roomba.write(velocity);
Roomba.write(radius >> 8);
Roomba.write(radius);
}

//—————————————————————

void driveWheels(int right, int left)
{
clamp(right, -500, 500);
clamp(left, -500, 500);

Roomba.write(145);
Roomba.write(right >> 8);
Roomba.write(right);
Roomba.write(left >> 8);
Roomba.write(left);
}

//—————————————————————
void driveWheelsPWM(int rightPWM, int leftPWM)
{
clamp(rightPWM, -255, 255);
clamp(leftPWM, -255, 255);

Roomba.write(146);
Roomba.write(rightPWM >> 8);
Roomba.write(rightPWM);
Roomba.write(leftPWM >> 8);
Roomba.write(leftPWM);
}

Tenga en cuenta que la función de «fijar» define los valores máximos y mínimos que se permitieron la entrada. Esta función se define en el archivo rombaDefines.h:

#define abrazadera (valor, min, max) (valor < min? min: valor > max? max: valor)
Utilizando el código anterior, se pueden crear funciones más simples para Roomba alrededor de:
/—————————————————————
void turnCW(unsigned short velocity, unsigned short degrees)
{
drive(velocity, -1);
clamp(velocity, 0, 500);
delay(6600);
drive(0,0);
}

//—————————————————————
void turnCCW(unsigned short velocity, unsigned short degrees)
{
drive(velocity, 1);
clamp(velocity, 0, 500);
delay(6600);
drive(0,0);
}

//—————————————————————
void driveStop(void)
{
drive(0,0);
}

//—————————————————————
void driveLeft(int left)
{
driveWheels(left, 0);
}

//—————————————————————
void driveRight(int right)
{
driveWheels(0, right);
}

Tenga en cuenta que para girar en ángulo, debe calcularse el argumento de «retraso» específicamente para una velocidad dada

A continuación algunos ejemplos que pueden utilizar para probar los motores:

turnCW (40, 180); girar 180 grados hacia la derecha y parada
driveWheels (20, -20); vuelta
driveLeft(20); girar a la izquierda

Para las pruebas de los motores, es bueno añadir un pulsador externo (en mi caso conectado al Arduino pin 12), para que puedan descargar el código de Arduino, a partir de la Roomba, pero parando la ejecución hasta que se pulsa la tecla. Generalmente, para los motores de prueba lo puedes hacer en la parte de configuración del código.

Como ejemplo, consulte el código de Arduino simple abajo (nota que el código usa funciones y definiciones desarrollaron antes):

#include «roombaDefines.h»
#include

// Roomba Create2 connection
int rxPin=10;
int txPin=11;
SoftwareSerial Roomba(rxPin,txPin);

//———————————————
void setup()
{
Roomba.begin(19200);

pinMode(ddPin, OUTPUT);
pinMode(buttonPin, INPUT_PULLUP); // connected to Arduino pin 12 and used for «starting»

delay(2000);

wakeUp (); // Wake-up Roomba
startSafe(); // Start Roomba in Safe Mode

while (digitalRead(buttonPin)) { } // wait button to be pressed to continous run code

turnCW (40, 180); //test Roomba spin clock-wise 180 degrees and stop
}

//———————————————
void loop()
{

}

 

Controlar la Roomba a través de Bluetooth

Para controlar  Roomba de modo inalambrico   vamos a instalar un módulo Bluetooth (HC-06) a nuestro Arduino. El diagrama de arriba muestra cómo hacerlo. Suele ser el HC-06 settle up de fábrica con una velocidad de 9.600. Es importante cambiarlo a 19.200 para ser compatible con la velocidad de la comunicación de Arduino-Roomba. Usted puede hacer que el envío un comando AT para el módulo (AT + BAUD5 donde «5» es el código de 19.200).

Para controlar la Roomba, utilizaremos una aplicación genérica que fue desarrollada por jrovai   para el control de robots móviles, con el MIT AppInventor 2: «MJRoBot BT Remote Control». La aplicación puede descargarse gratuitamente de la tienda de Google a través del enlace: aplicación: MJRoBot BT Remote Control.

La aplicación tiene una interfaz sencilla, lo que le permite enviar comandos al módulo de BT en ambos, modo de texto o directamente a través de botones preprogramados (cada vez que se pulsa un botón, un carácter se envía):

  • w: hacia adeñante
  • S: hacia atras
  • d: derecho
  • a: izquierda
  • f: parada
  • p: ON / OFF (no usado en esta primera parte)
  • m: manual / automático (se utiliza para reiniciar Roomba si un obstáculo como un acantilado se encuentra en modo seguro)
  • +: Velocidad +
  • -: Velocidad –

También puede enviar otros comandos como texto si es necesario. También hay una ventana de texto para los mensajes recibidos desde el módulo de BT. Esta característica es muy importante durante la fase de prueba, puede ser utilizado en la misma forma que el «Serial Monitor».

El loop() parte del código será «escuchando» el dispositivo bluetooth y dependiendo del comando recibido, tomar una acción:

void loop()
{
checkBTcmd(); // verify if a comand is received from BT remote control
manualCmd ();
}
La función checkBTcmd() se muestra a continuación:

void checkBTcmd() // verify if a command is received from BT remote control
{
if (BT1.available())
{
command = BT1.read();
BT1.flush();
}
}
Una vez que se recibe un comando, la función manualCmd() tomará la acción apropiada:
void manualCmd()
{
switch (command)
{

case ‘m’:
startSafe();
Serial.print(«Roomba in Safe mode»);
BT1.print(«Roomba BT Ctrl OK – Safe mode»);
BT1.println(‘\n’);
command = ‘f’;
playSound (3);
break;

case ‘f’:
driveStop(); //turn off both motors
writeLEDs (‘s’, ‘t’, ‘o’, ‘p’);
state = command;
break;

case ‘w’:
drive (motorSpeed, 0);
writeLEDs (‘ ‘, ‘g’, ‘o’, ‘ ‘);
state = command;
break;

case ‘d’:
driveRight(motorSpeed);
writeLEDs (‘r’, ‘i’, ‘g’, ‘h’);
break;

case ‘a’:
driveLeft(motorSpeed);
writeLEDs (‘l’, ‘e’, ‘f’, ‘t’);
break;

case ‘s’:
drive (-motorSpeed, 0);
writeLEDs (‘b’, ‘a’, ‘c’, ‘k’);
state = command;
break;

case ‘+’:
if (state == ‘w’)
{
motorSpeed = motorSpeed + 10;
if (motorSpeed > MAX_SPEED)
{
motorSpeed = MAX_SPEED;
}
command = ‘w’;
} else {command = state;}
break;

case ‘-‘:

if (state == ‘w’)
{
motorSpeed = motorSpeed – 10;
}
if (motorSpeed < MIN_SPEED )

{ motorSpeed = MIN_SPEED; }

Serial.println(motorSpeed); command = state; break; } }

 

 

 

El código de Arduino completo utilizado en documentos aquí relacionados se puede encontrar en GITHUB en https://github.com/Mjrovai/Roomba_BT_Ctrl

Varias de las funciones que   el autor  ha creado en su  programa se basaron en la biblioteca de crear 2 desarrollada por Dom Amato. Puede descargar la librería completa en‎: https://github.com/brinnLabs/Create2.

Servicios gratuitos sobre informacion del tiempo


OpenWeatherMap es un servicio en línea que proporciona datos meteorológicos , incluyendo datos meteorológicos actuales,pronósticos y datos históricos a los desarrolladores de servicios web y aplicaciones móviles.

Para fuentes de datos, utiliza servicios de radiodifusión meteorológica, datos en bruto de estaciones meteorológicas de aeropuertos , datos brutos de estaciones de radar y datos en bruto de otras estaciones meteorológicas oficiales.

OpenWeatherMap procesa todos los datos de forma que intente proporcionar datos precisos de pronóstico del tiempo en línea y mapas meteorológicos, como los de las nubes o la precipitación .Más allá de eso, el servicio se centra en el aspecto social mediante la participación de los propietarios de estaciones meteorológicas en la conexión con el servicio y con ello aumentar la precisión de los datos meteorológicos.

Como vemos la filosofía que hay detrás de este servicio   está inspirada en OpenStreetMap y Wikipedia que hacen que la información sea gratuita y disponible para todos,tanto es así que uiliza OpenStreetMap para la visualización de mapas meteorológicos .

Veamos algunos usos e este interesante  servicio:

El tiempo actual y los pronósticos en tu ciudad

 A través de  este servicio podemos ver  el  estado actual del tiempo en cualquier ciudad importante del mundo como  por ejemplo Londres :

Weather London , GB15 °C

Few clouds

00:40 Sep 7Wrong data?

Wind Light breeze, 2.6 m/s, West-northwest ( 290 )
Cloudiness Few clouds
Pressure 1019 hpa
Humidity 55 %
Sunrise 07:22
Sunset 20:33
Geo coords [51.51-0.13]

Los datos actuales se actualizan cada diez minutos; se puede buscar por ciudad o por coordenadas geográficas en la Tierra.

Previsión del Tiempo

También permite obtener no solo  el tiempo actual sino el  pronóstico diario de 16 días y pronóstico de 3 horas cada 5 días para su ciudad. Estadísticas útiles, gráficos y este día en las cartas de la historia están disponibles para su referencia. Mapas interactivos muestran precipitaciones, nubes, presión, viento alrededor de su ubicación.

Las previsiones meteorológicas se pueden buscar por ciudad o por coordenadas. Los pronósticos de tres horas están disponibles por hasta 5 días, mientras que los pronósticos diarios están disponibles por hasta 16 días.

Mapas del tiempo

Nos permite ver el tiempo actual  en áreas del planeta que deseemos

...

Clima actual

Podemos observar la temperatura actual y las condiciones meteorológicas en su ciudad o cualquier otra ubicación en el mapa global interactivo.

...

Capas meteorológicas

Hay una variedad de mapas están disponibles incluyendo precipitación, nubes, presión, temperatura, viento, y muchos más.

...

Mapa de satélite diario

Proporciona en tiempo real el  mapa diario global ,mientras que los datos del satélite están disponibles para darle la descripción entera de fenómenos del tiempo.

El servicio OpenWeatherMap ofrece un montón de mapas meteorológicos incluyendo precipitaciones, nubes, presión, temperatura, viento y muchos otros. Los mapas se pueden conectar a aplicaciones móviles y sitios web. Los mapas meteorológicos se pueden conectar como capas a la amplia gama de mapas, incluyendo azulejos Directos, WMS ,OpenLayers , folletos , mapas de Google y mapas de Yandex .

Gestión de campañas basadas en el clima de Google con OpenWeatherMap API

También permite ejecutar campañas publicitarias con API de tiempo OpenWeatherMap a través de Google AdWords.

APIs meteorológicas para desarrolladores

Hay un montón de entrenamiento con las API de tiempo en PHP, Java, Python, Go y muchos otros en la página de Partners junto con más de 1500 repositorios en GitHub

OpenWeatherMap proporciona una API con terminales JSON , XML y HTML y un nivel limitado de uso libre. Realizar más de 60 llamadas por minuto requiere una suscripción pagada a partir de USD 40 por mes. El acceso a datos históricos requiere una suscripción a partir de 150 USD al mes.  Los usuarios pueden solicitar información meteorológica actual, pronósticos extendidos y mapas gráficos (que muestran la cobertura de nubes, la velocidad del viento, la presión y la precipitación).

Las APIs como vamos a ver en el ejemplo , son sencillas y rápidas permitiendo el acceso al tiempo actual, a pronósticos, mapas y datos históricos en formatos JSON, XML y HTML. Además  una variedad de capas del mapa está disponible incluyendo precipitación, nubes, presión, temperatura, viento, y muchos más.

Conectar  una estación meteorológica a OpenWeatherMap

Cuenta  con una  red de estaciones meteorológicas privadas (más de 40.000 estaciones meteorológicas en todo el mundo)  peor también puede conectar su estación meteorológica a OpenWeatherMap y obtener una interfaz conveniente para recopilar y supervisar los datos de su estación meteorológica. También puede integrar los datos de su estación meteorológica en su página principal

Ejemplo

 

Como ejemplo vamos  a ver  como usar el servicio gratuito OpenWeatherMap para recuperar las condiciones meteorológicas de una ubicación.

Antes de poder utilizar el servicio, debe configurar una cuenta y solicitar una clave de API para su API Condiciones actuales.

Apunte su navegador a OpenWeatherMap y configure una cuenta.

 

weather.PNG

 

La  url  de acceso es  la siguiente  https://openweathermap.org

El sistema de geocodificación OpenWeatherMap permite a los usuarios seleccionar ciudades por nombre, país, código postal o coordenadas geográficas. Es posible buscar por parte del nombre de la ciudad. Para que el resultado de la búsqueda sea más preciso, el nombre de la ciudad y el país se deben dividir por comas

La url  anterior  admite el parametro city  para  que nos de el tiempo actual y la previsión de 13 días de tras directamente desde la url , por ejemplo para Almeria  es 2521886   y esta es la url completa :https://openweathermap.org/city/2521886

Para registrarnos nos  iremos  a https://home.openweathermap.org/users/sign_up

 

signin

 

Ingresaremos   un login ( normalmente el nombre de usuario ), un email así como  la clave inicial , y con esto ya nos daría acceso a la herramienta

 

 

Una vez que tenga un inicio de sesión válido, vaya a la página API del servicio y suscríbase al servicio de datos Tiempo actual y, a continuación, genere una clave de API.

 

Obviamente  anote la clave de la API  pues lo necesitara  para usarla en su aplicación ( por ejemplo si usa node.js e  Ionic en el código TypeScript de la aplicación)

Soporte multilenguaje en Android Studio


Android se ejecutará en muchos dispositivos en muchas regiones. Para llegar a la mayoría de los usuarios, su aplicación debe manejar texto, archivos de audio, números, moneda y gráficos de manera apropiada a los locales donde se utilizará su aplicación.

 

En realidad al escribir una app ya se debe tener un conocimiento práctico de Java y estar familiarizado con la carga de recursos de Android, la declaración de elementos de la interfaz de usuario en XML, consideraciones de desarrollo como el ciclo de vida de la actividad y los principios generales de internacionalización y localización.

Es una buena práctica usar el marco de recursos de Android para separar los aspectos localizados de su aplicación tanto como sea posible de la funcionalidad básica de Java:

  • Puede poner la mayor parte o la totalidad del contenido de la interfaz de usuario de su aplicación en archivos de recursos, tal como se describe en este documento y en Proporcionar recursos .
  • El comportamiento de la interfaz de usuario, por otra parte, es impulsado por su código Java. Por ejemplo, si los usuarios introducen datos que deben formatearse o clasificarse de forma diferente dependiendo de la configuración regional, utilizarían Java para manejar los datos mediante programación. Este documento no cubre cómo localizar su código Java

Siempre es una buena práctica extraer strings de IU del código de tu app y conservarlas en un archivo externo. Android facilita esta tarea con un directorio de recursos en cada proyecto del sistema operativo.

Si creo su proyecto con herramientas del Android SDK (lea Cómo crear un proyecto en Android), las herramientas crean un directorio res/ en el nivel superior del proyecto. El directorio res/ contiene subdirectorios para varios tipos de recursos. También hay algunos archivos predeterminados, como res/values/strings.xml, que contiene los valores de tu string.

Agregar los valores de string para cada configuración regional en el archivo correspondiente.

En tiempo de ejecución, el sistema Android usa un conjunto correspondiente de recursos de string basado en la configuración regional actual del dispositivo del usuario.

Por ejemplo, a continuación se indican algunos archivos diferentes de recursos de strings para distintos idiomas.

Inglés (configuración regional predeterminada), /values/strings.xml:

<?xml version="1.0" encoding="utf-8"?>

    <string name="title">My Application
    <string name="hello_world">Hello World!

Español, /values-es/strings.xml:

<?xml version="1.0" encoding="utf-8"?>

    <string name="title">Mi Aplicación
    <string name="hello_world">Hola Mundo!

Nota: Puede usar un calificador de configuración regional (o cualquier calificador de configuración) en cualquier tipo de recurso, como lo harías si deseas proporcionar versiones localizadas del elemento de diseño de tu mapa de bits. Para más información, consulta Localización.

Usar los recursos de string

Puede hacer referencia a sus recursos de string en el código fuente y en otros archivos XML usando el nombre del recurso definido por el atributo namedel elemento .

En su código fuente, puede hacer referencia a un recurso de string con la sintaxis R.string.. Existen diferentes métodos disponibles que aceptan un recurso de string de esta manera.

Por ejemplo:

// Get a string resource from your app's Resources String hello = getResources().getString(R.string.hello_world); // Or supply a string resource to a method that requires a string TextView textView = new TextView(this); textView.setText(R.string.hello_world);

En otros archivos XML, puedes hacer referencia a un recurso de string con la sintaxis @string/ siempre que el atributo XML acepte un valor de string.

Por ejemplo:

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/hello_world" />
Paso 1:

Crear un nuevo proyecto Hello World.

Paso 2:
Abrir el archivo main_activity.xml y personalice el texto como desee.

Utilice la pestaña Diseño y cree una nueva traducción haciendo clic en el botón globo.

Paso 3:

Ahora Android Studio genera un nuevo archivo xml en esta ruta de acceso: res / values / strings.

Resultados.

Por qué los recursos predeterminados son importantes

Siempre que la aplicación se ejecute en una configuración regional para la que no haya proporcionado texto específico de la configuración regional, Android cargará las cadenas res/values/strings.xml de res/values/strings.xml . Si este archivo predeterminado está ausente o si falta una cadena que su aplicación necesita, su aplicación no se ejecutará y mostrará un error. El ejemplo siguiente ilustra lo que puede suceder cuando el archivo de texto predeterminado está incompleto.

Ejemplo:

El código Java de una aplicación se refiere a sólo dos cadenas, text_a y text_b . Esta aplicación incluye un archivo de recursos localizados ( res/values-en/strings.xml ) que define text_a y text_b en inglés. Esta aplicación también incluye un archivo de recursos predeterminado ( res/values/strings.xml ) que incluye una definición para text_a , pero no para text_b :

Cuando esta aplicación se inicia en un dispositivo con la configuración regional en inglés, la aplicación puede ejecutarse sin ningún problema, porque res/values-en/strings.xml contiene ambas cadenas de texto res/values-en/strings.xml .
Sin embargo, el usuario verá un mensaje de error y un botón de cierre de la fuerza cuando esta aplicación se inicia en un dispositivo establecido en un idioma que no sea el inglés. La aplicación no se cargará.
Para evitar esta situación, asegúrese de que existe un archivo res/values/strings.xml y que define cada cadena res/values/strings.xml . La situación se aplica a todos los tipos de recursos, no sólo a las cadenas: Debe crear un conjunto de archivos de recursos predeterminados que contengan todos los recursos que su aplicación requiere: diseños, dibujos, animaciones, etc. Recursos .

 

 

Android de Como ENCUENTRA el recurso de coincidencia Óptima

Cuando  solicita  un recurso para el cual sea proporciona Alternativas, Android selecciona qué recurso alternativo ,como utilizar en Tiempo de ejecucion, según la configuración del dispositivo real. Para demostrar como Android selecciona un recurso alternativo, suponga que cadauino de los siguientes elementos de diseño contienen versiones diferentes de las mismas imágenes:

dibujable /
dibujable-es /
dibujable-fr-RCA /
dibujable-en-puerto /
dibujable-en-NoTouch-12key /
dibujable-puerto-LDPI /
dibujable-puerto-NoTouch-12key /

Y suponga que la configuracion del dispositivo es la siguiente:

Configuracion regional = en-GB
Orientación de la Pantalla = port
densidad de píxeles de la Pantalla = hdpi
tipo de pantalla táctil = notouch
director Método de entrada de texto =12key

Al comparar la configuracion del Dispositivo con los Recursos Alternativos Disponibles, Android Selecciona Elementos de Diseño de drawable-en-port.

Para Decidir Qué Recursos Como utilizar, El Sistema se basa en la siguiente lógica:

Figura 2: Diagrama de Flujo de la forma en la cual sea ENCUENTRA Android el recurso de coincidencia Óptima.

  1. Eliminar os Archivos de recursos que se contradicen con la configuración del Dispositivo.El Directorio drawable-fr-rCA/se elimina porque se contradice con la configuración regional en-GB.
    dibujable /
    dibujable-es /
    dibujable-fr-RCA /
    dibujable-en-puerto /
    dibujable-en-NoTouch-12key /
    dibujable-puerto-LDPI /
    dibujable-puerto-NoTouch-12key /
    

    Excepción: La densidad de píxeles de la Pantalla es el unico calificador Que No se Elimina DEBIDO A una contradicción. AUNQUE la densidad de la Pantalla del Dispositivo es IPAP, drawable-port-ldpi/no se Elimina Porque TODAS LAS densidades de Pantalla se consideran Como una coincidencia En Este punto.

  2. Elegir el (Próximo) calificador de alcalde precedencia de la Lista ( tabla 2 ). (Comenzar con MCC y continuar en forma descendente).
  3. ¿Alguno de los Directorios de recursos INCLUYE Este calificador?
    • La Respuesta Si es que no, volver al paso 2 y examinar · el siguiente calificador. (In the example, La Respuesta es «no» Hasta Que se Alcanza el calificador de idioma).
    • Si La Respuesta es sí, continuar con el paso 4.
  4. ELIMINAR los Directorios de recursos Que No INCLUYEN Este calificador. En the example, El Sistema Elimina Todos Los Que No Directorios INCLUYEN UN calificador de idioma:
dibujable /
dibujable-es /
dibujable-en-puerto /
dibujable-en-NoTouch-12key /
dibujable-puerto-LDPI / 
dibujable-puerto-NoTouch-12key /

Excepción: Si el calificador en cuestión f es la densidad de píxeles de la Pantalla, Android slecciona la opción que más coincida con la densidad de la Pantalla del Dispositivo. En general, Aandroid reduce  su preferecica a  una imagen original, en la directiva más grande antes que ampliar una imagen mas pequeña que las originales.

  1. Volver y repetir los Pasos 2, 3 y 4 Hasta Que Quede solitario Directorio de la ONU. En el ejemplo, la Orientación de la Pantalla Es El Próximo calificador para el cual sea existen coincidencias. Por lo del tanto, se eliminan los Recursos Que No se especifican Una Orientación de Pantalla:
    dibujable-es /
    dibujable-en-puerto /
    dibujable-en-NoTouch-12key /
    

    El Directorio Que Queda es drawable-en-port.

Si bien este procedimiento se ejecuta párrafo cada recurso: solicitado, el  Sistema Optimiza algunos adj: Aún más: aspectos. Un example of this Optimización Es Que Una Vez Que se conoce la configuration del Dispositivo, El Sistema podria ELIMINAR los Recursos Alternativos Que Nunca coinciden. EJEMPLO Por, si el idioma de configuration es inglés ( «en»), los Directorios de recursos Que Tienen ONU calificador de idioma establecido en Otro idioma ¿Que hay mar ingles Nunca de INCLUYEN en el conjunto de recursos comprobados (sin embargo, la ONU Directorio de Recursos pecado el calificador de idioma sí se includes).

Cuando Se seleccionan Recursos SEGÚN los calificadores del Tamaño de la Pantalla, El Sistema utilizará los Recursos Diseñados Para Una Pantalla Más Pequeña Que la Pantalla SI real sin EXISTEN Recursos Que coincidan mejor (por Ejemplo, Una Pantalla de Tamaño Grande utilizará Recursos De Una Pantalla de Tamaño normal de Si es Necesario). Sin embargo, si Los Únicos Recursos Disponibles Presentan ONU Tamaño superiores al de la Pantalla real, El Sistema sin los Usara y tu application fallará si ningún Otro recurso que coincidiera con la configuration del Dispositivo (POR EJEMPLO, SI Todos Los Recursos de Diseño estan etiquetados con el calificador xlarge, Pero el Dispositivo es Una Pantalla de Tamaño normal).

Nota: La precedencia del calificador (en la tabla 2 ) es mas Importante Que la Cantidad de calificadores que coinciden exactamente con el Dispositivo. Por Ejemplo, en el paso 4 mencionado anteriormente, la última Opción de la Lista INCLUYE tres calificadores que coinciden exactamente con el Dispositivo (orientation, tipo de pantalla táctil y Método de entrada), MIENTRAS Que drawable-enTiene Un solitario PARÁMETRO Que coinciden (idioma). Sin embargo, el idioma Tiene alcalde precedencia Que ESTOS Otros calificadores, por lo del tanto, drawable-port-notouch-12keyse Elimina.

Como publicar su app en Amazon


Aunque la supremacía de los markets de Google  y Apple son mas que evidentes , el ecosistema de Amazon  va aumentando considerablemente  dia tras dia   conforme Amazon crece a  doble dígito  tanto en ventas como en numero de usuarios .

Precisamente  debido al aumento de penetración de sus fieles  usuarios compuestos por millones de  usuarios de Android, esto nos da una pista de que  su market también es una buena oportunidad pues los desarrolladores afirman incluso hacen mas dinero  con el market de MAzon ya que el 65% de los desarrolladores dicen que» los ingresos totales de Amazon son similares o mejores que otras plataformas» en parte gracias a que los clientes de Amazon están muy comprometidos y muchos desarrolladores han visto mayores ARPU versus plataformas competitivas.

Los desarrolladores en amazon pueden ganar  dinero  a través de varios modelo de negocio: descargas directas, publicidad en las propias aplicaciones y  las ventas in-apps .

El ultimo modelo  permite  vender productos de Amazon a través de las  propias aplicaciones obteniendo una comisión por venta realizada gracias al API de Amazon  así como el SDK que proporcionan .De esta forma pues  permiten monetizar las aplicaciones y juegos con API como, por ejemplo, los anuncios de compra en la aplicación de Amazon y los anuncios para móviles. .

En cuanto las aplicaciones  desarrolladas para Android que incluso pueden estar publicadas en Google Play, la mayoría de estas  también  funcionaran  en la Appstore de Amazon sin necesidad de desarrollo adicional.  lo cual permitirá  alcanzar millones de  clientes en todo el mundo pues  la Appstore de Amazon está disponible en 236 países y territorios, ofreciéndole una base de clientes global al instante.

 

En este post  veremos  las instrucciones en pantalla para crear una cuenta  de desarrollador de Amazon , probar si nuestra app es compatible con el market de amazon , documentar los detalles , especificar los royalties  y por supuesto finalmente  enviar su aplicación para hacerla disponible a la enorme base de clientes de Amazon.

Como se puede ver son muchos pasos , así que vayamos por partes:

 

Primera subida  y test de la aplicación

Para solicitar la inclusión de una  aplicación en  el catálogo de la tienda Apps  en primer lugar  deberá tener  el apk de su aplicación     y acceder a Amazon Appstore Mobile App Distribution Portal

apk.png

En esta pantalla arrastramos el fichero apk en la esquina derecha  donde probaremos  la compatibilidad de su aplicación en Fire y dispositivos Android  (simplemente arrastre y coloque su APK en el  servicio de pruebas de AWS  para obtener resultados en 90 segundos o menos).

 

compatibilidad

 

Si el resultado ha sido satisfactorio , podemos  subir  nuestra aplicación  a la plataforma de Amazon , por lo que   ahora nos pedirá   que nos validemos con nuestra cuenta de amazon para avanzar en el registro de la aplicación( puede ser la cuenta de amazon que usamos habitualmente para comprar=.

 

signn.png

 

Registro como desarrollador e impuestos

Una vez subida la aplicación  y comprobada la compatibilidad del apk  lo siguiente es registrase como  desarrollador de Amazon.

En la   pagina tendrá  que cumplimentar   todos los campos , donde ademas de los datos personales  nos solicitaran una breve descripción de no mas 2000 caracteres sobre el desarrollador , así como si ha tenido en cuenta alguna dirección de correo electrónico  para atender  a los usuarios.

 

resgistro.png

 

Por ciento ,tenga  mucho cuidado en este apartado ,pues lo que se cumplimente aquí, una vez grabado, ya  no se podrá modificar así que es muy importante  que  piense muy bien lo que va  a cumplimentar en los apartados Developer description   y en los servicios que vaya a ofrecer a los potenciales clientes.

Una vez pulsado el botón Save and Continue, lo siguiente es aceptar las condiciones de Amazon :

 

 

registtrox.png

Una vez aceptadas la condiciones,lo siguiente es ingresar los datos bancarios

 

 

pagos

Ya para terminar nos toca ajustar el tema de los impuestos aplicados a nuestras posibles ganancias:

 

royaltie.png

 

Ahora es el momento de cumplimentar el impreso  IRS W-9, W-8 para determinar si sus pagos están sujetos al formulario 1099-MISC o 1042-S del IRS.

Para cumplir con los requisitos del IRS lo más eficientemente posible, se deben contestar todas las preguntas e ingresar toda la información solicitada lo cual para todos los que hablamos español se nos hace bastante lioso

Tenga cuidado para evitar errores ortográficos o para ingresar números de identificación de impuestos incorrectos, lo que puede resultar en un formulario de impuestos invalidado.

Lógicamente se  tiene la obligación de notificar a Amazon de cualquier cambio en su información de identidad fiscal reanudando la entrevista de información tributaria si el cambio podría invalidar su W-9, W-8.

El cambio de circunstancias incluye:

  • Cambio de su nombre legal (por ejemplo, debido al matrimonio o la incorporación)
  • Cambio de dirección de un país a otro
  • Cambio de su número de identificación fiscal (TIN) de su negocio de su número de seguro social (SSN) a un número de identificación del empleador (EIN)
  • Para propósitos de impuestos en los Estados Unidos, es muy importante mencione si es Ud. una persona estadounidense
  • Para propósitos de impuestos federales de los Estados Unidos, se le considera una persona de los Estados Unidos si usted es:Un individuo que es un ciudadano de los Estados Unidos o un extranjero residente de los Estados Unidos,Una asociación, corporación, compañía o asociación creada u organizada en los Estados Unidos o bajo las leyes de los Estados Unidos,Una finca (que no sea una finca extranjera), o
    Un fideicomiso de los Estados Unidos.
  • Para propósitos de impuestos federales de los Estados Unidos, se le considera una persona no estadounidense (extranjera) si usted es:un individuo extranjero no residente,una corporación extranjera,una sociedad extranjera,un fideicomiso extranjero,una propiedad extranjera, cualquier otra persona que no sea una persona de los Estados Unidos.

Bien pongámonos mano a la obra para cumplimentarlo primero marcando si somos o no de U .S.:

 

 

paso1.png

 

Una vez aceptado este paso , lo siguiente es cumplimentar el grueso de formulario empezando por nuestro nombre y dirección postal:

 

 

Asimismo marcaremos si actuamos como intermediarios así como si somos algo que tenga que ver con una empresa:

 

tax6.png

 

tin

 

Al aceptar pulsando «save and continue»   nos da un resumen del documento:

 

 

final

Podemos solicitarlo por papel ,pero lo mejor es hacerlo via electronica pulsando en «Go paperles,I want to receive my Form 1042-S electrinicaly»    así como mas abajo donde pone «I consent to provide my electronic signature» , y  después  marcar  todos  los apartados siguientes:

 

electronic.png

A destacar  que debemos seleccionar  a todos los no residentes en EEUU  en  el apartado «Electronic Signature»  , en la parte que menciona que bajo pena de perjurio, declaramos que hemos examinado la información en este formulario y que,  saber y entender, es verdadera, correcta y completa. Además certificamos bajo pena de perjurio que:

  • Yo soy el individuo que es el beneficiario efectivo (o estoy autorizado a firmar para el individuo que es el beneficiario efectivo) de todos los ingresos a los cuales este formulario se relaciona o estoy usando este formulario para documentarme como un individuo que es propietario o cuenta Titular de una institución financiera extranjera
  • La persona nombrada en la línea 1 de este formulario no es una persona de los Estados Unidos
  • Los ingresos a los que se refiere este formulario son: (a) no relacionados efectivamente con la conducta de un comercio o negocio en los Estados Unidos, (b) están conectados pero no están sujetos al impuesto bajo un tratado de impuesto sobre la renta aplicable, o (c) La participación del socio en los ingresos efectivamente conectados de una asociación
  • La persona nombrada en la línea 1 de este formulario es residente del país tratado incluido en la línea 9 del formulario (si lo hubiere) en el sentido del tratado sobre el impuesto sobre la renta entre los Estados Unidos y ese país
  • Para las transacciones de intermediarios o intercambios de trueque, el beneficiario efectivo es una persona extranjera exenta tal como se define en las instrucciones, y
    Acepto que enviaré un nuevo formulario dentro de 30 días si alguna certificación hecha en este formulario se vuelve incorrecta.

Una vez aceptada esta parte , nos aparecerá que hemos llegado al 100% del proceso de cumplimento   y se nos mostrara el impreso de forma electrónica:

 

finalxxxx.png

Algo muy interesante es imprimirlo directamente  desde esta aplicación para guardarlos   y ya por fin habremos concluido  la primera parte del proceso

 

Bueno  ya hemos resuelto el tema legal  y  ya tenemos cuenta de  desarrollador de  Amazon , asi que   una vez que tengamos el apk   y hayamos pasado los pasos anteriores  ya estamos listos para  desplegar nuestra app y seguir los siguientes pasos que explicaremos en un segundo post.

Mientras tanto sospese si le interesa el programa Amazon Underground que pasamos a comentar en las siguientes lineas:

 

 

Amazon Underground

Una posibilidad para los desarrolladores es también incluir  nuestra app  en amazon undergroud,pero se  requiere cumplir con los siguientes requisitos generales para el programa:

  • Es necesario que la aplicación móvil esté disponible para descargar desde la tienda de Google Play o en la App Store de Apple y que esté monetizada en al menos una de las siguientes maneras:
    • La aplicación está disponible para su compra por una tarifa en todas las tiendas de otras aplicaciones donde se vende.
    • La aplicación contiene elementos en la aplicación que están disponibles para su compra por una tarifa.
  • la aplicación para dispositivos móviles no debe contener ningún elemento de suscripción en la propia aplicación.
  • Las características y la jugabilidad de la versión de Amazon Underground de su aplicación debe ser sustancialmente similar o mejor que la versión no subterránea.
  • Cuando envíe su aplicación a Amazon Appstore, debe hacer que su aplicación esté disponible para su distribución en al menos un dispositivo móvil que no sea de Amazon.

Pasos mínimos requeridos para la presentación de la aplicación

Amazon recomienda  los siguientes pasos para garantizar un proceso de envío fluido al programa Amazon Underground para su aplicación. Ten en cuenta que para Amazon Underground, necesitarás crear y mantener una nueva versión de tu aplicación. Esta nueva aplicación requiere un nombre de paquete único y se debe enviar por separado a la Appstore de Amazon desde cualquier versión existente de la aplicación.

  1. Revise los requisitos de elegibilidad en esta página y en el Programa de Amazon Underground antes de realizar cualquier cambio en su aplicación para verificar que su aplicación cumple con los requisitos del programa.
  2. Reconstruya su aplicación con los cambios de código que haya realizado para Amazon Underground y asigne un nombre de paquete nuevo y único a su aplicación. Por ejemplo, si el nombre original del paquete de su aplicación era «com.company.example», llame a la versión Amazon Underground del paquete «com.company.example.underground». Este nombre de paquete debe ser único en todas las plataformas en las que esté disponible la aplicación.
  3. Aplique la marca a su icono de lanzamiento como se describe en la página Migrar su aplicación a Amazon Underground superponiendo el archivo PNG proporcionado por Amazon para aplicar el marco de Amazon Underground al icono de lanzador.
  4. En el Portal de desarrolladores de aplicaciones y juegos de Amazon, comienza el nuevo proceso de envío de aplicaciones para tu aplicación con su nuevo y único nombre de paquete de Android.
    1. Como una nueva aplicación, crea un nuevo paquete de envío para la versión de Amazon Underground de tu aplicación.
    2. En el campo Descripción breve de la aplicación , describe el nuevo valor que ofrece la versión de Amazon Underground de tu aplicación en la versión no subterránea. Llame a cualquier característica que solía ser pagada que ahora están libres.
    3. Si procede, vuelva a crear sus artículos de compra en la aplicación (IAP) como parte de la presentación de su nueva aplicación, manteniendo intactos los precios originales. Incorporar los nuevos SKUs para estos elementos IAP en su aplicación. (Los precios de estos artículos se establecen automáticamente en cero para los usuarios de la versión de Amazon Underground de tu aplicación).
    4. Si su aplicación utiliza cualquiera de las API de Amazon descritas en la siguiente sección, cree una clave de API nueva y separada y actualice la versión de Amazon Underground de su aplicación para usar la nueva clave. (Consulte Migración de su aplicación a Amazon Underground .)
    5. Para abordar los cambios de seguridad en Android OS 5.0 (Lollipop), si su aplicación declara un permiso personalizado, consulte https://forums.developer.amazon.com/articles/2706/android-security-changes-requires-uniquely-defined.html .
    6. Verifique que su aplicación cumpla con los requisitos de elegibilidad detallados en el horario de Amazon Underground .
  5. En las opciones Disponibilidad y Precios , seleccione para Amazon Underground.
  6. En Imágenes , cargue sus activos.
  7. Envíe su aplicación a Amazon Appstore. Su aplicación será revisada antes de ser aceptada en el programa. Si no acepta su aplicación, iterar el paquete de presentación de la aplicación con los cambios necesarios y volver a enviarlos.

Directrices de diseño de aplicaciones

Las siguientes prácticas recomendadas son recomendaciones fuertes de Amazon para el programa Amazon Underground. Si su aplicación se aparta de estas directrices, es posible que su aplicación se rechace o se elimine del programa Amazon Underground. Para obtener más detalles sobre estas recomendaciones, consulte Requisitos de diseño y modificación de aplicaciones y directrices para Amazon Underground .

Asegúrese de que su aplicación de Amazon Underground se adhiera a las siguientes directrices:

  • Títulos Premium : si tu aplicación es un título premium donde los usuarios normalmente pagan por la aplicación en otras plataformas, resalta el valor añadido de tu aplicación en la versión de Amazon Underground. Si la única diferencia entre una versión premium de su aplicación y una gratuita es la eliminación de anuncios en la versión premium, asegúrese de proporcionar características o beneficios adicionales en la versión de Amazon Underground de su aplicación. Las aplicaciones Premium en las que la falta de anuncios en la versión Amazon Underground es la única característica premium no se considerará para el programa.
  • Metadatos de la aplicación: en el paquete de envío a Amazon Appstore, la versión de Amazon Underground de tu aplicación debe conservar la identidad y la marca de la versión no subterránea. Sin embargo, Amazon le anima a utilizar activos y medios actualizados para la versión de Amazon Underground, como capturas de pantalla y descripción de la aplicación, para ayudar a comunicar la propuesta de valor de la versión de Amazon Underground a sus usuarios. Por ejemplo, agregando tachas a los gráficos para los elementos IAP. La descripción de la aplicación no debe incluir referencias a contenido pagado. No copie y pegue la descripción de la aplicación en la versión no subterránea de su aplicación si hace referencia a contenido pagado.
  • Compras en la aplicación (IAP) : la versión de Amazon Underground de su aplicación puede incluir IAP gratuito o ilimitado, siempre y cuando su implementación cumpla con las siguientes pautas:
    • Disponibilidad de elementos de IAP : Todos los elementos de IAP en la versión no subterránea de su aplicación (o elementos equivalentes) deben permanecer en la versión de Amazon Underground de su aplicación para que el cliente tenga la opción de seleccionar de forma gratuita. Esto permite a los clientes ver beneficios inmediatos y entender el valor de «todo gratis».
    • Desbloqueo de funciones o actualizaciones : para las aplicaciones que utilizan elementos IAP para desbloquear funciones o actualizaciones, asegúrese de que estas características y actualizaciones permanezcan en la aplicación . Un usuario no debe buscar un elemento IAP popular de la versión no subterránea de su aplicación y encontrar que este elemento falta en la versión de Amazon Underground.
  • Anuncios en la aplicación: no puede obligar a los usuarios a ver un anuncio para desbloquear una función o un elemento IAP.
  • Compartición social : no vincule el avance dentro de su aplicación al compartir social. No es posible que su aplicación requiera que un usuario comparta o publique en un sitio de medios sociales para desbloquear una característica o elemento IAP.
  • Progreso del Juego : No implemente lapsos de tiempo o «tiempo de reutilización» para que los clientes de Amazon Underground restrinjan su progreso. Por ejemplo, no requieren que los clientes esperen un cierto número de horas antes de que puedan desbloquear un nuevo nivel.
  • Títulos de Freemium con opción a pagar por la versión libre de anuncios : si su título de freemium incluye un elemento para eliminar anuncios como el único elemento de IAP de la aplicación, su aplicación no se considerará para el programa. Proporcione beneficios adicionales al cliente dentro de la aplicación, como niveles adicionales o moneda dentro de la aplicación.
  • Aplicaciones en segundo plano : no recibirás regalías por el tiempo que la aplicación pase corriendo en segundo plano. Si su aplicación se ejecuta principalmente en segundo plano, es probable que no se considere para Amazon Underground.

Error en whatsapp en la descarga de videos


Hay personas que de repente  cuando reciben fotos o videos por whatsapp, al intentar verlos o reproducirlos aparece un molesto  mensaje

 Error de descarga:. No se ha podido completar la descarga. Vuelva a intentarlo más tarde.

Y por cierto, por mucho que lo intentemos o esperemos no cambia la situación..

En  casos aislados,  cuando se intenta  adjuntar algo anexo  incluso avisa «ok» pero obviamente no envía nada . No obstante el problema es mayor   aun cuando nos envían un archivo, pues pulsamos en descargar y vuelve a saltar el  mensaje «Error en la Descarga: No se ha podido completar la descarga, inténtelo mas tarde. « ¿como podemos solucionar este grave problema?

Falta la carpeta media o se crea un fichero llamado media

Un primer posible origen del problema del fallo de la descarga puede el siguiente: la carpeta «Media» de whatsapp  por alguna razón se renombra o desapaprece ,razón por la cual  la aplicacion  no sabe qué hacer con los archivos (video, audio, imágenes) y da este extraño error

 

 

sinformaterar.png

En  caso de que sospechemos que esa podría ser la causa podemos  hacer lo siguiente.

1- Conectar el terminal al pc de modo que podemos  editar la tarjeta de memoria
2- Ir a la tarjeta de memoria. Alli habrá muchas carpetas  ,pero las que nos interesa es la carpeta  whatsapp que a su vez debe contener  cuatros carpetas :

  • .trash
  • Backups
  • Database
  • Media

whats1.png

Si falta la carpeta Media o tenemos un archivo llamado media sin extensión es un síntoma inequívoco de mal funcionamiento .

3- Elimine el archivo media  de manera que nos queden al menos las tres primeras carpetas solamente.
4- Cree una nueva carpeta llamada  Media
5- Entre en la carpeta Media (que acaban de crear) para ver que esté vacía. Por defecto luego la propia aplicación creará otras 8 subcarpetas  como en la imagen siguiente:

 

media
6- Ahora hay dos opciones:
a) Reiniciar  el terminal . (desconéctelo de manera segura )

b) Volver a conectarlo al pc,para poder editar la tarjeta de memoria .Entre en  la carpeta WhatsAppMedia y fíjense si ya se crearon las nuevas carpetas, si esto no sucedió entonces cree  manualmente al  menos  las cuatro carpetas :

  •  Wallpaper
  •  WhatsApp Audio
  •  WhatsApp images
  •  WhatsApp Video

Una vez hecho ,por favor reinicie su terminal y compruebe que ya se puede  descargar ok

Tarjeta SD fragmentada o con errores

Un segundo  posible origen del problema puede prevenir por un fallo en la tarjeta microsd  por excesiva fragmentación ,razón  por la cual  la aplicación  no sabe qué hacer generalmente con ficheros grandes como archivos de  video  o audio ( no con las  imágenes) y da este extraño error

Para intentar solucionarlo copiaremos el contenido de la carpeta whatasapp a nuestro ordenador   y obviamente todo lo que nos interese  e intentaremos hacerle un formateo a la sd

Un claro síntoma de que la tarjeta esta mal es que no permite formatearlo con las hermanamientos estándar del sistema operativo.

.
sinformaterar.png

 

Una herramienta  que nos permite formatear incluso con estos problema es hdd low level format tool  ,pero tenemos que tener extrema atencion en la unidad que deseamos formatear:

 

hdd.PNG

 

Un vez seleccionada la unidad , pulsar en la pestaña  «low level format» y el botón «format thos device»

hdd2

Tras un rato ( unos 8minutos para uan kingston de 8gb)  deberia finalizar el proceso

hddfin.PNG

Un vez hayamos formateado la sd, podemos volver a copiar el contenido de la carpeta whtasapp  y desinstalar y volver a instalar la aplicación whatsapp para que al iniciarse pregunte si desea  recuperar  el contenido de la sd  ..

Debería ahora volver a  funcionar las descargas …( o si no es así cambie la sd por otra nueva e intente volver a probar)

 

 

Programar en Android no es tan complicado (parte 2)


En un post  anterior veíamos que  el panorama del entorno necesario para programar un aplicación   que se ejecute sobre cualquier dispositivo Android  ha cambiado sustancialmente  reduciéndose  simplemente a una potente herramienta   gratuita  , que ademas proporciona Google: Android Studio.

En este  post seguiremos  profundizando en el desarrollo de aplicaciones con Android Studio deteniéndonos en uno de los aspectos mas llamativos de cualquier aplicación : la  interfaz gráfica de usuario

Android proporciona un vocabulario de XML que corresponde a las subclases de View y ViewGroup, de modo que puede definir su IU en XML usando una jerarquía de elementos de IU y  los diseños son subclases de ViewGroup

Generalmente, los objetos View son widgets de IU como botones o campos de texto y los objetos ViewGroup son contenedores de vistas invisibles que definen la disposición de las vistas secundarias, como en una cuadrícula o en una lista vertical.

 

 

 

 

Diseño interfaz

Aunque existen infinitas  posibilidades de diseño del interfaz ,para empezar,  usaremos un diseño sencillo lineal que coloca todos los elementos gráficos uno a continuación del otro:

  • En la ventana Project de Android Studio, abra el fichero activity_main.xml( app > res > layout > activity_main.xml).Este archivo XML define el diseño de tu actividad y contiene la vista de texto predeterminada “Hello World”.
  • Cuando abra un archivo de diseño, lo primero que ve es el editor de diseño, pero muchos programadores prefieren trabajar directamente con el XML; por lo tanto, haga clic en la pestaña Text en la parte de abajo de la ventana para pasar al editor de texto.
  • Borre todo el contenido del fichero  e introduzca  el siguiente XML:
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal">
    </LinearLayout>

LinearLayout es un grupo de vistas (una subclase de ViewGroup) que dispone las vistas secundarias en sentido vertical u horizontal, según lo especificado por el atributo android:orientation. Cada elemento secundario de un LinearLayout aparece en la pantalla en el orden en que aparece en XML.

Se necesitan otros dos atributos, android:layout_width y android:layout_height, para especificar el tamaño de todas las vistas.

Debido a que LinearLayout es la vista de raíz en el diseño, debería ocupar el área de la pantalla completa que está disponible para la app al establecer el ancho y el alto en "match_parent". Este valor declara que la vista debería expandir su ancho o alto para coincidir con el ancho o alto de la vista primaria.

Agregar un campo de texto

En el archivo activity_main.xml, dentro del elemento <LinearLayout>, agregue el siguiente elemento <EditText>:

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal">


   <EditText android:id="@+id/edit_message" 
    android:layout_weight="1"
    android:layout_width="0dp" 
    android:layout_height="wrap_content"
    android:hint="@string/edit_message" />


</LinearLayout>

A continuación, se ofrece una descripción de los atributos del <EditText> que ha agregado:

  • android:id:Esto proporciona un identificador único para la vista, que puede usar para hacer referencia al objeto desde elcódigo de la app, como leer y manipular el objeto .El signo de arroba (@) se requiere cuando se hace referencia a cualquier objeto de recursos de XML y va seguido por el tipo de recursos (id en este caso), una barra diagonal y el nombre del recurso ().El signo más (+) antes del tipo de recurso se necesita solo cuando se está definiendo un ID de recurso por primera vez. Cuando compila la app, las herramientas del SDK usan el nombre del ID para crear un nuevo ID de recurso en el archivo R.java de tu proyecto que hace referencia al elemento EditText. Con el ID de recurso declarado una vez de esta forma, otras referencias al identificador no necesitan el signo más. Es necesario el uso del signo más solo cuando se especifica un nuevo ID de recurso y no se necesita para los recursos concretos, como strings o diseños. Consulta el cuadro lateral para más información sobre los objetos del recurso.
  • android:layout_width y android:layout_height:En lugar de usar tamaños específicos para el ancho y el alto, el valor "wrap_content" especifica que la vista solo debe ser lo suficientemente grande para ajustarse al contenido de la vista. Si en cambio usa "match_parent", el elemento EditText ocupará la pantalla porque coincidirá con el tamaño del elemento primario LinearLayout. Para más información, consulta la guía de Diseños.Fijar el ancho en cero (0 dp) hace que la casilla de entrada ocupe el ancho de pantalla y mejora el rendimiento del diseño, ya que el uso de "wrap_content" como ancho exige que el sistema calcule un ancho, lo cual a la larga es irrelevante porque el valor de peso requiere otro cálculo de ancho para completar el espacio restante.
  • android:hint :Esta es una string predeterminada para mostrar cuando el campo de texto esté vacío. En lugar de usar una string codificada como valor, el valor "@string/edit_message" hace referencia a un recurso de string definido en un archivo separado. Debido a que esto hace referencia a un recurso concreto (no simplemente un identificador), no necesita el signo más. Sin embargo, debido a que aún no se ha  identificado el recurso de string, aparecera  un error del compilador. Este recurso de string tiene el mismo nombre que el ID del elemento: edit_message. Sin embargo, las referencias a los recursos siempre tienen ámbitos por tipo de recurso (como id o string); por lo tanto, usar el mismo nombre no genera conflictos.

 

Agregar recursos

De manera predeterminada, en un proyecto de Android se incluye un archivo de recursos en string en  un  fichero  llamado    strings.xml ( res > values > strings.xml) .

Parar, agregar  strings nuevas al fichero strings.xml siga los siguientes pasos.

  1. Desde la ventana Project, abra res > values > strings.xml.
  2. Agregue dos strings de modo que el archivo se vea de esta forma:
    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <string name="app_name">My First App</string>
        <string name="edit_message">Introduzca un mensaje</string>
        <string name="button_send">Enviar</string>
    </resources>

Para el texto en la interfaz de usuario, siempre especifique cada string como un recurso. Los recursos de strings de texto  permiten administrar todos los textos de IU en una sola ubicación, lo que hace que sea mucho  más fácil encontrar y actualizar el texto.

Externalizar las strings también  permite localizar su aplicacion ara diferentes idiomas al proporcionar definiciones alternativas para cada recurso de string.

 

Agregar un botón

Vuelva al archivo activity_main.xml y agregue un botón después del widget <EditText>.

El archivo debería tener el siguiente aspecto:

      
  <Button
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:text="@string/button_send" />

Como vemos este botón no necesita el atributo android:id porque no se hará referencia a él desde el código de la actividad.

Actualmente, la configuración del diseño hace que los widgets EditText y Button tengan el tamaño necesario para ajustarse a su contenido, como se muestra a continuación

Esto funciona bien para el botón, pero no tan bien para el campo de texto porque el usuario podría escribir algo más largo. Sería bueno rellenar el ancho de la pantalla excedente con el campo de texto. Puedes hacerlo dentro de un LinearLayout con la propiedad de peso, que puedes especificar usando el atributo android:layout_weight.

El valor weight es un número que especifica la cantidad del espacio restante que cada vista debería consumir, relativo a la cantidad consumida por vistas del mismo nivel. Esto funciona como la cantidad de ingredientes en una receta de una bebida: «2 partes de refresco, 1 parte de sirope» significa que dos tercios de la bebida son de refresco. Por ejemplo, si le das a una vista un valor de weight de 2 y a otra un valor de weight de 1, la suma es 3, de manera que la primera vista completa 2/3 del espacio restante y la segunda vista completa el resto. Si agregas una tercera vista y le das un valor de weight de 1, la primera vista (con un peso de 2) ahora obtiene 1/2 del espacio restante, mientras que las dos restantes obtienen 1/4.

El valor de weight predeterminado para todas las vistas es 0, de manera que si especificas cualquier valor de weight superior a 0 para solo una vista, dicha vista completa el espacio restante después de que se asigne el espacio requerido a todas las vistas.

El resultado de modificar el  fichero   activity_main.xml, deberia ofrecer el siguiente aspecto:

 

Lo siguiente es qué apariencia debería tener el archivo de diseño activity_main.xml completo:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:tools="http://schemas.android.com/tools"
   android:orientation="horizontal"
   android:layout_width="match_parent"
   android:layout_height="match_parent">
    <EditText android:id="@+id/edit_message"
        android:layout_weight="1"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:hint="@string/edit_message" />
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/button_send" />
</LinearLayout>


Dar funcionalidad al  botón

Una vez hemos definido el botón  tenemos asignarle una funcionalidad, para lo cual podemos seguir los siguientes pasos:

  1. En el archivo res > layout > activity_main.xml, agrega el atributo android:onClick al elemento <Button>, como se muestra a continuación:
    <Button
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:text="@string/button_send"
          android:onClick="sendMessage" />
        

    Este atributo indica al sistema que llame al método sendMessage() de tu actividad cuando un usuario haga clic en el botón.

  2. En el archivo java > com.example.myfirstapp > MainActivity.java, agregar el código auxiliar del método sendMessage() como se muestra a continuación:
    public class MainActivity extends AppCompatActivity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
        }
    
        /** Called when the user clicks the Send button */
        public void sendMessage(View view) {
            // Do something in response to button
        }
    }

    Para que el sistema haga coincidir este método con el nombre del método proporcionado a android:onClick, la firma debe ser exactamente como se muestra. Específicamente, el método debe:

    • Ser público
    • Tener un valor de retorno vacío
    • Tener un objeto View como el único parámetro (esto será el View al que se le hizo clic)

Luego, completarás este método para leer el contenido del campo de texto y entregar dicho texto a otra actividad.

Crear una intent

Un Intent es un objeto que proporciona enlace de tiempo de ejecución entre componentes separados (como dos actividades) representando la “intención de hacer algo” de una app.

En el fichero MainActivity.java, agregue el código que aparece a continuación para sendMessage():

public class MainActivity extends AppCompatActivity {
    public final static String EXTRA_MESSAGE = "com.example.myfirstapp.MESSAGE";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    /** Called when the user clicks the Send button */
    public void sendMessage(View view) {
        Intent intent = new Intent(this, DisplayMessageActivity.class);
        EditText editText = (EditText) findViewById(R.id.edit_message);
        String message = editText.getText().toString();
        intent.putExtra(EXTRA_MESSAGE, message);
        startActivity(intent);
    }
}

Android Studio mostrará errores Cannot resolve symbol porque este código hace referencia a clases que no están importadas. Puede resolver algunos de estos errores con la funcionalidad de “importación de clase” de Android Studio presionando Alt + Intro (u Opción + Regresar en Mac).

Sus importados deben terminar de la siguiente forma:

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;

En sendMessage() tienen lugar muchísimos procesos. Por ello, explicaremos lo que sucede.

El constructor de Intent toma dos parámetros:

  • Un Context como su primer parámetro (se usa this porque la clase Activity es una subclase de Context)
  • La Class del componente de la app a la cual el sistema debe entregar la Intent (en este caso, la actividad que debería iniciarse).

    Nota: La referencia a DisplayMessageActivity emitirá un error en Android Studio porque la clase aún no existe. Ignora el error por ahora; pronto crearás la clase.

El método putExtra() agrega el valor de EditText a la intent. Una Intent puede llevar tipos de datos como pares clave-valor denominados extra. La clave es una EXTRA_MESSAGE constante pública porque la actividad siguiente usa la clave para devolver el valor de texto. Es bueno definir claves para los campos extra de intents usando el nombre del paquete de tu app como prefijo. Esto garantiza que las claves sean únicas, en caso de que tu app interactúe con otras apps.

El método startActivity() inicia una instancia del DisplayMessageActivity especificado por la Intent. Ahora debes crear la clase.

Crear la segunda actividad

  1. En la ventana Project, haz clic con el botón secundario en la carpeta app y selecciona New > Activity > Empty Activity.
  2. En la ventana Configure Activity, ingresa “DisplayMessageActivity” en Activity Name y haz clic en Finish

Android Studio automáticamente realiza tres acciones:

  • Crea el DisplayMessageActivity.java de la clase con una implementación del método onCreate() obligatorio.
  • Crea el archivo de diseño activity_display_message.xml correspondiente.
  • Agrega el elemento <activity> obligatorio en AndroidManifest.xml.

Si ejecutas la app y haces clic en el botón Send en la primera actividad, la segunda actividad se iniciará, pero estará vacía. Esto sucede porque la segunda actividad usa el diseño predeterminado vacío proporcionado por la plantilla.

Mostrar el mensaje

A continuación puede, modificar la segunda actividad para que muestre el mensaje que pasó la primera.

  1. En DisplayMessageActivity.java, agregue el siguiente código al método onCreate():
    @Override
    protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_display_message);
    
       Intent intent = getIntent();
       String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);
       TextView textView = new TextView(this);
       textView.setTextSize(40);
       textView.setText(message);
    
       ViewGroup layout = (ViewGroup) findViewById(R.id.activity_display_message);
       layout.addView(textView);
    }
  2. Presione Alt + Intro (u Opción + Regresar en Mac) para importar las clases faltantes. Los importados deben tener la siguiente terminación:
    import android.content.Intent;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.ViewGroup;
    import android.widget.TextView;

Tienen lugar muchísimos procesos. Veamos la explicación:

  1. La llamada getIntent() captura la intent que inició la actividad. Toda Activity se invoca a través de una Intent, independientemente de cómo el usuario navegue hasta el punto en cuestión. La llamada getStringExtra() muestra los datos de la primera actividad.
  2. De manera programática, se crea un elemento TextView y se establece el tamaño y mensaje de este.
  3. Se agrega el elemento TextView al diseño identificado por R.id.activity_display_message. Se transmite el diseño a ViewGroup porque es la superclase de todos los diseños y contiene el método addView().

Nota: Es posible que el diseño XML generado por versiones anteriores de Android Studio no incluya el atributo android:id. La llamada findViewById() fallará si el diseño no tiene el atributo android:id. En este caso, abra el fichero  activity_display_message.xml y agregue el atributoandroid:id="@+id/activity_display_message" al elemento de diseño.

Ejecucion de  la app

Para ver el aspecto que ahora tendrá su  app en tu dispositivo, haga clic en Run en la barra de herramientas .

Cuando se abra, escriba un mensaje en el campo de texto y haga clic en Send. La segunda actividad reemplaza a la primera en la pantalla, con lo cual se mostrara el mensaje que ingresoe en la primera actividad.

Eso es todo. ¡Ha creado una  nueva app de Android!

 

Mas información en  developer.android.com

Error:(23, 17) Failed to resolve: junit:junit:4.12 en Android Studio


Este problema como vamos a ver, no se resuelve desinstalando  y volviendo a instalar Android Studio

El error   completo  ocurre cuando intentamos probar cualquier proyecto  ( incluso vacío ) ,   apareciendo el mensaje  Error:216 Failed to resolve: junit:junit:4.12

 

error

 

A continuación citamos los pasos para solucionar el problema:

  • Cerrar Android Studio
  • Descargar  el paquete junixfixerfile.zip   que contendrá  la librería junit-4.12.jar ,por ejemplo a partir de este enlace contrastado http://www.mediafire.com/file/413j0qfiixb4tda/junitfixerfile.zip
  • Descomprimir  el fichero con el winrar , seleccionando  la ruta    de las librerías de la aplicación  ,por  ejemplo  en la ruta  C:\Users\xxxxxxxxx\AndroidStudioProjects\MyApplication\app\libs (donde  xxxxx es su usuario logado en windows)

androidstudio1

 

 

 

 

 

 

 

 

 

 

 

 

 

  • Ahora ya puede abrir Android Estudio, volver a cargar su proyecto e intentar ejecutar su proyecto pues no debería dar ningún error

 

En caso de que seguidos los pasos anteriores persista el error , debería eliminar la  inferencia a la librería  Junit antigua  y colocar en su lugar la nueva librería.

Esto se hace pulsando  en File–>Proyect Structure.

Aquí , nos iremos a nuestra app( Modules–>App) y seleccionaremos Dependencies

 

Deependencias

Aquí deberíamos posicionarnos sobre la libreria junit  y darle el botón – (Remove)

Acto seguido daremos a añadir con el botón + ( a la derecha), seleccionaremos Libraries Deependencies –>Files dependencies   y nos  iremos a la ruta donde la nueva almacenamos  la nueva librería ( C:\Users\xxxxxxxxx\AndroidStudioProjects\MyApplication\app\libs)

Finalmente le damos a «Compile»  y  ya debería poderse ejecutar sin problemas sin volver a dar el error

Gradle sync failed: CreateProcess failed, error=216 con Android Studio


Para todos aquellos que se inician en el desarrollo de aplicaciones  para Android, es importante tener claro que entorno de desarrollo es el mejor y más completo para empezar con la primera aplicación, pues ese primer proyecto quizás  un buen día, pueda convertirse en una app de uso masivo y por lo tanto, reportar beneficios económicos.

Al principio  había desarrolladores  que usaban NetBeans , pero poco  después todas  la comunidad se paso programar  con  Eclipse   hasta  que salió a la luz Android Studio, que o todo apunta a que será el entorno que use todo el mundo pues en poco tiempo será lo único que el equipo de Android recomiende.

Está basado en IntelliJ IDEA, uno de los IDE para java de primer nivel (entre los mejores, con Eclipse, netbeans)

Ademas  soporta un  nueva forma de construir los apk. Más serio, mas versátil, mas potente, mas actual, y mas parecido a un proyecto en java.

En este post vamos a intentar solucionar un  típico  problema cuando empezamos a  desarrollar con  Android Studio  en equipos no muy modernos.

Este problema como vamos a ver, no se resuelve reinstalando   Android Studio

El error   completo  ocurre cuando intentamos probar cualquier proyecto  ( incluso vacío ) ,   apareciendo el mensaje «Gradle sync failed: CreateProcess failed, error=216 Consult IDE log for more details (Help | Show Log)»

Este es  un ejemplo:

error

 

El error  216  , que en ocasiones no es mostrado completo corresponde a este descriptivo «This version of %1 is not compatible with the version of Windows you’re running. Check your computer’s system information and then contact the software publisher»

Esto sucede porque se incluye la versión de  64bit del JRE con Android Studio para Windows, lo cual  produce errores en sistemas de 32 bits.

La solución al problema pasa por dos pasos:

 

  • No utilice el JDK incorporado: vaya al cuadro de diálogo Archivo -> Estructura del proyecto, desmarque «Usar JDK incrustado» y seleccione el JRE de 32 bits que tenga instalado por separado en su sistema . Al menos debería ser  JDK8  o superior  .

 

android_studio

 

 

  • Disminuya la huella de memoria para Gradle en gradle.properties (Propiedades del proyecto), por ejemplo, establezca en -Xmx768m ( tendrá por defecto -Xmx1024m).Es decir debería quedar así:
org.gradle.jvmargs= -Xmx768m

 

Creación de una app movil para interactuar con Raspberry Pi


¿Piensa que  se necesita mucho tiempo para crear una app  movil para la Raspberry Pi que involucre un proyecto de  IO para conectar sensores de movimiento,  luces , relés  ,etc y se pueda completar en breve ?

La verdad es que  escribir una aplicación, implica leer toneladas de documentación, tomar mucho  tiempo para aprender  lenguajes de programación, código,y mucho tiempo de  trabajo…Pero ¿por qué invertir tanto tiempo en preparar su proyecto, cuando se puede estar en funcionamiento en una fracción de tiempo permitiendo  la construcción de sus proyectos de automatización en cuestión de minutos.?

Entonces, ¿cómo es posible todo esto? Pues gracias  a un  framework  gnerico desarrollado por  myDevices IO Project Builder llamado Cayenne .Cayennese ha creado para los desarrolladores y fabricantes deseosos de construir rápidamente prototipos y proyectos increíbles con  Raspberry Pi  permitiendo con una cuenta gratuita de Cayena, crear un número ilimitado de proyectos.

También tiene capacidades de pleno derecho de la IO  para que pueda controlar de forma remota sensores, motores, actuadores, incluidas los puertos  de GPIO con  almacenamiento ilimitado de datos recogidos por los componentes de hardware,   triggers y alertas,  que proporcionan las herramientas necesarias para la automatización y la capacidad de configurar alertas. Ademas también puede crear cuadros de mando personalizados para mostrar su proyecto con arrastrar y soltar widgets que también son totalmente personalizables.

 

 

 

Ejemplo paso a paso 

Como se puede ver en el video , Cayyene app es una innovadora solución genérica que nos puede ahorrar mucho trabajo a la hora de  crear un proyecto con la Raspberry Pi

En resumen ,algunos de los rasgos que más destacan de la solución de Cayyene es :

  • Tablero de instrumentos flexibles :Personalizar el teléfono o en el salpicadero en línea con arrastrar y soltar widgets.
  • Acciones de activación :Crear disparadores y alertas para dispositivos, eventos, acciones y más.
  • Control de GPIO :configurar a distancia GPIO desde una aplicación móvil o en el salpicadero.
  • El acceso remoto instantáneo :Automáticamente el control remoto y accede a tu Pi desde su teléfono o computadora.
  • Configuración fácil:conectar rápidamente su Pi a Internet y conectar sensores, actuadores y extensiones en cuestión de minutos

Par mostrar lo sencillo que puede ser crear un proyecto con Cayyene, vamos a ver un ejemplo

Todo el equipo que se necesita para la creación de myDevices Cayenne para la Raspbery Pi es muy sencillo (es posible que necesite piezas adicionales si usted está mirando para agregar más sensores, dispositivos y cualquier otra cosa que desee conectado a tu Pi ). :
Necesario:

  • Raspberry  Pi
  • 8gb tarjeta Micro SD si se está utilizando una Raspberry Pi + 2, 3 o B o tarjeta SD de 8 GB para cualquier versión anterior del Pi.
  • Cable Ethernet o Wifi dongle (Pi 3 tiene Wi-Fi incorporado).Usted también tendrá que asegurarse de que tiene una conexión a Internet para la Pi.

Opcional:

  • Caja para la Raspberry Pi
  • Teclado USB y ratón USB

A continuación se presentan los elementos utilizados en el circuito de ejemplo

  • DS 18B20 del sensor de temperatura o similar
  • 4v7k Resistencia
  • Kit de arranque GPIO
  • Cables de conexión
  • Placa prototipos

Instalación de Frambuesa Pi Cayenne

El proceso de instalación de Cayena en la Raspberry Pi es bastante simple y no debería tomar demasiado tiempo para obtener su creación y funcionamiento. Usted tendrá que asegurarse de que ha instalado en su Raspbian Pi. .

  1. En primer lugar, vaya a  myDevices Cayenne y registrarse para obtener una cuenta gratuita.
  2. Una vez que ya se ha registrado usted tendrá que registrarse / conectar el Pi hasta la cuenta que acaba de crear. Para ello sólo tiene que copiar las 2 líneas de comandos que se muestran después de su inscripción. Introduzca estos en el terminal para su Pi. (Estos archivos son únicos para cada instalación nueva)

Únete a la pantalla
Alternativamente, se puede descargar la aplicación y se puede localizar e instalar en su Cayenne Pi automáticamente. (Tenga en cuenta SSH debe estar habilitado )

  1. Tomará unos minutos para instalar en el Pi en función de la velocidad de su conexión a Internet es. El navegador web o aplicación deben actualizar automáticamente con información sobre el proceso de instalación.
  2. Una vez instalado el tablero de instrumentos se mostrará y debe verse como algo más adelante.

Pi tablero de cayena

Configuración de su primer sensor

En este ejemplo vamos a configurar un sensor de temperatura. El sensor usado es el DS18B20,ahora bien  el uso de Cayyene hace que sea muy sencillo.

Todo lo que necesita hacer es configurar el circuito y lo han conectado a la Pi.  También se he añadido un LED que está conectado a la clavija # 17 con una resistencia de 100 ohmios al carril de suelo.
Diagrama del sensor de temperatura Frambuesa Pi
Ahora bien, cuando  configuran el sensor se detecta automáticamente y se añade al tablero de instrumentos.Si no se agrega automáticamente a continuación, tendrá que añadir manualmente. Para añadir manualmente, simplemente, hacer lo siguiente.

  1. Ir a añadir en la esquina superior izquierda del tablero de instrumentos.
  2. Elija un dispositivo en el cuadro desplegable.
  3. Encontrar el dispositivo, en este caso se trata de un sensor de temperatura DS18B20.
  4. Añadir todos los detalles para el dispositivo. En este caso, tendrá la dirección del esclavo para el sensor. Para obtener la dirección del esclavo escriba lo siguiente en el terminal del Pi.
    cd /sys/bus/w1/devices ls
  5. La dirección del esclavo será similar a esta 28-000007602ffa . Simplemente copia y pega esto en el campo de esclavos dentro de Cayena salpicadero.
  6. Una vez introducida seleccione sensor de complemento.
  7. El sensor se debe mostrar en el salpicadero.
  8. Si necesita personalizar su prensa sensor de la rueda dentada y va a llegar a algunas opciones.
  9. También puede ver estadísticas / gráficos. Por ejemplo, el sensor de temperatura puede representar gráficamente los datos en tiempo real y mantendrá los datos históricos también.

Si desea agregar también un LED que se pueda encender y apagar a través del panel de control, siga las siguientes instrucciones.

  1. Ahora vamos a añadir un dispositivo más. A menos que éste será un LED.
  2. Así que volver a añadir un nuevo dispositivo.
  3. Ahora buscar salida digital y seleccionarlo.
  4. Para este dispositivo seleccione su Pi, el tipo de widget es botón, el icono puede ser lo que quiera, y luego seleccione GPIO integrado. Por último canal es el pin / canal que nuestro LED está conectado. Para este ejemplo, es el pin # 17. (Esta es la numeración de los pines GPIO).
  5. A continuación, pulse el botón sensor de complemento.
  6. Ahora puede apagar el pin GPIO alta y baja del tablero de instrumentos y también utilizarlo en un disparador.
  7. Ahora estamos listos para crear nuestro primer gatillo.

Ahora debe tener dos dispositivos en el panel de control que debería ser algo como esto.
Los dispositivos añadidos

Configuración de su primer disparador

Disparadores en Cayyene son una manera de reaccionar a un cierto cambio en la Pi a través de un sensor conectado a él. Esto podría ser algo tan simple como una temperatura superior a un determinado valor o incluso sólo su pi ir fuera de línea. Como se puede imaginar que esto puede ser muy poderosa en la creación de dispositivos inteligentes que reaccionan a los alrededores. Por ejemplo, si la habitación se enfría demasiado, a continuación, convertir un calentador.

El proceso de añadir un disparador es muy sencillo :

  1. Ir a añadir en la esquina superior izquierda del tablero de instrumentos.
  2. Seleccionar un trigger desde el cuadro de abajo.
  3. En primer lugar el nombre de su activación, voy a llamar a la mía «demasiado caliente».
  4. Ahora arrastrar y soltar su Frambuesa Pi desde la esquina izquierda en el caso de la caja.
  5. Por debajo de esto seleccionar el sensor de temperatura y tienen casilla junto a «por encima de la temperatura» seleccionado. (Opciones del dispositivo Si no se muestran simplemente refrescar la página)
  6. Ahora en el cuadro de selección a continuación, notificación y agregar una dirección de correo electrónico o número de teléfono de un mensaje de texto (puede agregar ambos).Asegúrese de marcar las casillas de verificación también.

Gatillo demasiado caliente

  1. Ahora haga clic en «Activación de almacenamiento».
  2. Ahora debería ser guardado y le enviará una alerta cada vez que el sensor de temperatura es superior a 40 grados centígrados.
  3. También puede arrastrar el Raspberry Pi en el cuadro a continuación, y tienen que hacer muchas cosas, incluyendo el control de los dispositivos de salida. Por ejemplo, en mi circuito Tengo un LED que se enciende cuando la temperatura supera los 40 grados centígrados.
  4. Para hacer clic en el gatillo de disparo LED de nueva situada en la parte superior de la página. Nombre esta activar el gatillo LED.
  5. Ahora arrastrar el Pi en el caso de la caja y luego seleccione el sensor de temperatura de nuevo con 40 grados centígrados por encima.
  6. Ahora arrastrar el Raspberry Pi en cuadro a continuación. Selecciona nuestra salida digital y tienen la casilla de marcado.
  7. Ahora haga clic en Activación de almacenamiento.
  8. Ahora cada vez que nuestro sensor de temperatura conectado a la Pi reporta una temperatura superior a 40 grados centígrados se enviará un correo electrónico y encienda el LED. También tendrá que añadir otro factor desencadenante para apagar el LED cuando se cae de nuevo por debajo de 40, pero eso se lo dejo por ahora y pasar a los eventos.

mydevices cayennem disparadores

Eventos

Eventos en Raspberry Pi Cayenne es algo similar a los factores desencadenantes pero son dependientes del tiempo en lugar de depender de un cambio en un sensor o el propio dispositivo. La creación de un evento es bastante fácil

Vamos  a  ver  rápidamente cómo configurar su pi para reiniciar una vez al mes.

  1. Ir a añadir en la esquina superior izquierda del tablero de instrumentos.
  2. Seleccionar evento en el cuadro de abajo.
  3. Ahora debería ver una pantalla con un calendario y una ventana emergente llamado nuevo evento.
  4. Introduzca los detalles de su evento. Por ejemplo, el mío se llama reinicio mensual y ocurrirá en el primer día de cada mes a las 2 am. A continuación se muestra un ejemplo de la pantalla.

eventos de cayena con detalles

  1. Una vez hecho esto, haga clic en Guardar.
  2. Ahora debería ser capaz de ver su evento en el calendario. Basta con hacer clic en él si desea modificarlo.

Como se podría imaginar eventos puede ser bastante potente por lo que sería digno de mirar en estos más. Un buen ejemplo del uso de eventos sería si se necesita algo para ejecutar o activar (como luces que necesitan para ser activado en un momento específico).

Panel de GPIO

El panel GPIO dentro de Frambuesa Pi Cayena le permite controlar y modificar las patas del Pi. Por ejemplo, puede activar un pin de ser una entrada a una salida inversa y el vicio.También se puede activar tanto los pines de salida baja y alta.
Panel de GPIO cayena
Como se puede ver que también lo convierte en un gran lienzo de referencia si necesita hacer referencia hacia atrás y ver qué pines son los que necesita. También puede ver los dispositivos que están asignados actualmente a los pines específicos. También es capaz de ver el estado actual de un alfiler. (Por ejemplo, entrada o salida y baja o alta)

Escritorio remoto

Se  puede  instalar  Cayyene también en un escritorio remoto a su Frambuesa Pi, ya sea a través del navegador web o por medio de la aplicación móvil. Puede hacer esto simplemente haciendo lo siguiente.

  1. Sobre el tablero encontrar el widget que dice «comandos».
  2. Dentro de este control, haga clic en el acceso remoto.
  3. Ahora se conectará a la Pi y abrir una nueva ventana. Si una nueva ventana no se abre el navegador más probable es bloqueado. Simplemente permiten cayenne.mydevices para abrir nuevas pestañas.
  4. Una vez hecho esto se puede controlar su Pi igual que como si estuviera allí con ella.
  5. Una de las ventajas con el uso de Cayena de escritorio remoto es que se puede acceder a él en cualquier parte del mundo con bastante facilidad en lugar de tener que configurar una VPN o abrir los puertos de la red.

 

Fuente   aqui