¿Cómo hacer una llamada telefónica mediante programación?


123

Estoy pasando a una actividad el número para llamar por un paquete

y luego, en dicha actividad, tengo un botón para llamar a ese número, este es el código:

callButton.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse(bundle.getString("mobilePhone")));
            }
        }); 

Algo está mal, porque cuando presiono el botón no pasa nada ...

¿Qué estoy haciendo mal?

PD: Estoy usando un proyecto compatible con Android 1.5 ... ¿tal vez la llamada telefónica es incompatible con 1.5?


pls pegue logcat o / p o elabore los detalles de su error
chikka.anddev

Respuestas:


259

Olvidó llamar a startActivity. Debe tener un aspecto como este:

Intent intent = new Intent(Intent.ACTION_CALL);

intent.setData(Uri.parse("tel:" + bundle.getString("mobilePhone")));
context.startActivity(intent);

Una intención en sí misma es simplemente un objeto que describe algo. No hace nada

No olvides agregar los permisos relevantes a tu manifiesto:

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

Hola @Lior, ¿cómo podría hacerlo en caso de que el dispositivo tenga doble sim. ¿Es posible hacer llamadas a través de un sim en particular?
Dinash

3
@Dinash: Echa un vistazo a esta pregunta ya respondida: stackoverflow.com/questions/13231962/call-from-second-sim
Lior

He usado el mismo código pero no funciona en el Galaxy S7 edge. Este es mi código Intent intentCall = new Intent (Intent.ACTION_CALL); Cadena uri = "tel:" + número.trim (); intentCall.setData (Uri.parse (uri)); if (ActivityCompat.checkSelfPermission (getApplicationContext (), Manifest.permission.CALL_PHONE) == PackageManager.PERMISSION_GRANTED) {startActivity (intentCall); }
AngelJanniee

¿Se puede usar este simulador para hacer llamadas sin dispositivo físico
User3754136

24

Probé esto en mi teléfono y funciona perfectamente.

Intent intent = new Intent(Intent.ACTION_CALL);
intent.setData(Uri.parse("tel:900..." ));
startActivity(intent);

Agregue este permiso en el archivo de manifiesto.

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

1
número es como 1689, 3,2,1,1. Recibo un problema, será solo 1689 ... Por favor, ayúdenme si tienen alguna solución para lo mismo.
Teraiya Mayur

@TeraiyaMayur puede eliminar primero cualquier carácter no numérico. Entonces, si tiene un número de teléfono como lo String number = "1689,,3,2,1,1haganubmer = "tel:" + number.replaceAll("[^0-9]", "");
camine el

@Walk, un problema es que queremos llamar con símbolos especiales como ,*. Deben estar entre dígitos. En un emulador funciona bien, pero en un dispositivo suelta símbolos y dígitos adicionales.
CoolMind

13
 Intent callIntent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:"+198+","+1+","+1)); 
             startActivity(callIntent);

para múltiples llamadas ordenadas

Esto se usa para los sistemas de llamadas DTMF. Si la llamada se interrumpe, debe pasar más "," entre los números.


Dwivedi Ji: el número es como 1689, 3,2,1,1. Recibo un problema, será solo 1689 ... Por favor, ayúdenme si tienen alguna solución para lo mismo.
Teraiya Mayur

@TeraiyaMayur, depende del sistema de llamadas IVRS. Su trabajo para mí debido a mi llamada de extinción de apoyo toma una respuesta temprana.
Dwivedi Ji

Sí, tienes razón, también obtengo un número de IVR válido y funciona bien. gracias
Teraiya Mayur

6

En la respuesta seleccionada, no se verifica el permiso de malvavisco. No funcionará directamente en malvavisco 6.0 o superior dispositivo.

Sé que llego demasiado tarde, pero esta pregunta tiene un gran voto, así que pensé que ayudará a otros en el futuro.

En los dispositivos de malvavisco, debemos tomar el permiso de tiempo de ejecución para la llamada ...

Aquí hay un ejemplo para hacer una llamada en malvavisco o superior.

Cómo hacer una llamada en android marshmallow 6.0 o superior



2

Aquí te mostraré cómo puedes hacer una llamada telefónica desde tu actividad. Para realizar una llamada, debe colocar este código en su aplicación.

try {
    Intent my_callIntent = new Intent(Intent.ACTION_CALL);
    my_callIntent.setData(Uri.parse("tel:"+phn_no));
    //here the word 'tel' is important for making a call...
    startActivity(my_callIntent);
} catch (ActivityNotFoundException e) {
    Toast.makeText(getApplicationContext(), "Error in your phone call"+e.getMessage(), Toast.LENGTH_LONG).show();
}

1
@ Astor lo he definido muy claramente, y ya he obtenido puntos a través de esto, lo que significa que mi respuesta es algo mejor que la otra para algunas personas.
Pir Fahim Shah

2

Esto no requiere un permiso.

val intent = Intent(Intent.ACTION_DIAL, Uri.parse("tel:+123456"))
startActivity(intent)

O

val intent = Intent(Intent.ACTION_DIAL, Uri.fromParts("tel", "+123456", null))
startActivity(intent)

Pero muestra un cuadro de diálogo más (preguntando si desea llamar al teléfono solo una vez o siempre). Por lo tanto, sería mejor usarlo ACTION_CALLcon un permiso (consulte Permiso revocado android.permission.CALL_PHONE ).


0
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main); 
   final Button button = (Button) findViewById(R.id.btn_call);
    button.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            String mobileNo = "123456789";
            String uri = "tel:" + mobileNo.trim();
            Intent intent = new Intent(Intent.ACTION_CALL);
            intent.setData(Uri.parse(uri));
            startActivity(intent);
        }
    });*
 }

0

Si alguien está buscando en Kotlin

    val  uri = "tel:+800******"
    val call_customer_service = Intent(Intent.ACTION_CALL)
    call_customer_service.setData(Uri.parse(uri))
    startActivity(call_customer_service)

Al igual que algunas otras soluciones, requiere android.permission.CALL_PHONEpermiso.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.