Naps Tecnología y educación

Intent implícito: Aplicación que realiza una llamada telefónica en Android

Crea tu propia aplicación que hace uso del teléfono en Android, y aprende a utilizar un intent implícito en Android, hacer uso de permisos en tu aplicación móvil, y diferenciar entre versiones de Android.

Intent implícito: Aplicación que realiza una llamada telefónica en Android

Un intent implícito es una acción que invoca cualquier aplicación que el dispositivo puede utilizar para realizar una determinada función. Por ejemplo, no es necesario crear código propio para hacer una llamada telefónica, en vista de que Android tiene ya una aplicación para el Teléfono. En vez de eso, podemos enviar la orden de abrir la aplicación teléfono y pasarle el número que desamos marcar, considerando que el usuario puede o no dar permiso para utilizar la app del teléfono.

Vamos a realizar lo siguiente:

  1. Crear una interfaz de usuario donde se ingrese un número telefónico y se pulse un botón para hacer la llamada.
  2. Codificar una función de escucha para saber cuándo fue pulsado el botón.
  3. Determinar la versión de Android (esto es necesario pues en versiones nuevas hay cambios en la forma de autorizar a la aplicación el uso de la app de teléfono).
  4. Crear un intent de llamada telefónica.
  5. Determinar si el usuario ha autorizado el uso de la app de teléfono.
  6. Ejecutar el intent.

Esta es la interfaz que deseamos realizar:

Interfaz para la aplicación que ejecuta un intent implícito en Android

Para esto creamos un nuevo Activity en blanco. Yo lo he nombrado ThirdActivity, por lo que dispongo del archivo activity_third.xml en el que he trabajado el siguiente código:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.gibgarcia.practica4.ThirdActivity"
    tools:layout_editor_absoluteY="81dp">

    <EditText
        android:id="@+id/editTextPhone"
        android:layout_width="206dp"
        android:layout_height="59dp"
        android:layout_marginEnd="8dp"
        android:layout_marginStart="48dp"
        android:layout_marginTop="8dp"
        android:ems="10"
        android:inputType="phone"
        app:layout_constraintEnd_toStartOf="@+id/imageButtonPhone"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <ImageButton
        android:id="@+id/imageButtonPhone"
        android:layout_width="29dp"
        android:layout_height="39dp"
        android:layout_marginBottom="9dp"
        android:layout_marginEnd="59dp"
        android:layout_marginTop="8dp"
        android:background="@android:color/transparent"
        android:src="@drawable/phone"
        app:layout_constraintBottom_toTopOf="@+id/imageButtonWeb"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toEndOf="@+id/editTextPhone"
        app:layout_constraintTop_toTopOf="parent" />

    <EditText
        android:id="@+id/editTextWeb"
        android:layout_width="217dp"
        android:layout_height="47dp"
        android:layout_marginEnd="8dp"
        android:layout_marginStart="48dp"
        android:ems="10"
        android:inputType="text"
        android:text=""
        app:layout_constraintEnd_toStartOf="@+id/imageButtonWeb"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="@+id/imageButtonWeb" />

    <ImageButton
        android:id="@+id/imageButtonWeb"
        android:layout_width="30dp"
        android:layout_height="45dp"
        android:layout_marginBottom="362dp"
        android:layout_marginEnd="54dp"
        android:background="@android:color/transparent"
        android:src="@drawable/eye"
        app:layout_constraintBottom_toTopOf="@+id/imageButtonCamera"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toEndOf="@+id/editTextWeb"
        app:layout_constraintTop_toBottomOf="@+id/imageButtonPhone" />

    <ImageButton
        android:id="@+id/imageButtonCamera"
        android:layout_width="0dp"
        android:layout_height="wrap_content"

        android:layout_marginBottom="8dp"
        android:background="@android:color/holo_orange_light"
        android:src="@drawable/camera"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/imageButtonWeb" />
</android.support.constraint.ConstraintLayout>

Note lo siguiente:

  1. Utilizo un EditText con un inputType=“phone”, lo que permite al usuario utilizar el teclado numérico para teclear un número telefónico. Su id es editTextPhone.
  2. Utilizo un ImageButton al que le he colocado la imagen de un teléfono usando src=“@drawable/phone” (debe existir un archivo phone.png en la carpeta drawable. El id de este botón es imageButtonPhone.
  3. Creo otros componentes que utilizaré más adelante.

En mi archivo ThirdActivity.java utilizo el siguiente código:

package com.example.gibgarcia.practica4;

import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Build;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.Toast;

public class ThirdActivity extends AppCompatActivity {
    private EditText editTextPhone;
    private EditText editTextWeb;
    private ImageButton imgBtnPhone;
    private ImageButton imgBtnWeb;
    private ImageButton imgBtnCamera;

    private final int TEL_COD = 100;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_third);
        editTextPhone = (EditText) findViewById(R.id.editTextPhone);
        editTextWeb = (EditText) findViewById(R.id.editTextWeb);
        imgBtnPhone = (ImageButton) findViewById(R.id.imageButtonPhone);
        imgBtnWeb = (ImageButton) findViewById(R.id.imageButtonWeb);
        imgBtnCamera = (ImageButton) findViewById(R.id.imageButtonCamera);

        imgBtnPhone.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String phoneNumber = editTextPhone.getText().toString();
                if (phoneNumber != null){
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
                        requestPermissions(new String[]{Manifest.permission.CALL_PHONE}, TEL_COD);
                    } else{
                        OlderVersions(phoneNumber);

                    }

                }
            }

            private void OlderVersions(String phoneNumber){
                Intent intentCall = new Intent(Intent.ACTION_CALL, Uri.parse("tel:"+phoneNumber));

                int result = checkCallingOrSelfPermission(Manifest.permission.CALL_PHONE);
                if ( result == PackageManager.PERMISSION_GRANTED){

                startActivity(intentCall);}
                else{
                    Toast.makeText(ThirdActivity.this, "Acceso no autorizado", Toast.LENGTH_LONG).show();

                }
            }
        });

    }



    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        switch (requestCode){
            case TEL_COD:
                String permisos = permissions[0];
                int result = grantResults[0];
                if (permisos.equals(Manifest.permission.CALL_PHONE)){
                    if (result == PackageManager.PERMISSION_GRANTED){
                        String phoneNumber = editTextPhone.getText().toString();
                        Intent intentCall = new Intent(Intent.ACTION_CALL, Uri.parse("tel:"+phoneNumber));
                        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE)!= PackageManager.PERMISSION_GRANTED) return;
                           startActivity(intentCall);

                    }
                    else{
                        Toast.makeText(ThirdActivity.this, "Acceso no autorizado", Toast.LENGTH_LONG).show();
                    }
                }
                break;
            default:
                super.onRequestPermissionsResult(requestCode, permissions, grantResults);
                break;
        }

    }

    private boolean CheckPermission(String permission){
        int result = this.checkCallingOrSelfPermission(permission);
        return result == PackageManager.PERMISSION_GRANTED;
    }
}

 

Aquí se realiza lo siguiente:

  1. Enlazamos los componentes de interfaz gráfica xml con objetos de Java: 

 editTextPhone = (EditText) findViewById(R.id.editTextPhone);

editTextWeb = (EditText) findViewById(R.id.editTextWeb);

imgBtnPhone = (ImageButton) findViewById(R.id.imageButtonPhone);

imgBtnWeb = (ImageButton) findViewById(R.id.imageButtonWeb);

imgBtnCamera = (ImageButton) findViewById(R.id.imageButtonCamera);

2. Leemos el número telefónico y determinamos si está vacío:

 String phoneNumber = editTextPhone.getText().toString();

       if (phoneNumber != null){

3. Determinamos la versión de Android que utiliza el usuario y de acuerdo a eso llamamos una función u otra.

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){ requestPermissions(new String[]{Manifest.permission.CALL_PHONE}, TEL_COD); } else{ OlderVersions(phoneNumber); }

4. Para versiones nuevas vemos si la aplicación cuenta con el permiso para usar el teléfono: 

  if (permisos.equals(Manifest.permission.CALL_PHONE)){

5. Para esto en el archivo AndroidManifest.xml deben existir las siguientes lineas de código:

 <uses-permission android:name=”android.permission.CALL_PHONE” />

 <uses-feature android:name=”android.hardware.telephony” android:required=”false” />

6. Si el permiso existe, crea un intent para hacer una llamada telefónica, pasando como parámetro el número que el usuario escribió. 

if (result == PackageManager.PERMISSION_GRANTED){

                        String phoneNumber = editTextPhone.getText().toString();

                        Intent intentCall = new Intent(Intent.ACTION_CALL, Uri.parse(“tel:”+phoneNumber));

7. Comprueba nuevamente si el usuario dio permiso y en tal caso, realiza el intent ejecutando la llamada al número solicitado.

if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE)!= PackageManager.PERMISSION_GRANTED) return;

                           startActivity(intentCall);

7. Para versiones más antiguas, el programa únicamente determina si la aplicación tiene permiso de hacer uso de la app de teléfono, en cuyo caso, realiza la llamada.

int result = checkCallingOrSelfPermission(Manifest.permission.CALL_PHONE);

                if ( result == PackageManager.PERMISSION_GRANTED){

                startActivity(intentCall);}

 

Nuestra app debe realizar lo siguiente:

App que realiza un intent implícito

 

Referencias

  1. Android.com (2018). Intents y filtros de intents. Disponible en [https://developer.android.com/guide/components/intents-filters?hl=es-419]
¿Qué te pareció este artículo?
  • Poco informativo ()
  • No era lo que buscaba ()
  • Regular ()
  • Interesante ()
  • Excelente ()
(Visto 3.215 veces)

Tu comentario

opiniones