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.
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:
Esta es la interfaz que deseamos realizar:
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:
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:
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: