{"id":995,"date":"2022-03-14T11:24:52","date_gmt":"2022-03-14T11:24:52","guid":{"rendered":"https:\/\/asgardius.company\/?p=995"},"modified":"2022-03-14T11:24:52","modified_gmt":"2022-03-14T11:24:52","slug":"como-crear-una-aplicacion-para-escuchar-radio-por-internet-en-android-studio-con-exoplayer","status":"publish","type":"post","link":"https:\/\/asgardius.company\/?p=995","title":{"rendered":"C\u00f3mo crear una aplicaci\u00f3n para escuchar radio por internet en Android Studio con ExoPlayer"},"content":{"rendered":"\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" src=\"https:\/\/asgardius.company\/wp-content\/uploads\/2021\/06\/antenna.png\" alt=\"\" class=\"wp-image-314\"\/><figcaption>Asteroide con antena de radio<\/figcaption><\/figure>\n\n\n\n<p>ExoPlayer es una herramienta que nos permite crear aplicaciones de streaming de forma relativamente sencilla<\/p>\n\n\n\n<p>Vamos a crear un proyecto nuevo en Android Studio y en la secci\u00f3n de tel\u00e9fono y tablet seleccionamos &#8220;Actividad vac\u00eda&#8221;<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" src=\"https:\/\/asgardius.company\/wp-content\/uploads\/2022\/01\/Captura-de-pantalla_2022-01-14_05-14-58.png\" alt=\"\" class=\"wp-image-996\"\/><\/figure>\n\n\n\n<p>Le ponemos un nombre a la app, un nombre de paquete (este debe ser \u00fanico), seleccionamos nuestro lenguaje de programaci\u00f3n principal (para este tutorial usaremos Java) y el SDK m\u00ednimo (eleg\u00ed API 21 para Android 5.0)<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" src=\"https:\/\/asgardius.company\/wp-content\/uploads\/2022\/01\/Captura-de-pantalla_2022-01-14_05-18-16.png\" alt=\"\" class=\"wp-image-997\"\/><\/figure>\n\n\n\n<p>Nos vamos a la carpeta &#8220;res&#8221; del proyecto en la parte izquierda del la interfaz. Buscamos la subcarpeta mipmap y borramos los archivos .webp que comienzan con ic_launcher<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/asgardius.company\/wp-content\/uploads\/2022\/01\/Captura-de-pantalla_2022-01-14_05-24-27-1024x533.png\" alt=\"\" class=\"wp-image-998\"\/><\/figure>\n\n\n\n<p>Hacemos clic derecho sobre la carpeta &#8220;res&#8221;, nos vamos al men\u00fa &#8220;nuevo&#8221; y elegimos &#8220;recurso imagen&#8221;<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/asgardius.company\/wp-content\/uploads\/2022\/01\/Captura-de-pantalla_2022-01-14_05-26-43-1024x644.png\" alt=\"\" class=\"wp-image-999\"\/><\/figure>\n\n\n\n<p>Seleccionamos la imagen que queremos como \u00edcono de notificaci\u00f3n y una vez establecido repetimos los pasos para el \u00edcono del lanzador<\/p>\n\n\n\n<p>Nos vamos al archivo build.gradle correspondiente al modulo de la app y agregamos los siguiente dentro del partado de las dependencias<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>implementation 'com.google.android.exoplayer:exoplayer:2.16.1'<\/code><\/pre>\n\n\n\n<p>Abrimos el archivo MainActivity.java y agregamos las siguientes l\u00edneas de c\u00f3digo<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>        ExoPlayer player = new ExoPlayer.Builder(this).build();\n        \/\/ Build the media item.\n        MediaItem mediaItem = MediaItem.fromUri(&lt;radio-url&gt;);\n        \/\/ Set the media item to be played.\n        player.setMediaItem(mediaItem);\n        \/\/ Prepare the player.\n        player.prepare();\n        \/\/ Start the playback.\n        player.play();<\/code><\/pre>\n\n\n\n<p>Realizamos las importaciones necesarias y nos quedar\u00eda algo parecido a esto<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package asgardius.page.r3player;\n\nimport androidx.appcompat.app.AppCompatActivity;\n\nimport android.os.Bundle;\n\nimport com.google.android.exoplayer2.ExoPlayer;\nimport com.google.android.exoplayer2.MediaItem;\n\npublic class MainActivity extends AppCompatActivity {\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_main);\n        ExoPlayer player = new ExoPlayer.Builder(this).build();\n        \/\/ Build the media item.\n        MediaItem mediaItem = MediaItem.fromUri(&lt;radio-url&gt;);\n        \/\/ Set the media item to be played.\n        player.setMediaItem(mediaItem);\n        \/\/ Prepare the player.\n        player.prepare();\n        \/\/ Start the playback.\n        player.play();\n    }\n}<\/code><\/pre>\n\n\n\n<p>Editamos nuestro AndroidManfest para darle permisos de acceso a internet y agregamos lo siguiente entre &lt;manifest&gt; y &lt;aplication&gt;<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;uses-permission android:name=\"android.permission.INTERNET\" \/&gt;<\/code><\/pre>\n\n\n\n<p>En caso de utilizar una fuente http sin SSL necesitamos agregar lo siguiente dentro de application para evitar problemas con Android 9 y versiones posteriores<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>android:usesCleartextTraffic=\"true\"<\/code><\/pre>\n\n\n\n<p>Para evitar que la pantalla cambie a modo horizontal podemos agregar lo siguiente dentro de &lt;activity&gt;<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>android:screenOrientation=\"portrait\"<\/code><\/pre>\n\n\n\n<p>Nos quedar\u00eda algo parecido a esto<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?xml version=\"1.0\" encoding=\"utf-8\"?&gt;\n&lt;manifest xmlns:android=\"http:\/\/schemas.android.com\/apk\/res\/android\"\n    package=\"asgardius.page.r3player\"&gt;\n    &lt;uses-permission android:name=\"android.permission.INTERNET\" \/&gt;\n\n    &lt;application\n        android:allowBackup=\"true\"\n        android:icon=\"@mipmap\/ic_launcher\"\n        android:label=\"@string\/app_name\"\n        android:roundIcon=\"@mipmap\/ic_launcher_round\"\n        android:supportsRtl=\"true\"\n        android:usesCleartextTraffic=\"true\"\n        android:theme=\"@style\/Theme.TheRedRobotRadio\"&gt;\n\n        &lt;activity\n            android:name=\".MainActivity\"\n            android:screenOrientation=\"portrait\"\n            android:exported=\"true\"&gt;\n            &lt;intent-filter&gt;\n                &lt;action android:name=\"android.intent.action.MAIN\" \/&gt;\n                &lt;category android:name=\"android.intent.category.LAUNCHER\" \/&gt;\n            &lt;\/intent-filter&gt;\n        &lt;\/activity&gt;\n    &lt;\/application&gt;\n\n&lt;\/manifest&gt;<\/code><\/pre>\n\n\n\n<p>La depuramos en un emulador o un dispositivo f\u00edsico y deber\u00eda conectarse a la emisora seleccionada despues de abrirse. Para detener la reproducci\u00f3n es necesario retirar la app del panel de apps recientes<\/p>\n\n\n\n<p>Agregaremos una imagen a la actividad principal para que no se vea vac\u00eda. Para ello elegimos una imagen y la arrastramos a la carpeta &#8220;drawable&#8221; dentro de &#8220;res&#8221;. Yo eleg\u00ed <a href=\"https:\/\/patrice.asgardius.company\/gitea\/asgardius\/r3\/src\/commit\/76289d11f8aa6cbee50c627f90fa622e29e110c8\/source\/galaxy.png\">uno de los fondos utilizados en otro proyecto donde estoy trabajando<\/a>. Ahora agregamos la imagen en la interfaz de la actividad principal (&#8220;activity_main.xml&#8221; dentro de la carpeta &#8220;layout&#8221; ubicada en &#8220;res&#8221;)<\/p>\n\n\n\n<p>Reemplazamos el contenido por lo siguiente<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?xml version=\"1.0\" encoding=\"utf-8\"?&gt;\n&lt;LinearLayout xmlns:android=\"http:\/\/schemas.android.com\/apk\/res\/android\"\n    xmlns:tools=\"http:\/\/schemas.android.com\/tools\"\n    android:id=\"@+id\/activity_main\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\"\n    android:theme=\"@style\/Theme.AppCompat\"\n    tools:context=\".MainActivity\"&gt;\n\n    &lt;ImageView\n        android:id=\"@+id\/imageView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"250dp\"\n        android:background=\"@drawable\/galaxy\"\n        android:contentDescription=\"@string\/galaxy\"\n        tools:ignore=\"MissingConstraints\" \/&gt;\n\n    &lt;LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"100dp\"\n        android:layout_margin=\"20dp\"\n        android:orientation=\"horizontal\"\n        android:padding=\"10dp\"&gt;\n\n        &lt;Button\n            android:id=\"@+id\/start\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"match_parent\"\n            android:layout_weight=\"1\"\n            android:text=\"Play\" \/&gt;\n\n        &lt;Button\n            android:id=\"@+id\/stop\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"match_parent\"\n            android:layout_weight=\"1\"\n            android:text=\"Stop\" \/&gt;\n    &lt;\/LinearLayout&gt;\n&lt;!--\n    &lt;TextView\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"Hello World!\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintLeft_toLeftOf=\"parent\"\n        app:layout_constraintRight_toRightOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\" \/&gt;\n--&gt;\n\n&lt;\/LinearLayout&gt;<\/code><\/pre>\n\n\n\n<p>Reemplazando &#8220;galaxy&#8221; por el nombre de nuestra imagen y ajustando la altura para que coincida con las proporciones de esta.<\/p>\n\n\n\n<p>Agregaremos la funci\u00f3n correspondiente a los botones reci\u00e9n agregados<\/p>\n\n\n\n<p>Buscamos las siguientes l\u00edneas en el archivo &#8220;MainActivity.java&#8221;<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>                MediaItem mediaItem = MediaItem.fromUri(\"&lt;radio-url>\");\n                player.setMediaItem(mediaItem);\n                \/\/ click handling code\n                \/\/ Prepare the player.\n                player.prepare();\n                \/\/ Start the playback.\n                player.play();<\/code><\/pre>\n\n\n\n<p>Las reemplazamos por lo siguiente<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>        Button startplayer = (Button)findViewById(R.id.start);\n        startplayer.setOnClickListener(new View.OnClickListener(){\n            @Override\n            public void onClick(View view) {\n                MediaItem mediaItem = MediaItem.fromUri((&lt;radio-url&gt;);\n                player.setMediaItem(mediaItem);\n                \/\/ click handling code\n                \/\/ Prepare the player.\n                player.prepare();\n                \/\/ Start the playback.\n                player.play();\n            }\n        });\n        Button stopplayer = (Button)findViewById(R.id.stop);\n        stopplayer.setOnClickListener(new View.OnClickListener(){\n            @Override\n            public void onClick(View view) {\n                \/\/ click handling code\n                player.stop();\n            }\n        });<\/code><\/pre>\n\n\n\n<p>El archivo quedar\u00e1 parecido a este<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package asgardius.page.r3player;\n\nimport androidx.appcompat.app.AppCompatActivity;\n\nimport android.os.Bundle;\nimport android.view.View;\nimport android.widget.Button;\n\nimport com.google.android.exoplayer2.ExoPlayer;\nimport com.google.android.exoplayer2.MediaItem;\n\npublic class MainActivity extends AppCompatActivity {\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_main);\n        ExoPlayer player = new ExoPlayer.Builder(this).build();\n        \/\/ Build the media item.\n\n        Button startplayer = (Button)findViewById(R.id.start);\n        startplayer.setOnClickListener(new View.OnClickListener(){\n            @Override\n            public void onClick(View view) {\n                MediaItem mediaItem = MediaItem.fromUri((&lt;radio-url&gt;);\n                player.setMediaItem(mediaItem);\n                \/\/ click handling code\n                \/\/ Prepare the player.\n                player.prepare();\n                \/\/ Start the playback.\n                player.play();\n            }\n        });\n        Button stopplayer = (Button)findViewById(R.id.stop);\n        stopplayer.setOnClickListener(new View.OnClickListener(){\n            @Override\n            public void onClick(View view) {\n                \/\/ click handling code\n                player.stop();\n            }\n        });\n\n\n    }\n}<\/code><\/pre>\n\n\n\n<p>Ahora tenemos una app sencilla con la cual poder escuchar nuestra emisora de radio favorita<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/asgardius.company\/wp-content\/uploads\/2022\/01\/Screenshot_20220114-101752_Trebuchet-485x1024.jpg\" alt=\"\" class=\"wp-image-1014\"\/><\/figure>\n\n\n\n<p>Referencias<\/p>\n\n\n\n<p><a href=\"https:\/\/exoplayer.dev\/hello-world.html\">https:\/\/exoplayer.dev\/hello-world.html<\/a><\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>ExoPlayer es una herramienta que nos permite crear aplicaciones de streaming de forma relativamente sencilla Vamos a crear un proyecto nuevo en Android Studio y en la secci\u00f3n de tel\u00e9fono y tablet seleccionamos &#8220;Actividad vac\u00eda&#8221; Le ponemos un nombre a la app, un nombre de paquete (este debe ser \u00fanico), seleccionamos nuestro lenguaje de programaci\u00f3n&hellip; <a class=\"more-link\" href=\"https:\/\/asgardius.company\/?p=995\">Seguir leyendo <span class=\"screen-reader-text\">C\u00f3mo crear una aplicaci\u00f3n para escuchar radio por internet en Android Studio con ExoPlayer<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2],"tags":[],"class_list":["post-995","post","type-post","status-publish","format-standard","hentry","category-uncategorized","entry"],"_links":{"self":[{"href":"https:\/\/asgardius.company\/index.php?rest_route=\/wp\/v2\/posts\/995","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/asgardius.company\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/asgardius.company\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/asgardius.company\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/asgardius.company\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=995"}],"version-history":[{"count":0,"href":"https:\/\/asgardius.company\/index.php?rest_route=\/wp\/v2\/posts\/995\/revisions"}],"wp:attachment":[{"href":"https:\/\/asgardius.company\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=995"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/asgardius.company\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=995"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/asgardius.company\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=995"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}