The plug and play
communication SDK
The most advanced VoIP Softphone
SDK on the market
Acrobits has deployed more than 140 million endpoints across a wide range of devices and operating
systems in just 10 years. Our SDK is the answer to your real-time commercial communications needs.
Meet our developer-friendly SDK
The Acrobits SDK simplifies the entire development process.
- Busy Lamp Field
- Incoming Call
- Number Rewriting
- Conference Calling
Add busy lamp field integration to your real-time communications platform to see whether users are in an active call.
Allow your users to receive incoming calls more easily by integrating our platforms push to receive functionality.
Streamline and automate the dialing out process with our number rewriting capabilities.
Take advantage of our reliable and easy to use conference calling function that lets you invite more users.
-
// Blf status
val dialogInfo = Instance.Registration.getDialogInfo(accountId, uri)
val blfString = if (dialogInfo.busyLamp) "On call" else "Off call"
busyLampStatusLabel.setText(blfString)
// Busy Lamp field iOS
DialogInfo *dialogInfo = Softphone::instance()->registration()->getDialogInfo(uri);
if (dialogInfo) {
if (dialogInfo->busyLamp) {
busyLampStatusLabel.text = NSLocalizedString(@"On Call", nil);
} else {
busyLampStatusLabel.text = NSLocalizedString(@"Off Call", nil);
}
}
- (void)onNewEvent:(Softphone::EventHistory::Event::Pointer)event
{
switch (incomingEvent->eventType)
{
case Softphone::EventHistory::EventType::Call:
{
Softphone::EventHistory::CallEvent::Pointer callEvent = event.asCall();
UNMutableNotificationContent *notification = [[UNMutableNotificationContent alloc] init];
notification.title = @"Groundwire";
notification.body = [NSString stringWithFormat:NSLocalizedString(@"Incoming call from %@", @"notification"), ali::mac::str::to_nsstring(callEvent->getRemoteUser().getDisplayName())];
notification.sound = [UNNotificationSound defaultSound];
UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:[[NSUUID UUID] UUIDString] content:notification trigger:nil];
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
[center addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error)
{
if (!error)
{
// Handle successful notification request
}
}];
}
break;
default:
break;
}
}
-
// OnCall
// ******************************************************************
public void onNewCall(@NonNull CallEvent callEvent) {
val context = AndroidUtil.getContext();
String messageText = "";
Class<?> activity = CallActivity.class;
String activityAction = Activity.ACTION_MAIN;
int notificationId = ID_CALL_IN_PROGRESS;
var extras = new Bundle();
String title = context.getString(R.string.app_name);
Bitmap bitmap = AndroidUtil.getBitmap(R.drawable.icon_notification);
messageText = AndroidUtil.getString(R.string.notification_bullet,
messageText,
callEvent.getAccountName());
Intent intent = new Intent(context, activity)
.setAction(activityAction)
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
.putExtras(extras);
val builder = new NotificationCompat.Builder(context)
.setContentIntent(PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT))
.setContentText(messageText)
.setContentTitle(title)
.setLargeIcon(bitmap);
val notification = builder.build();
val manager = (NotificationManager) AndroidUtil.getSystemService(Context.NOTIFICATION_SERVICE);
manager.notify(notificationId, notification);
}
- (void)onNewEvent:(Softphone::EventHistory::Event::Pointer)event
{
switch (incomingEvent->eventType)
{
case Softphone::EventHistory::EventType::Call:
{
Softphone::EventHistory::CallEvent::Pointer callEvent = event.asCall();
UNMutableNotificationContent *notification = [[UNMutableNotificationContent alloc] init];
notification.title = @"Groundwire";
notification.body = [NSString stringWithFormat:NSLocalizedString(@"Incoming call from %@", @"notification"), ali::mac::str::to_nsstring(callEvent->getRemoteUser().getDisplayName())];
notification.sound = [UNNotificationSound defaultSound];
UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:[[NSUUID UUID] UUIDString] content:notification trigger:nil];
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
[center addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error)
{
if (!error)
{
// Handle successful notification request
}
}];
}
break;
default:
break;
}
}
- (void)onNewEvent:(Softphone::EventHistory::Event::Pointer)event
{
switch (incomingEvent->eventType)
{
case Softphone::EventHistory::EventType::Call:
{
Softphone::EventHistory::CallEvent::Pointer callEvent = event.asCall();
UNMutableNotificationContent *notification = [[UNMutableNotificationContent alloc] init];
notification.title = @"Groundwire";
notification.body = [NSString stringWithFormat:NSLocalizedString(@"Incoming call from %@", @"notification"), ali::mac::str::to_nsstring(callEvent->getRemoteUser().getDisplayName())];
notification.sound = [UNNotificationSound defaultSound];
UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:[[NSUUID UUID] UUIDString] content:notification trigger:nil];
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
[center addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error)
{
if (!error)
{
// Handle successful notification request
}
}];
}
break;
default:
break;
}
}
-
// Rewriting
rewritingString = "<rewriting><rule><conditions><condition type=\"doesntStartWith\" param=\"+\"/><condition type=\"longerThan\" param=\"8\"/></conditions> <actions> <action type=\"prepend\" param=\"+420\"/> </actions> </rule> </rewriting>";
mRewritingXml = Xml.parse(rewritingString);
if (mRewritingXml != null) {
Instance.Contacts.NumberRewriting.setRewriterRules(null, mRewritingXml);
}
ali::string_literal rewritingRule{
"<rewriting>\n"
" <rule>\n"
" <conditions>\n"
" <condition type=\"doesntStartWith\" param=\"+\"/>\n"
" <condition type=\"longerThan\" param=\"8\"/>\n"
" </conditions>\n"
" <actions>\n"
" <action type=\"prepend\" param=\"+420\"/>\n"
" </actions>\n"
" </rule>\n"
"</rewriting>"
};
int errorIndex = 0;
bool success;
ali::xml::tree rewritingXml;
success = ali::xml::parse(rewritingXml, rewritingRule, &errorIndex);
if (success)
Softphone::instance()->contacts()->numberRewriting()->setRewriterRules(rewritingXml);
-
// JoinCall
// ******************************************************************
public static void join(String firstConferenceId, String secondConferenceId) {
if (firstConferenceId == null || secondConferenceId == null)
return;
if (firstConferenceId.equals(secondConferenceId))
return;
val firstConferenceCalls = Instance.Calls.Conferences.getCalls(secondConferenceId);
val secConferenceCalls = Instance.Calls.Conferences.getCalls(firstConferenceId);
val newConferenceId = Instance.Calls.Conferences.generate("newConf");
for (val event : firstConferenceCalls)
Instance.Calls.Conferences.move(event, newConferenceId);
for (val event : secConferenceCalls)
Instance.Calls.Conferences.move(event, newConferenceId);
Instance.Calls.Conferences.setActive(newConferenceId);
}
// Split Call
// ******************************************************************
public static void split(CallEvent callEvent) {
Instance.Calls.Conferences.split(callEvent, false);
Instance.Calls.setHeld(callEvent, true);
}
// Split Conference
// ******************************************************************
public static void split(String confId) {
var confCalls = Instance.Calls.Conferences.getCalls(confId);
for (int i = 0; i < confCalls.length; i++) {
val callEvent = confCalls[i];
Instance.Calls.Conferences.split(callEvent, false);
Instance.Calls.setHeld(callEvent, true);
}
}
//*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
- (void)joinCall:(Softphone::EventHistory::CallEvent::Pointer)call toGroup:(const ali::string &)group
//*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
{
Softphone::instance()->calls()->conferences()->move(call, group);
}
//*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
- (void)splitCall:(Softphone::EventHistory::CallEvent::Pointer)call
//*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
{
ali::string groupId = Softphone::instance()->calls()->conferences()->get(call);
Softphone::instance()->calls()->conferences()->split(call, true);
}
//-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
- (void)splitGroup:(ali::string const&)groupId
//-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
{
ali::array_set<Softphone::EventHistory::CallEvent::Pointer> calls =
Softphone::instance()->calls()->conferences()->getCalls(groupId);
for (auto call : calls) {
Softphone::instance()->calls()->conferences()->split(call, false);
}
}
From checkboxes to ready-made APIs — it's all there
See the most powerful feature set on the market for yourself.
Trusted By the biggest brands