Android Phone Call User Interface - Change

How to change phone call user interface? As I have my own dialer layout and contacts layout, but how to change the calling interface. So, when the call continues, is it possible, for example, to remove the speaker button?

Here is my dialer script I created: Dialog Image

But I do not know how to edit this screen: Calling Picture

EDIT: I already created a user interface, I just can’t display it during a call!

Here is the code for a simpler version:

public class MainActivity extends Activity { private Button callBtn; private Button dialBtn; private EditText number; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); number = (EditText) findViewById(R.id.phoneNumber); callBtn = (Button) findViewById(R.id.call); dialBtn = (Button) findViewById(R.id.dial); // add PhoneStateListener for monitoring MyPhoneListener phoneListener = new MyPhoneListener(); TelephonyManager telephonyManager = (TelephonyManager) this.getSystemService(Context.TELEPHONY_SERVICE); // receive notifications of telephony state changes telephonyManager.listen(phoneListener,PhoneStateListener.LISTEN_CALL_STATE); callBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { try { // set the data String uri = "tel:"+number.getText().toString(); Intent callIntent = new Intent(Intent.ACTION_CALL, Uri.parse(uri)); startActivity(callIntent); }catch(Exception e) { Toast.makeText(getApplicationContext(),"Your call has failed...", Toast.LENGTH_LONG).show(); e.printStackTrace(); } } }); dialBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { try { String uri = "tel:"+number.getText().toString(); Intent dialIntent = new Intent(Intent.ACTION_DIAL, Uri.parse(uri)); startActivity(dialIntent); }catch(Exception e) { Toast.makeText(getApplicationContext(),"Your call has failed...", Toast.LENGTH_LONG).show(); e.printStackTrace(); } } }); } private class MyPhoneListener extends PhoneStateListener { private boolean onCall = false; @Override public void onCallStateChanged(int state, String incomingNumber) { switch (state) { case TelephonyManager.CALL_STATE_RINGING: // phone ringing... Toast.makeText(MainActivity.this, incomingNumber + " calls you", Toast.LENGTH_LONG).show(); break; case TelephonyManager.CALL_STATE_OFFHOOK: // one call exists that is dialing, active, or on hold Toast.makeText(MainActivity.this, "on call...", Toast.LENGTH_LONG).show(); //because user answers the incoming call onCall = true; break; case TelephonyManager.CALL_STATE_IDLE: // in initialization of the class and at the end of phone call // detect flag from CALL_STATE_OFFHOOK if (onCall == true) { Toast.makeText(MainActivity.this, "restart app after call", Toast.LENGTH_LONG).show(); // restart our application Intent restart = getBaseContext().getPackageManager(). getLaunchIntentForPackage(getBaseContext().getPackageName()); restart.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(restart); onCall = false; } break; default: break; } } } } 

Thanks!

+8
source share
5 answers

Add call permission in manifest

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

Then you need to check if the call button is pressed. for this use below the target filter

 <intent-filter> <action android:name="android.intent.action.CALL_BUTTON" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> 

and when starting the user interface

 <intent-filter> <action android:name="android.intent.action.VIEW" /> <action android:name="android.intent.action.DIAL" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="tel" /> </intent-filter> 

this means that your calling activity in the manifest will look something like this.

 <activity android:name="com.example.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <!-- open activity when establishing a call --> <intent-filter> <action android:name="android.intent.action.CALL_PRIVILEGED" /> <category android:name="android.intent.category.DEFAULT" /> <data android:scheme="tel" /> </intent-filter> </activity> 
+6
source

since API 23 is possible, see Replacing the default Phone app on Android 6 and 7 with InCallService arekolek .

Kotlin Version: Simple Phone

Java Version: Simple Phone Dialer

EDIT

As recommended, the following is the simplest version of Java.

The following is a manifest with the necessary intent-filter .

 <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.aliton.customphonecall"> <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> <activity android:name=".DialerActivity" > <intent-filter> <!-- Handle links from other applications --> <action android:name="android.intent.action.VIEW" /> <action android:name="android.intent.action.DIAL" /> <!-- Populate the system chooser --> <category android:name="android.intent.category.DEFAULT" /> <!-- Handle links in browsers --> <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="tel" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.DIAL" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity> <service android:name=".CallService" android:permission="android.permission.BIND_INCALL_SERVICE"> <meta-data android:name="android.telecom.IN_CALL_SERVICE_UI" android:value="true" /> <intent-filter> <action android:name="android.telecom.InCallService" /> </intent-filter> </service> <activity android:name=".CallActivity"></activity> </application> </manifest> 

MainActivity just has a Button with an Intent redirecting to DialerActivity .

Below DialerActivity . In this exercise, you will install the default application to make calls using the user interface.

 public class DialerActivity extends AppCompatActivity { private static final int REQUEST_CALL_PHONE = 10; EditText phoneNumber; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_dialer); phoneNumber = (EditText) findViewById(R.id.etNumber); Button bCall = (Button) findViewById(R.id.btnCall); offerReplacingDefaultDialer(); bCall.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { makeCall(); } }); } private void makeCall() { if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) == PackageManager.PERMISSION_GRANTED) { Uri uri = Uri.parse("tel:"+phoneNumber.getText().toString().trim()); Intent Call = new Intent(Intent.ACTION_CALL, uri); //Toast.makeText(this, "Entered makeCall()", Toast.LENGTH_SHORT).show(); Log.i("debinf Dialer", "Entered makeCall()"); startActivity(Call); } else { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CALL_PHONE}, REQUEST_CALL_PHONE); } } private void offerReplacingDefaultDialer() { if (getSystemService(TelecomManager.class).getDefaultDialerPackage() != getPackageName()) { Intent ChangeDialer = new Intent(TelecomManager.ACTION_CHANGE_DEFAULT_DIALER); ChangeDialer.putExtra(TelecomManager.EXTRA_CHANGE_DEFAULT_DIALER_PACKAGE_NAME, getPackageName()); startActivity(ChangeDialer); } } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == REQUEST_CALL_PHONE) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { makeCall(); } else { Toast.makeText(this, "calling permission denied", Toast.LENGTH_LONG).show(); } //return; } } } 

This is how InCallService implemented to manage calls.

 public class CallService extends InCallService { OngoingCallObject ongoingCallObject; @Override public void onCallAdded(Call call) { super.onCallAdded(call); new OngoingCallObject().setCall(call); //Intent CallAct = new Intent(this, CallActivity.class); //startActivity(CallAct); CallActivity.start(this, call); } @Override public void onCallRemoved(Call call) { super.onCallRemoved(call); new OngoingCallObject().setCall(null); } } 

Here's how the object is implemented.

 public class OngoingCallObject { private static Call call; private Object callback = new Callback() { @Override public void onStateChanged(Call call, int state) { super.onStateChanged(call, state); Log.i("debinf OngoingObj", "state is "+state); } }; public void setCall(Call call) { if (this.call != null) { this.call.unregisterCallback((Call.Callback)callback); } if (call != null) { call.registerCallback((Call.Callback)callback); Log.i("debinf OngoingObj", "call.getState() is "+call.getState()); } this.call = call; } public void answer() { //assert this.call != null; if (this.call != null) { this.call.answer(VideoProfile.STATE_AUDIO_ONLY); } } public void hangup() { //assert this.call != null; if (this.call != null) { this.call.disconnect(); } } } 

And finally, CallActivity where you launch your user interface.

 public class CallActivity extends AppCompatActivity { TextView callInfo; Button answer, hangup; private String number; private OngoingCallObject ongoingCall; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_call); ongoingCall = new OngoingCallObject(); answer = (Button) findViewById(R.id.answer); hangup = (Button) findViewById(R.id.hangup); callInfo = (TextView) findViewById(R.id.callInfo); number = Objects.requireNonNull(getIntent().getData().getSchemeSpecificPart()); callInfo.setText("Calling number : "+number); answer.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //Toast.makeText(CallActivity.this, "Answer button", Toast.LENGTH_SHORT).show(); ongoingCall.answer(); } }); hangup.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { ongoingCall.hangup(); } }); } public static void start(Context context, Call call) { Intent intent = new Intent(context, CallActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.setData(call.getDetails().getHandle()); context.startActivity(intent); } } 

Here is the XML for DialerActivity : activity_dialer.xml

 <RelativeLayout 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=".DialerActivity"> <EditText android:id="@+id/etNumber" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Tel number"/> <Button android:id="@+id/btnCall" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="8dp" android:text="CallActivity" android:layout_below="@+id/etNumber" /> </RelativeLayout> 

Here is the XML for CallActivity : activity_call.xml

 <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=".CallActivity"> <TextView android:id="@+id/callInfo" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="0.3" tools:text="Hello World!" /> <Button android:id="@+id/answer" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Answer" app:layout_constraintBaseline_toBaselineOf="@+id/hangup" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toEndOf="@+id/hangup" /> <Button android:id="@+id/hangup" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hang up" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toStartOf="@+id/answer" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/callInfo" /> </android.support.constraint.ConstraintLayout> 

I hope this helps!

+1
source

The actual caller view (what you see during the calls) can be changed.

To be more specific, some parts of Android cannot be redefined, the android has its own kernel, and the developers we have limited access to this kernel. In your case, you can override the dialer , but you cannot override the actual viewing of phone calls .

You can’t do anything until the Android development team decides to share this core function with us (the developers).

0
source

Thank you for a good example of creating a phone dialer,

but can you help me show the latest call logs using the dialer using the new Google policy ( https://support.google.com/googleplay/android-developer/answer/9047303?hl=en )

0
source

Create your own user interface for dialing. Check out this one . You will need an Activity to process the intent, and then displaying the user interface is your business.

-1
source

Source: https://habr.com/ru/post/1241909/


All Articles