Aplicación de Android¶
Idiomas¶
Esta página se puede leer en los siguiente idiomas:
Objetivo¶
El Objetivo de este tutorial es crear tu primera App de Android integrando la tecnología de Beeping.
Para ello seguiremos los siguientes pasos:
-
Creación de un beep
-
Creación de un proyecto de Android
-
Instalación del SDK de Android
-
Uso del SDK de Android
-
Usar el dispositivo para capturar el conenido del beep
Descargar la SDK¶
A continuación os dejamos los pasos que debes seguir para crear vuestra primera App.
Lo primero que debemos hacer es descargar el SDK de Android.
Hacer click aquí para descargar el framework
Una vez descargado lo descomprimimos y dejamos accesible el framework AndroidBeepingCore-release.aar para más adelante.
Creación del Beep¶
Para crear el beep sigue los pasos del anterior tutorial.
Haz click aquí para acceder a la creación de tu primer beep
Una vez hayamos creado el Beep tendremos un fichero llamado ultrasound.wav con el contenido qa020. Dejamos accesible el fichero para reproducirlo más adelante.
Creación de app¶
A continuación creamos nuestra aplicación de Android.
Nosotros vamos a utilizar Android Studio.
Vamos a llamar a nuestra aplicación beeping-hello.
Instalación del framework¶
- Copiamos el framework dentro del siguiente directorio de nuestra app:
$ cp AndroidBeepingCore-release.aar [APP]/AndroidBeepingCore/AndroidBeepingCore.aar
AndroidBeepingCore
Al ejecutar el comando de copia lo que hemos hecho es cambiarle el nombre al framework. Dentro de nuestra App el framework debe llamarse AndroidBeepingCore.arr
- Importamos el framework a nuestro proyecto:
- Abrir el fichero build.gradle (Module: app)
- Modificar el minSdkVersion a la versión 26:
defaultConfig { applicationId "io.beeping.beeping_hello" minSdkVersion 26 targetSdkVersion 28 versionCode 1 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" }
-
Conecta un dispositivo Android por USB
-
Selecciona el dispositivo en Android Studio y ejecuta la aplicación.
Si la apliación se abre correctamente, el Framework de Beeping estará bien instalado.
Implemetar la SDK¶
El código que debemos escribir para implementar el protocolo de Beeping es muy simple.
A continuación os dejamos los pasos para implementar el código fuente en vuestra app.
- Abrimos el fichero AndroidManifest.xml y añadimos las siguientes líneas:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="io.beeping.beeping_hello"> <uses-permission android:name="android.permission.RECORD_AUDIO"></uses-permission> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
- Abrimos el fichero MainActivity.java y añadimos los headers:
package io.beeping.beeping_hello; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import com.beeping.AndroidBeepingCore.BeepingCore; import com.beeping.AndroidBeepingCore.BeepingCoreEvent; import com.beeping.AndroidBeepingCore.BeepingCoreJNI; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } }
- Añadimos la implementación de Beeping
package io.beeping.beeping_hello; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import com.beeping.AndroidBeepingCore.BeepingCore; import com.beeping.AndroidBeepingCore.BeepingCoreEvent; import com.beeping.AndroidBeepingCore.BeepingCoreJNI; public class MainActivity extends AppCompatActivity implements BeepingCoreEvent { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public void beepIdWith(String beepId) { System.out.println("The BeepId is:" + beepId); } }
Callback
Cuando la SDK detecte un beep la función beepIdWith será llamada automáticamente, y recibirá como parámetro el contenido del beep. Cuando esto suceda en nuestra App, lo que hacemos es mostrar el contenido del beep en nuestra consola.
- Declaración del objeto Beeping
package io.beeping.beeping_hello; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import com.beeping.AndroidBeepingCore.BeepingCore; import com.beeping.AndroidBeepingCore.BeepingCoreEvent; import com.beeping.AndroidBeepingCore.BeepingCoreJNI; public class MainActivity extends AppCompatActivity implements BeepingCoreEvent { BeepingCore beeping; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public void beepIdWith(String beepId) { System.out.println("The BeepId is:" + beepId); } }
- Se inicializa el objeto de Beeping y le decimos que se ponga a escuchar
package io.beeping.beeping_hello; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import com.beeping.AndroidBeepingCore.BeepingCore; import com.beeping.AndroidBeepingCore.BeepingCoreEvent; import com.beeping.AndroidBeepingCore.BeepingCoreJNI; public class MainActivity extends AppCompatActivity implements BeepingCoreEvent { BeepingCore beeping; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Init Beeping Framework beeping = new BeepingCore(this); // Listening beeping.startBeepingListen(); setContentView(R.layout.activity_main); } @Override public void beepIdWith(String beepId) { System.out.println("The BeepId is:" + beepId); } }
Microphone
Para poder escuchar el ultrasonido y decodificar su contenido, la SDK necesita acceso al micrófono para poder oir lo que le estamos enviando.
- Le decimos a Beeping que deje de escuchar, una vez hemos leído el contenido del beep
package io.beeping.beeping_hello; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import com.beeping.AndroidBeepingCore.BeepingCore; import com.beeping.AndroidBeepingCore.BeepingCoreEvent; import com.beeping.AndroidBeepingCore.BeepingCoreJNI; public class MainActivity extends AppCompatActivity implements BeepingCoreEvent { BeepingCore beeping; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Init Beeping Framework beeping = new BeepingCore(this); // Listening beeping.startBeepingListen(); setContentView(R.layout.activity_main); } @Override public void beepIdWith(String beepId) { System.out.println("The BeepId is:" + beepId); // Stop listening beeping.stopBeepingListen(); } }
La magia¶
Lo que vamos a hacer ahora es probar nuestra aplicación.
Para probar nuestra aplicación debemos tener a mano dos elementos:
-
Nuestro fichero ultrasound.wav que es nuestro beep que contiene el valor qa020
-
La aplicación que acabamos de crear
Procedemos a seguir los siguientes pasos:
- Abrimos el Logcat de Android Studio
- Seleccionamos nuestro dispositivo Android
- Añadimos un filtro a Logcat para ver solo las salidas de texto de Beeping y su SDK
- Arrancamos nuestra aplicación de Android en nuestro dispositivo
Si nos fijamos en nuestra consola veremos las siguientes líneas que nos indican que beeping está en modo escucha:
2020-03-11 16:37:59.676 8559-8559/io.beeping.beeping_hello D/BEEPING:SDK: CORE 2020-03-11 16:37:59.677 8559-8559/io.beeping.beeping_hello D/BEEPING:SDK: AUDIO-MANAGER 2020-03-11 16:37:59.682 8559-8559/io.beeping.beeping_hello D/BEEPING:SDK: ALLOC 2020-03-11 16:37:59.684 8559-8559/io.beeping.beeping_hello D/BEEPING:SDK: CONFIGURE 2020-03-11 16:38:00.190 8559-8559/io.beeping.beeping_hello D/BEEPING:SDK: LISTENING 2020-03-11 16:38:00.353 8559-8559/io.beeping.beeping_hello D/BEEPING:SDK: AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK
Ahora ejecutamos nuestro beep y la magia se convierte en realidad.
Fijaros lo que ha pasado en nuestra consola:
2020-03-11 16:38:23.505 8559-8591/io.beeping.beeping_hello D/BEEPING:SDK: BeepingCallback 2020-03-11 16:38:25.404 8559-8591/io.beeping.beeping_hello D/BEEPING:SDK: BeepingCallback 2020-03-11 16:38:25.405 8559-8591/io.beeping.beeping_hello D/BEEPING:SDK: BC_TOKEN_END 2020-03-11 16:38:25.406 8559-8559/io.beeping.beeping_hello I/System.out: BEEPING:SDK: The BeepId is:qa020 2020-03-11 16:38:25.406 8559-8559/io.beeping.beeping_hello D/BEEPING:SDK: DEALLOC 2020-03-11 16:38:25.656 8559-8559/io.beeping.beeping_hello D/BEEPING:SDK: stopBeepingListen
Si os fijáis bien en la consola, las primeras líneas nos informan de que Beeping ha detectado un ulltrasonido, con información.
En la tercera línea se nos indica que el formato del beep es correcto, y las líneas siguientes lo que hacen es leer el contenido y desenciptan la información.
Una vez finalizo el proceso, se nos informa que la desencriptación ha funcionado correctamente e internamente lo que hace ls SDK es llamar a la función que hemos creado y que por lo tanto recibe el callback.
Esta función lo que hace es escribir en nuestra consola en contenido del beep que le hemos enviado. En nuestro caso la siguiente información: qa020.
Una vez hemos mostrado la información por la consola lo que hemos hecho es parar la escucha de nuestra app y eso es lo que nos muestra nuestro log en la última línea.
API¶
A continuación os mostramos el API del framework de Beeping para Android:
Object¶
Name | Object | Type |
---|---|---|
Beeping | BeepingCore | BeepingCore |
Methods¶
Object | Method | Return | Description |
---|---|---|---|
BeepingCore | new (Context) | instance | Object creation |
BeepingCore | startBeepingListen() | void | Ready to listen beeps |
BeepingCore | stopBeepingListen() | void | Stop listening beeps |
Protocol¶
Object | Type | Callback | Return |
---|---|---|---|
BeepingCore | beepingDelegate | beepIdWith:(String beepId) | void |
Links¶
Aquí te dejamos una serie de links relacionados con la SDK de Android:
Frase¶
Theodore Roosevelt
Haz lo que puedas, con lo que tienes, dónde estás.