The Plug and Play Communication SDK

The Most Advanced Mobile
Communication 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.

A Developer-Friendly SDK

The Acrobits SDK simplifies the development process

Add busy lamp field integration to your real-time communications platform to see whether users are in an active call.

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)
                {
                }
            }];
        }
        break;

        default:
        break;
    }
}
ali::string_literal rewritingRule{"<rewriting>
    <rule>
     <conditions>
       <condition type="doesntStartWith" param="+"/>
       <condition type="longerThan" param="8"/>
     </conditions>
     <actions>
       <action type="prepend" param="+420"/>
     </actions>
   </rule>
</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);
//*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
- (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);
    }
}
Powered by Acrobits
 //Blf status
 val dialogInfo = Instance.Registration.getDialogInfo(accountId,uri);
            String blfString = dialogInfo.busyLamp?"On call":"Off call";
            busyLampStatusLabel.setText(blfString);
//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);


    }
//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);
/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);
        }
    }
Powered by Acrobits
The Most Powerful Feature Set In The MarketThe Most Powerful Features

From checkboxes to ready made APIs, it’s all there!

  • Always Improving

    Features

    We work with all of the major operating systems, support many devices, provide numerous updates each year, and deploy same-day updates for major OS changes.

  • Detailed Documentation

    Documents

    We have created a thorough library of documentation for any ultra-specific or general questions that you may have. Our library makes troubleshooting easy.

Your message was sent
Sending error|Please send the message again
Sending error|Please send the message again
Sending error|Please send the message again
You must accept the terms and conditions before sending your message.
The field is required.
Whoa! Text is too long, must not exceed [num] symbols.
The field is too short.
The date format is incorrect.
The date is before the earliest one allowed.
The date is after the latest one allowed.
There was an unknown error uploading the file.
You are not allowed to upload files of this type.
The file is too big.
There was an error uploading the file.
The number format is invalid.
The number is smaller than the minimum allowed.
The number is larger than the maximum allowed.
The answer to the quiz is incorrect.
Your entered code is incorrect.
Please enter your business email
Please enter a valid URL
The telephone number is invalid.

Request a Demo

Learn how our solution can solve your real-time communications needs

Full Name
Your business email address
Your company's website
Questions? Let us know below

By submitting your information you agree to Acrobits processing and storing your information.
We appreciate you contacting us about the demo. One of our colleagues will get back to you shortly.