Sunday, June 15, 2014

Use app to dial into conference call automatically on Android device

Mobile device is so widely used in the population. User can setup exchange mail account on the device, and sync the corporate emails, calendar events including the conferences calls.

Traditionally when people dial into the conference, they need to type in the phone numbers, pin, and password. It is not very easy for people to remember these numbers, and sometimes when people type the numbers on the virtual dial pad, they could make mistake, as a result they have to dial again.

One solution for this issue is to use the so called "one-click-to-dial-in" approach. The mobile app can dial in to the conference when user clicks on the event. This feature has been implemented in early mobile platforms such as Blackberry and iOS. The Android platform does not provide this feature in its build-in feature. User either to write the app or install the app developed by others, and there are bunches of apps claim to have this feature implemented.

However due to patent issues among the vendors of mobile platforms and among OEMs and mobile platform owners, it is not easy to do it on Android platform.

Basically, like mentioned above, there are 3 parts in the dialing numbers -
1. the conference call phone number, the bridge
2. the conference id or the meeting id
3. the password, or the attendee id
Some conference call service vendors also ask user to press the # keys.

In Android platform, developer can use the Intent to make a phone call.
Intent callIntent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + Uri.encode(callString));callIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);context.startActivity(callIntent); 
The callString  contains the dialing numbers.

For simple calls, the callString contains the phone numbers, for example, 9732581301, and there is not problem for the call to go through.

It becomes a little bit complicated when dealing with the conference call. The callString needs to contains all the numbers xxxxxxxxxx yyyyyyyyy zzzz, where xxxxxxxxxx is the conference call phone number (bridge), yyyyyyyyy is the conference/meeting id, and zzzz is the password or attendee id.

The problem is how to put these parts together. Generally it is suggested that pause(s) is needed between these 3 parts. The pause is represented by ",", it is about 2 seconds. The the dialing string would looks like 8889991111,,,732596101,,,8901. When we consider that the conference call service would ask user to press 3 key after the pin (meeting id number) is passed to the system, the calling string needs to be changed to 8889991111,,,732596101#,,,8901#.

In my test cases, when this format is used to call in conference by the app, the call could go through sometimes, and sometimes the bridge number or the pin or the meeting number could not be recognized by the conference system, and the dial in failed.

There is a thread in bug report/feature request board at google.com, it talks about issue related to the problem above. The thread was started in 2010, the last post was March 2014, the total posts is around 120. There seems to be no good solution.

One app in Google Play store says it is aiming to solve this issue. From the toast string values shown when the app makes conference call, it looks like the app is using the format of
xxxxxxxxxx,yyyyyyyyy#**,,zzzz#1

By using this format, most of the time, the call could go through. The problem is all the numbers mentioned above are passed to the conference call system in one shot. This cause the phone to generate tones like the call has been hung up, the dial tones of the bridge number (pin, meeting id) can not be heard clearly.

In a blog http://blogs.technet.com/b/lync/archive/2010/09/22/setting-up-your-speed-dial-to-quickly-amp-automatically-call-into-your-meetings.aspx, it is said the format would look like
18001231234,,,{confID+#},,,*,*,{yourExtensionOrFullPhoneNumber+#},,{yourPIN+#}
I have not tested it, and am not sure if it would work.

However, I believe that one generic dial string format can not be applied to all devices on the market. Developer needs to test and use the proper dialing format for the devices, which means the program needs to get the device information, such as manufacturer, model, brand, carrier and country or region, then apply the format that works on the device. 

From my tests on different devices, I feel the issue may also related to the conference service providers, and the state of the service, such as workload of the service provider's servers, network traffic and network delays.

The possible ways to make the dialing strings work stable maybe rely on using the hidden telephony and network APIs in Android framework. I would look into this and update here later.


I got time to look into the dialing issue again. I manually played the dialing strings a some popular devices on the market, trying to simulate human dialing behavior, tricking the system think a real human is dialing, or let the code try its best to mimic the human dialing behavior.

For example, when dialing the numbers on the keypad, human usually dial 3 digits or 4 digits at one time, then dial 3 or 4 digits again to complete the whole dialing numbers.

Base on this pattern, the meeting id can be divided into several parts separated by a pause:
7325961010 => 732,596,101, or 7325,9610,1,

This solution works on most of the android devices I tested.

Hope the update above help.

No comments: