{"id":1556,"date":"2018-09-20T08:53:37","date_gmt":"2018-09-20T13:53:37","guid":{"rendered":"http:\/\/naps.com.mx\/blog\/?p=1556"},"modified":"2021-11-28T13:42:48","modified_gmt":"2021-11-28T19:42:48","slug":"intent-implicito-llamada-telefonica","status":"publish","type":"post","link":"https:\/\/naps.com.mx\/blog\/intent-implicito-llamada-telefonica\/","title":{"rendered":"Intent impl\u00edcito: Aplicaci\u00f3n que realiza una llamada telef\u00f3nica en Android"},"content":{"rendered":"<p><em><strong>Crea tu propia aplicaci\u00f3n que hace uso del tel\u00e9fono en Android, y aprende a utilizar un intent impl\u00edcito en Android, hacer uso de permisos en tu aplicaci\u00f3n m\u00f3vil, y diferenciar entre versiones de Android.<\/strong><\/em><\/p>\n<p><!--more--><\/p>\n<h2>Intent impl\u00edcito: Aplicaci\u00f3n que realiza una llamada telef\u00f3nica en Android<\/h2>\n<p>Un<strong> intent impl\u00edcito<\/strong> es una acci\u00f3n que invoca cualquier aplicaci\u00f3n que el dispositivo puede utilizar para realizar una determinada funci\u00f3n. Por ejemplo, no es necesario crear c\u00f3digo propio para hacer una llamada telef\u00f3nica, en vista de que Android tiene ya una aplicaci\u00f3n para el Tel\u00e9fono. En vez de eso, podemos enviar la orden de abrir la aplicaci\u00f3n tel\u00e9fono y pasarle el n\u00famero que desamos marcar, considerando que el usuario puede o no dar permiso para utilizar la app del tel\u00e9fono.<\/p>\n<p>Vamos a realizar lo siguiente:<\/p>\n<ol>\n<li>Crear una interfaz de usuario donde se ingrese un n\u00famero telef\u00f3nico y se pulse un bot\u00f3n para hacer la llamada.<\/li>\n<li>Codificar una funci\u00f3n de escucha para saber cu\u00e1ndo fue pulsado el bot\u00f3n.<\/li>\n<li>Determinar la versi\u00f3n de Android (esto es necesario pues en versiones nuevas hay cambios en la forma de autorizar a la aplicaci\u00f3n el uso de la app de tel\u00e9fono).<\/li>\n<li>Crear un intent de llamada telef\u00f3nica.<\/li>\n<li>Determinar si el usuario ha autorizado el uso de la app de tel\u00e9fono.<\/li>\n<li>Ejecutar el intent.<\/li>\n<\/ol>\n<p>Esta es la interfaz que deseamos realizar:<\/p>\n<div id=\"attachment_1557\" style=\"width: 532px\" class=\"wp-caption alignnone\"><a href=\"http:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2018\/09\/activityp5.jpeg\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-1557\" class=\"size-full wp-image-1557\" src=\"http:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2018\/09\/activityp5.jpeg\" alt=\"Interfaz para la aplicaci\u00f3n que ejecuta un intent impl\u00edcito en Android\" width=\"522\" height=\"818\" srcset=\"https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2018\/09\/activityp5.jpeg 522w, https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2018\/09\/activityp5-191x300.jpeg 191w\" sizes=\"auto, (max-width: 522px) 100vw, 522px\" \/><\/a><p id=\"caption-attachment-1557\" class=\"wp-caption-text\">Interfaz para la aplicaci\u00f3n que ejecuta un intent impl\u00edcito en Android<\/p><\/div>\n<p>Para esto creamos un nuevo Activity en blanco. Yo lo he nombrado <em>ThirdActivity<\/em>, por lo que dispongo del archivo <em>activity_third.xml<\/em> en el que he trabajado el siguiente c\u00f3digo:<\/p>\n<pre class=\"lang:xhtml decode:true \">&lt;?xml version=\"1.0\" encoding=\"utf-8\"?&gt;\r\n&lt;android.support.constraint.ConstraintLayout xmlns:android=\"http:\/\/schemas.android.com\/apk\/res\/android\"\r\n    xmlns:app=\"http:\/\/schemas.android.com\/apk\/res-auto\"\r\n    xmlns:tools=\"http:\/\/schemas.android.com\/tools\"\r\n    android:layout_width=\"match_parent\"\r\n    android:layout_height=\"match_parent\"\r\n    tools:context=\"com.example.gibgarcia.practica4.ThirdActivity\"\r\n    tools:layout_editor_absoluteY=\"81dp\"&gt;\r\n\r\n    &lt;EditText\r\n        android:id=\"@+id\/editTextPhone\"\r\n        android:layout_width=\"206dp\"\r\n        android:layout_height=\"59dp\"\r\n        android:layout_marginEnd=\"8dp\"\r\n        android:layout_marginStart=\"48dp\"\r\n        android:layout_marginTop=\"8dp\"\r\n        android:ems=\"10\"\r\n        android:inputType=\"phone\"\r\n        app:layout_constraintEnd_toStartOf=\"@+id\/imageButtonPhone\"\r\n        app:layout_constraintStart_toStartOf=\"parent\"\r\n        app:layout_constraintTop_toTopOf=\"parent\" \/&gt;\r\n\r\n    &lt;ImageButton\r\n        android:id=\"@+id\/imageButtonPhone\"\r\n        android:layout_width=\"29dp\"\r\n        android:layout_height=\"39dp\"\r\n        android:layout_marginBottom=\"9dp\"\r\n        android:layout_marginEnd=\"59dp\"\r\n        android:layout_marginTop=\"8dp\"\r\n        android:background=\"@android:color\/transparent\"\r\n        android:src=\"@drawable\/phone\"\r\n        app:layout_constraintBottom_toTopOf=\"@+id\/imageButtonWeb\"\r\n        app:layout_constraintEnd_toEndOf=\"parent\"\r\n        app:layout_constraintStart_toEndOf=\"@+id\/editTextPhone\"\r\n        app:layout_constraintTop_toTopOf=\"parent\" \/&gt;\r\n\r\n    &lt;EditText\r\n        android:id=\"@+id\/editTextWeb\"\r\n        android:layout_width=\"217dp\"\r\n        android:layout_height=\"47dp\"\r\n        android:layout_marginEnd=\"8dp\"\r\n        android:layout_marginStart=\"48dp\"\r\n        android:ems=\"10\"\r\n        android:inputType=\"text\"\r\n        android:text=\"\"\r\n        app:layout_constraintEnd_toStartOf=\"@+id\/imageButtonWeb\"\r\n        app:layout_constraintStart_toStartOf=\"parent\"\r\n        app:layout_constraintTop_toTopOf=\"@+id\/imageButtonWeb\" \/&gt;\r\n\r\n    &lt;ImageButton\r\n        android:id=\"@+id\/imageButtonWeb\"\r\n        android:layout_width=\"30dp\"\r\n        android:layout_height=\"45dp\"\r\n        android:layout_marginBottom=\"362dp\"\r\n        android:layout_marginEnd=\"54dp\"\r\n        android:background=\"@android:color\/transparent\"\r\n        android:src=\"@drawable\/eye\"\r\n        app:layout_constraintBottom_toTopOf=\"@+id\/imageButtonCamera\"\r\n        app:layout_constraintEnd_toEndOf=\"parent\"\r\n        app:layout_constraintStart_toEndOf=\"@+id\/editTextWeb\"\r\n        app:layout_constraintTop_toBottomOf=\"@+id\/imageButtonPhone\" \/&gt;\r\n\r\n    &lt;ImageButton\r\n        android:id=\"@+id\/imageButtonCamera\"\r\n        android:layout_width=\"0dp\"\r\n        android:layout_height=\"wrap_content\"\r\n\r\n        android:layout_marginBottom=\"8dp\"\r\n        android:background=\"@android:color\/holo_orange_light\"\r\n        android:src=\"@drawable\/camera\"\r\n        app:layout_constraintBottom_toBottomOf=\"parent\"\r\n        app:layout_constraintEnd_toEndOf=\"parent\"\r\n        app:layout_constraintStart_toStartOf=\"parent\"\r\n        app:layout_constraintTop_toBottomOf=\"@+id\/imageButtonWeb\" \/&gt;\r\n&lt;\/android.support.constraint.ConstraintLayout&gt;\r\n<\/pre>\n<p>Note lo siguiente:<\/p>\n<ol>\n<li>Utilizo un <em>EditText<\/em> con un inputType=\u201cphone\u201d, lo que permite al usuario utilizar el teclado num\u00e9rico para teclear un n\u00famero telef\u00f3nico. Su id es editTextPhone.<\/li>\n<li>Utilizo un <em>ImageButton<\/em> al que le he colocado la imagen de un tel\u00e9fono usando src=\u201c@drawable\/phone\u201d (debe existir un archivo phone.png en la carpeta drawable. El id de este bot\u00f3n es imageButtonPhone.<\/li>\n<li>Creo otros componentes que utilizar\u00e9 m\u00e1s adelante.<\/li>\n<\/ol>\n<p>En mi archivo <em>ThirdActivity.java<\/em> utilizo el siguiente c\u00f3digo:<\/p>\n<pre class=\"lang:java decode:true \">package com.example.gibgarcia.practica4;\r\n\r\nimport android.Manifest;\r\nimport android.content.Intent;\r\nimport android.content.pm.PackageManager;\r\nimport android.net.Uri;\r\nimport android.os.Build;\r\nimport android.support.annotation.NonNull;\r\nimport android.support.v4.app.ActivityCompat;\r\nimport android.support.v7.app.AppCompatActivity;\r\nimport android.os.Bundle;\r\nimport android.view.View;\r\nimport android.widget.EditText;\r\nimport android.widget.ImageButton;\r\nimport android.widget.Toast;\r\n\r\npublic class ThirdActivity extends AppCompatActivity {\r\n    private EditText editTextPhone;\r\n    private EditText editTextWeb;\r\n    private ImageButton imgBtnPhone;\r\n    private ImageButton imgBtnWeb;\r\n    private ImageButton imgBtnCamera;\r\n\r\n    private final int TEL_COD = 100;\r\n\r\n    @Override\r\n    protected void onCreate(Bundle savedInstanceState) {\r\n        super.onCreate(savedInstanceState);\r\n        setContentView(R.layout.activity_third);\r\n        editTextPhone = (EditText) findViewById(R.id.editTextPhone);\r\n        editTextWeb = (EditText) findViewById(R.id.editTextWeb);\r\n        imgBtnPhone = (ImageButton) findViewById(R.id.imageButtonPhone);\r\n        imgBtnWeb = (ImageButton) findViewById(R.id.imageButtonWeb);\r\n        imgBtnCamera = (ImageButton) findViewById(R.id.imageButtonCamera);\r\n\r\n        imgBtnPhone.setOnClickListener(new View.OnClickListener() {\r\n            @Override\r\n            public void onClick(View view) {\r\n                String phoneNumber = editTextPhone.getText().toString();\r\n                if (phoneNumber != null){\r\n                    if (Build.VERSION.SDK_INT &gt;= Build.VERSION_CODES.M){\r\n                        requestPermissions(new String[]{Manifest.permission.CALL_PHONE}, TEL_COD);\r\n                    } else{\r\n                        OlderVersions(phoneNumber);\r\n\r\n                    }\r\n\r\n                }\r\n            }\r\n\r\n            private void OlderVersions(String phoneNumber){\r\n                Intent intentCall = new Intent(Intent.ACTION_CALL, Uri.parse(\"tel:\"+phoneNumber));\r\n\r\n                int result = checkCallingOrSelfPermission(Manifest.permission.CALL_PHONE);\r\n                if ( result == PackageManager.PERMISSION_GRANTED){\r\n\r\n                startActivity(intentCall);}\r\n                else{\r\n                    Toast.makeText(ThirdActivity.this, \"Acceso no autorizado\", Toast.LENGTH_LONG).show();\r\n\r\n                }\r\n            }\r\n        });\r\n\r\n    }\r\n\r\n\r\n\r\n    @Override\r\n    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {\r\n        switch (requestCode){\r\n            case TEL_COD:\r\n                String permisos = permissions[0];\r\n                int result = grantResults[0];\r\n                if (permisos.equals(Manifest.permission.CALL_PHONE)){\r\n                    if (result == PackageManager.PERMISSION_GRANTED){\r\n                        String phoneNumber = editTextPhone.getText().toString();\r\n                        Intent intentCall = new Intent(Intent.ACTION_CALL, Uri.parse(\"tel:\"+phoneNumber));\r\n                        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE)!= PackageManager.PERMISSION_GRANTED) return;\r\n                           startActivity(intentCall);\r\n\r\n                    }\r\n                    else{\r\n                        Toast.makeText(ThirdActivity.this, \"Acceso no autorizado\", Toast.LENGTH_LONG).show();\r\n                    }\r\n                }\r\n                break;\r\n            default:\r\n                super.onRequestPermissionsResult(requestCode, permissions, grantResults);\r\n                break;\r\n        }\r\n\r\n    }\r\n\r\n    private boolean CheckPermission(String permission){\r\n        int result = this.checkCallingOrSelfPermission(permission);\r\n        return result == PackageManager.PERMISSION_GRANTED;\r\n    }\r\n}\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>Aqu\u00ed se realiza lo siguiente:<\/p>\n<ol>\n<li>Enlazamos los componentes de interfaz gr\u00e1fica xml con objetos de Java:<span class=\"Apple-converted-space\">\u00a0<\/span><\/li>\n<\/ol>\n<p><span class=\"Apple-converted-space\">\u00a0<\/span><em>editTextPhone = (EditText) findViewById(R.id.editTextPhone);<\/em><\/p>\n<p><em>editTextWeb = (EditText) findViewById(R.id.editTextWeb);<\/em><\/p>\n<p><em>imgBtnPhone = (ImageButton) findViewById(R.id.imageButtonPhone);<\/em><\/p>\n<p><em>imgBtnWeb = (ImageButton) findViewById(R.id.imageButtonWeb);<\/em><\/p>\n<p><em>imgBtnCamera = (ImageButton) findViewById(R.id.imageButtonCamera);<\/em><\/p>\n<p>2. Leemos el n\u00famero telef\u00f3nico y determinamos si est\u00e1 vac\u00edo:<\/p>\n<p><span class=\"Apple-converted-space\">\u00a0<\/span><em>String phoneNumber = editTextPhone.getText().toString();<\/em><\/p>\n<p><em><span class=\"Apple-converted-space\">\u00a0 \u00a0 \u00a0 \u00a0<\/span>if (phoneNumber != null){<\/em><\/p>\n<p>3. Determinamos la versi\u00f3n de Android que utiliza el usuario y de acuerdo a eso llamamos una funci\u00f3n u otra.<\/p>\n<p><em>if (Build.VERSION.SDK_INT &gt;= Build.VERSION_CODES.M){ requestPermissions(new String[]{Manifest.permission.CALL_PHONE}, TEL_COD); } else{ OlderVersions(phoneNumber); }<\/em><\/p>\n<p>4. Para versiones nuevas vemos si la aplicaci\u00f3n cuenta con el permiso para usar el tel\u00e9fono:<span class=\"Apple-converted-space\">\u00a0<\/span><\/p>\n<p><span class=\"Apple-converted-space\">\u00a0 <\/span><em>if (permisos.equals(Manifest.permission.CALL_PHONE)){<\/em><\/p>\n<p>5. Para esto en el archivo AndroidManifest.xml deben existir las siguientes lineas de c\u00f3digo:<\/p>\n<p><span class=\"Apple-converted-space\">\u00a0<\/span><em>&lt;uses-permission android:name=\u00bbandroid.permission.CALL_PHONE\u00bb \/&gt;<\/em><\/p>\n<p><em><span class=\"Apple-converted-space\">\u00a0<\/span>&lt;uses-feature android:name=\u00bbandroid.hardware.telephony\u00bb android:required=\u00bbfalse\u00bb \/&gt;<\/em><\/p>\n<p>6. Si el permiso existe, crea un intent para hacer una llamada telef\u00f3nica, pasando como par\u00e1metro el n\u00famero que el usuario escribi\u00f3.<span class=\"Apple-converted-space\">\u00a0<\/span><\/p>\n<p><em>if (result == PackageManager.PERMISSION_GRANTED){<\/em><\/p>\n<p><em><span class=\"Apple-converted-space\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span>String phoneNumber = editTextPhone.getText().toString();<\/em><\/p>\n<p><em><span class=\"Apple-converted-space\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span>Intent intentCall = new Intent(Intent.ACTION_CALL, Uri.parse(\u201ctel:\u00bb+phoneNumber));<\/em><\/p>\n<p>7. Comprueba nuevamente si el usuario dio permiso y en tal caso, realiza el intent ejecutando la llamada al n\u00famero solicitado.<\/p>\n<p><em>if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE)!= PackageManager.PERMISSION_GRANTED) return;<\/em><\/p>\n<p><em><span class=\"Apple-converted-space\">\u00a0\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span>startActivity(intentCall);<\/em><\/p>\n<p>7. Para versiones m\u00e1s antiguas, el programa \u00fanicamente determina si la aplicaci\u00f3n tiene permiso de hacer uso de la app de tel\u00e9fono, en cuyo caso, realiza la llamada.<\/p>\n<p><em>int result = checkCallingOrSelfPermission(Manifest.permission.CALL_PHONE);<\/em><\/p>\n<p><em><span class=\"Apple-converted-space\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span>if ( result == PackageManager.PERMISSION_GRANTED){<\/em><\/p>\n<p><em><span class=\"Apple-converted-space\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span>startActivity(intentCall);}<\/em><\/p>\n<p>&nbsp;<\/p>\n<p>Nuestra app debe realizar lo siguiente:<\/p>\n<div id=\"attachment_1561\" style=\"width: 230px\" class=\"wp-caption alignnone\"><a href=\"http:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2018\/09\/intentimplicito.gif\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-1561\" class=\"size-full wp-image-1561\" src=\"http:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2018\/09\/intentimplicito.gif\" alt=\"App que realiza un intent impl\u00edcito\" width=\"220\" height=\"364\" \/><\/a><p id=\"caption-attachment-1561\" class=\"wp-caption-text\">App que realiza un intent impl\u00edcito<\/p><\/div>\n<p>&nbsp;<\/p>\n<h3>Referencias<\/h3>\n<ol>\n<li>Android.com (2018). <a href=\"https:\/\/developer.android.com\/guide\/components\/intents-filters?hl=es-419\"><strong>Intents y filtros de intents<\/strong><\/a>. Disponible en [https:\/\/developer.android.com\/guide\/components\/intents-filters?hl=es-419]<\/li>\n<\/ol>\n","protected":false},"excerpt":{"rendered":"<p>Crea tu propia aplicaci\u00f3n que hace uso del tel\u00e9fono en Android, y aprende a utilizar un intent impl\u00edcito en Android, hacer uso de permisos en tu aplicaci\u00f3n m\u00f3vil, y diferenciar entre versiones de Android.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"amp_status":"","footnotes":""},"categories":[234],"tags":[198,235,237],"class_list":["post-1556","post","type-post","status-publish","format-standard","hentry","category-aplicaciones-moviles","tag-android","tag-desarrollo-de-aplicaciones-moviles","tag-intents"],"_links":{"self":[{"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/posts\/1556","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/comments?post=1556"}],"version-history":[{"count":6,"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/posts\/1556\/revisions"}],"predecessor-version":[{"id":1576,"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/posts\/1556\/revisions\/1576"}],"wp:attachment":[{"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/media?parent=1556"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/categories?post=1556"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/tags?post=1556"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}