I'm trying to make a new PhoneAccount to use my implementation of ConnectionService. In the documentation it says I need to register a new PhoneAccount with TelecomManager and then select it in my phone-app's settings.
Here's my code:
TelecomManager telecomManager = (TelecomManager) getSystemService(Context.TELECOM_SERVICE);
ComponentName componentName = newComponentName("se.example.connectionservicestandalonetest", "se.example.connectionservicestandalonetest.MyConnectionService");
PhoneAccountHandle phoneAccountHandle = new PhoneAccountHandle(componentName, "Admin");
PhoneAccount phoneAccount = PhoneAccount.builder(phoneAccountHandle, "Admin").build();
telecomManager.registerPhoneAccount(phoneAccount);
As you can see, it creates a new ComponentName that points towards my implementation of ConnectionService, then creates a new PhoneAccountHandle where I supply the ComponentName and a unique account-name. I then supply the PhoneAccountHandle in the PhoneAccount buildes, as well as label (a name?), to create a new PhoneAccount. Lastly I register the account in the telecomManager.
When I open up the phone app, nothing has changed. I see no where I could possibly change the PhoneAccount... Any ideas?
Thanks!
I've got some information that I'll just leave here for posterity.
When building your PhoneAccount
, you must add CAPABILITY_CALL_PROVIDER
if you make and receive calls on your own, or CAPABILITY_CONNECTION_MANAGER
if you want to make or receive calls using the builtin PhoneAccount
. Without either, you won't show up in the UI.
As far as I can tell, there is no dedicated API for checking whether the user has enabled your PhoneAccount
. However, you can use TelecomManager
.addNewIncomingCall
for this purpose. Simply provide a Bundle
containing a boolean extra (named whatever you want) and set that boolean to true
if you're really receiving a call or false
if you just want to do a permission check (or vice-versa). Then your implementation of ConnectionService
.onCreateIncomingConnection
can check your extra and return Connection
.createCanceledConnection
if you're just doing a permission check. This does not register as a call in the call log, and the ringtone never plays. addNewIncomingCall
will throw if your PhoneAccount
is not enabled, and succeed if it is.
As noted in the comments above, you can prompt the user to enable your PhoneAccount
using TelecomManager
.ACTION_CHANGE_PHONE_ACCOUNTS
. Because the user can enable or disable your PhoneAccount
at any time, all operations that require an enabled PhoneAccount
(like addNewIncomingCall
) should be placed in a try
block.