Руководство Android Phone Call
View more Tutorials:
В Android, вам легко создать звонок из своего приложения, создав неявный Intent ACTION_CALL и отправить на систему, запросить запуск приложения звонка, имеющийся в системе.
Intent callIntent = new Intent(Intent.ACTION_CALL); callIntent.setData(Uri.parse("tel:" + phoneNumber)); startActivity(callIntent);
Просмотр примера:

На Android Studio создайте project:
- File > New > New Project > Empty Activity
- Name: PhoneCallExample
- Package name: org.o7planning.phonecallexample
- Language: Java
Ваше приложение должно разрешать выполнять звонки, поэтому нужно добавить следующий код в AndroidManifest.xml файл:
<uses-permission android:name="android.permission.CALL_PHONE" />
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="org.o7planning.phonecallexample"> <uses-permission android:name="android.permission.CALL_PHONE" /> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
Помимо этого, из Android 6.0 (API Level 23) приложение желающее выполнить звонок, должно иметь разрешение пользователя, поэтому в приложении вам нужны еще некоторые действия обработки (Смотрите в коде примера).
Интерфейс приложения:

activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.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=".MainActivity"> <EditText android:id="@+id/editText_phoneNumber" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="16dp" android:layout_marginLeft="16dp" android:layout_marginTop="32dp" android:layout_marginEnd="16dp" android:layout_marginRight="16dp" android:ems="10" android:gravity="center" android:inputType="phone" android:text="+15555219999" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <Button android:id="@+id/button_call" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="16dp" android:text="Call by Intent.ACTION_CALL" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/editText_phoneNumber" /> </androidx.constraintlayout.widget.ConstraintLayout>
MainActivity.java
package org.o7planning.phonecallexample; import androidx.appcompat.app.AppCompatActivity; import androidx.core.app.ActivityCompat; import android.Manifest; import android.annotation.SuppressLint; import android.content.Intent; import android.content.pm.PackageManager; import android.net.Uri; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; public class MainActivity extends AppCompatActivity { private static final int MY_PERMISSION_REQUEST_CODE_CALL_PHONE = 555; private static final String LOG_TAG = "AndroidExample"; private EditText editTextPhoneNumber; private Button buttonCall; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); this.editTextPhoneNumber = (EditText) this.findViewById(R.id.editText_phoneNumber); this.buttonCall = (Button) this.findViewById(R.id.button_call); this.buttonCall.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { askPermissionAndCall(); } }); } private void askPermissionAndCall() { // With Android Level >= 23, you have to ask the user // for permission to Call. if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) { // 23 // Check if we have Call permission int sendSmsPermisson = ActivityCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE); if (sendSmsPermisson != PackageManager.PERMISSION_GRANTED) { // If don't have permission so prompt the user. this.requestPermissions( new String[]{Manifest.permission.CALL_PHONE}, MY_PERMISSION_REQUEST_CODE_CALL_PHONE ); return; } } this.callNow(); } @SuppressLint("MissingPermission") private void callNow() { String phoneNumber = this.editTextPhoneNumber.getText().toString(); Intent callIntent = new Intent(Intent.ACTION_CALL); callIntent.setData(Uri.parse("tel:" + phoneNumber)); try { this.startActivity(callIntent); } catch (Exception ex) { Toast.makeText(getApplicationContext(),"Your call failed... " + ex.getMessage(), Toast.LENGTH_LONG).show(); ex.printStackTrace(); } } // When you have the request results @Override public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); // switch (requestCode) { case MY_PERMISSION_REQUEST_CODE_CALL_PHONE: { // Note: If request is cancelled, the result arrays are empty. // Permissions granted (CALL_PHONE). if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { Log.i( LOG_TAG,"Permission granted!"); Toast.makeText(this, "Permission granted!", Toast.LENGTH_LONG).show(); this.callNow(); } // Cancelled or denied. else { Log.i( LOG_TAG,"Permission denied!"); Toast.makeText(this, "Permission denied!", Toast.LENGTH_LONG).show(); } break; } } } // When results returned @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == MY_PERMISSION_REQUEST_CODE_CALL_PHONE) { if (resultCode == RESULT_OK) { // Do something with data (Result returned). Toast.makeText(this, "Action OK", Toast.LENGTH_LONG).show(); } else if (resultCode == RESULT_CANCELED) { Toast.makeText(this, "Action Cancelled", Toast.LENGTH_LONG).show(); } else { Toast.makeText(this, "Action Failed", Toast.LENGTH_LONG).show(); } } } }