Replacing default Phone app on Android 6 and 7 with InCallService
The app compiles fine but Default Apps in settings doesn't show my app.
To have your app listed as a Phone app, you must have an activity with at least those intent filters (to handle both cases mentioned in documentation of ACTION_DIAL, also mentioned in DefaultDialerManager hidden class):
<intent-filter>
<action android:name="android.intent.action.DIAL" />
<data android:scheme="tel" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.DIAL" />
</intent-filter>
And to be honest, that's a bit counterintuitive, because setting the default Phone app is separate from setting a default Dialer – the former controls only the ongoing call UI, while the latter controls only the dialing UI.
The above minimum can be improved a bit, to allow setting your dialer as a default, and launching from web browser, by using these intent filters instead:
<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>
The Dialer app in AOSP has even more filters declared.
You can make it easier for the user to set your app as the default Phone app with the help from TelecomManager
:
if (getSystemService(TelecomManager::class.java).defaultDialerPackage != packageName) {
Intent(TelecomManager.ACTION_CHANGE_DEFAULT_DIALER)
.putExtra(TelecomManager.EXTRA_CHANGE_DEFAULT_DIALER_PACKAGE_NAME, packageName)
.let(::startActivity)
}
This will show a dialog similar to this:
Refer to Answer incoming call using android.telecom and InCallService for what you need to do to actually handle the calls themselves.
Here's the code for an app that implements the minimum needed to handle dialing, and accepting/rejecting/ending calls in its own UI:
https://github.com/arekolek/simple-phone
Replacing in call app
According to the docs and as you comment yourself, you need to add this in your manifest:
<service android:name="your.package.YourInCallServiceImplementation"
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>
android:name
must be replaced by the class that implements this service.
<activity android:name="your.package.YourDialerActivity">
<intent-filter>
<action android:name="android.intent.action.DIAL" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
android:name
must be replaced by the class that implements the main activity for your own dialer implementation.
Here you can find more information about this:
https://developer.android.com/guide/topics/connectivity/telecom/selfManagedAnd here's a sample project that you can use as a guide:
https://github.com/arekolek/simple-phoneAnd this: https://stackoverflow.com/a/49835987/1916449
Answer incoming call using android.telecom and InCallService
How do you get notified about, and acquire instances of GSM Calls
First, the user will need to select your app as the default Phone app. Refer to Replacing default Phone app on Android 6 and 7 with InCallService for a way to do that.
You also need to define an InCallService
implementation the system will bind to and notify you about the call:
<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>
There you should handle at least onCallAdded
(set up listeners on Call
, start your UI - activity - for the call) and onCallRemoved
(remove listeners).
How does one answer these calls
If the user wants to answer the call, you need to invoke the method Call#answer(int)
with VideoProfile.STATE_AUDIO_ONLY
for example.
What is the life-cycle of the callbacks on this class
Check out Call.Callback
for events that can happen with a single call.
Does Google provide any actual tutorial for this that I haven't found
I don't know about Google, but you can check out my simplified example https://github.com/arekolek/simple-phone
Related Topics
Android Manifest Restrict to Tablets
How Get Permission for Camera in Android.(Specifically Marshmallow)
Why Getspeed() Always Return 0 on Android
Android Webview Click Open Within Webview Not a Default Browser
Turning on Screen from Receiver/Service
Android Volley to Handle Redirect
Place Imageview Over Button Android
Android Studio: Gradle: Error: Cannot Find Symbol Variable
How to Programmatically Get the List of Registered Users in Firebase
Map Not Getting in Emulator Android API V2
Android Studio Project Structure (V.S. Eclipse Project Structure)
Restrict Edittext to Single Line
Android Preferences: How to Load the Default Values When the User Hasn't Used the Preferences-Screen
Explain the Meaning of Span Flags Like Span_Exclusive_Exclusive
Android Alarmmanager Not Waking Phone Up
Horizontalscrollview: Auto-Scroll to End When New Views Are Added