{"id":27999255,"url":"https://github.com/voximplant/flutter_voximplant","last_synced_at":"2026-03-05T06:33:13.637Z","repository":{"id":39608303,"uuid":"211902623","full_name":"voximplant/flutter_voximplant","owner":"voximplant","description":"Voximplant Flutter SDK","archived":false,"fork":false,"pushed_at":"2025-11-11T14:23:02.000Z","size":484,"stargazers_count":10,"open_issues_count":9,"forks_count":9,"subscribers_count":8,"default_branch":"master","last_synced_at":"2025-11-11T16:17:35.866Z","etag":null,"topics":["client-sdk","flutter","voximplant"],"latest_commit_sha":null,"homepage":"","language":"Dart","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/voximplant.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2019-09-30T16:18:26.000Z","updated_at":"2025-09-26T17:29:15.000Z","dependencies_parsed_at":"2025-05-08T22:57:32.659Z","dependency_job_id":"bdadae82-81c6-4fd5-9cd8-adc1a2d152e3","html_url":"https://github.com/voximplant/flutter_voximplant","commit_stats":null,"previous_names":[],"tags_count":41,"template":false,"template_full_name":null,"purl":"pkg:github/voximplant/flutter_voximplant","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/voximplant%2Fflutter_voximplant","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/voximplant%2Fflutter_voximplant/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/voximplant%2Fflutter_voximplant/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/voximplant%2Fflutter_voximplant/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/voximplant","download_url":"https://codeload.github.com/voximplant/flutter_voximplant/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/voximplant%2Fflutter_voximplant/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30112255,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-05T03:40:26.266Z","status":"ssl_error","status_checked_at":"2026-03-05T03:39:15.902Z","response_time":93,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["client-sdk","flutter","voximplant"],"created_at":"2025-05-08T22:57:27.678Z","updated_at":"2026-03-05T06:33:13.597Z","avatar_url":"https://github.com/voximplant.png","language":"Dart","funding_links":[],"categories":[],"sub_categories":[],"readme":"# flutter_voximplant\n\nVoximplant Flutter SDK for embedding voice and video communication into Flutter applications.\n\n## Demo\nhttps://github.com/voximplant/flutter_demos\n\n## Install\nAdd `flutter_voximplant` as a dependency in your pubspec.yaml file.\n\n### iOS\n\nAdd the following entry to your `Info.plist` file, located in `\u003cproject root\u003e/ios/Runner/Info.plist`:\n```\n\u003ckey\u003eNSMicrophoneUsageDescription\u003c/key\u003e\n\u003cstring\u003eMicrophone is required to make audio calls\u003c/string\u003e\n\u003ckey\u003eNSCameraUsageDescription\u003c/key\u003e\n\u003cstring\u003eCamera is required to make video calls\u003c/string\u003e\n```\nThis entry allows your app to access the microphone and cameras.\n\n### Android\nIt is required to add Java 8 support.\n\nOpen `\u003cproject root\u003eandroid/app/build.gradle` file and add the following lines to ‘android’ section:\n```\ncompileOptions {\n    sourceCompatibility JavaVersion.VERSION_1_8\n    targetCompatibility JavaVersion.VERSION_1_8\n}\n```\n\n## Usage\n\nTo get started, you'll need to [register](https://manage.voximplant.com/auth/sign_up/) a free Voximplant developer account.\n\n#### Initialization\nClient is the main class of the SDK that provides access to Voximplant’s functions, \nthe `Voximplant().getClient()` method is used to get its instance:\n```dart\nimport 'package:flutter_voximplant/flutter_voximplant.dart';\n\n\nVIClient client = Voximplant().getClient();\n```\n\n#### Connect and log in to the Voximplant Cloud\nThe `VIClient.getClientState()` method is used to get the current state of connection \nto the Voximplant cloud and perform the actions according to it.\n\nWhen initializing and connecting the SDK to the Voximplant cloud, you need to specify the node to connect to. \nYour node is bound to your Voximplant account.\nTo find which node your account belongs to, log in to your control panel and see \nthe [Credentials for working with API, SDK, SIP](https://manage.voximplant.com/) section on the main dashboard.\n```dart\n  const accountNode = VINode.NodeX;\n  Future\u003cString\u003e loginWithPassword(String username, String password) async {\n    VIClientState clientState = await _client.getClientState();\n    if (clientState == VIClientState.LoggedIn) {\n      return _displayName;\n    }\n    if (clientState == VIClientState.Disconnected) {\n      await _client.connect(node: accountNode);\n    }\n    VIAuthResult authResult = await _client.login(username, password);\n    _displayName = authResult.displayName;\n    return _displayName;\n  }\n```\n\n#### Make calls\nTo initiate a call we need the `VIClient.call` method. \nThere is a `VICallSettings` class which could contain custom data and extra headers (SIP headers).\n\nSince the call can behave in different ways, there is a group of call events. \nThey can be triggered by the `VICall` class instance as the class contains all the functionality for call management.\n\n```dart\n  Future\u003cVICall\u003e makeAudioCall(String number) async {\n     VICall call = await _client.call(number);\n     call.onCallDisconnected = _onCallDisconnected;\n     call.onCallFailed = _onCallFailed;\n     call.onCallConnected = _onCallConnected;\n     call.onCallRinging = _onCallRinging;\n     call.onCallAudioStarted = _onCallAudioStarted;\n     return call;\n  }\n   \n  _onCallConnected(VICall call, Map\u003cString, String\u003e? headers) {\n      print('Call connected');\n  }\n```\n\n#### Receiving calls\n`Client.onIncomingCall` is used to get incoming calls. \n\nThere are three methods for an incoming call: answer, decline and reject. An audio stream can be sent only after the answer method call.\n```dart\n  CallService._() {\n    _client = Voximplant().getClient();\n    _client.onIncomingCall = _onIncomingCall;\n  }\n\n  _onIncomingCall(VIClient client, VICall call, bool video, Map\u003cString, String\u003e? headers) async {\n    await call.answer();\n  }\n```\n\n#### Mid-call operations\nAudio call can be put on/off hold\n```dart\n  _hold() async {\n    try {\n      await _call.hold(!_isOnHold);\n      setState(() {\n        _isOnHold = !_isOnHold;\n      });\n    } catch (e) {\n      \n    }\n\n  }\n```\n\n#### Audio device management\n`VIAudioDeviceManager` class API allow to:\n- get all available audio devices\n- get currently selected audio device\n- select audio device\n- handle active audio device changes and new audio devices (for example, Bluetooth headset or wired headset connection). These changes trigger the appropriate events.\n\nAll types of audio devices are represented in the `VIAudioDevice` enum.\n\nNote that there are platform specific nuances in audio device management.\n\nTo select an audio device:\n```dart\n  _selectAudioDevice(VIAudioDevice device) async{\n    VIAudioDeviceManager audioDeviceManager = Voximplant().getAudioDeviceManager();\n    audioDeviceManager.onAudioDeviceChanged = _onAudioDeviceChange;\n    await audioDeviceManager.selectAudioDevice(device);\n  }\n\n  _onAudioDeviceChange(VIAudioDeviceManager audioDeviceManager, AudioDevice audioDevice) {\n    // audio device is changed\n  }\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvoximplant%2Fflutter_voximplant","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fvoximplant%2Fflutter_voximplant","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvoximplant%2Fflutter_voximplant/lists"}