{"id":22424,"date":"2022-08-16T11:41:04","date_gmt":"2022-08-16T06:11:04","guid":{"rendered":"https:\/\/www.mirrorfly.com\/blog\/?p=22424"},"modified":"2026-02-13T18:07:18","modified_gmt":"2026-02-13T12:37:18","slug":"build-android-app-with-voice-video-using-java","status":"publish","type":"post","link":"https:\/\/www.mirrorfly.com\/blog\/build-android-app-with-voice-video-using-java\/","title":{"rendered":"How to Build an Android Video Calling App Using Java?"},"content":{"rendered":"\n<p>Voice and video calling apps have become an essential part of businesses these days. While there are so many options like Zoom, Skype, Google Duo, and Discord to choose from, most entrepreneurs and tech enthusiasts have started creating apps for their brands.<\/p>\n\n\n\n<p>Moving smart ahead, developers choose to add communication features to their apps instead of building a whole app from scratch.<\/p>\n\n\n\n<p>Want to know how? You can simply use a <a href=\"https:\/\/www.mirrorfly.com\/video-call-solution.php\">pre-built solution to build android video chat app<\/a> in just minutes. This article discusses everything about it &#8211; from where you need to start the development process to where you can launch your app. Keep reading!<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Check_For_Pre-Requisites\"><\/span><b>Check For Pre-Requisites<\/b><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p><span style=\"font-weight: 400;\">We will be building an android app with voice and video call capabilities by integrating MirrorFly\u2019s SDKs.&nbsp;<\/span><\/p>\n\n\n\n<p><span style=\"font-weight: 400;\">With no further ado, let\u2019s get ahead and <a href=\"https:\/\/www.mirrorfly.com\/build-video-chat-app.php\">create a video chat app<\/a> in minutes!<\/span><\/p>\n\n\n\n<p><span style=\"font-weight: 400;\"><em><strong>Before you start, make sure you have:<\/strong><\/em><\/span><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><span style=\"font-weight: 400;\">Android Lollipop 5.0 (API Level 21) or above<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">Java 7 or higher<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">Gradle 4.1.0 or higher<\/span><\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><b>Prepare Your Application<\/b><\/h3>\n\n\n\n<p><span style=\"font-weight: 400;\"><strong><em>If you are planning to build an app, you have 2 options:<\/em><\/strong><\/span><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><span style=\"font-weight: 400;\"> Build an app from scratch<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\"> Develop an app on top of our sample app.<\/span><\/li>\n<\/ol>\n\n\n\n<p><span style=\"font-weight: 400;\">If you are opting for the latter, download our sample app for free <\/span><a href=\"https:\/\/github.com\/MirrorFly\" target=\"_blank\" rel=\"noreferrer noopener\"><span style=\"font-weight: 400;\">here<\/span><\/a><span style=\"font-weight: 400;\">.<\/span><\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><b>Create An Account With Mirrorfly<\/b><\/h3>\n\n\n\n<p><span style=\"font-weight: 400;\">When you integrate the MirrorFly SDK into your app, it has to be authenticated by the MirrorFly server. For this, you will need a License Key.<\/span><\/p>\n\n\n\n<p><span style=\"font-weight: 400;\"><em><strong>To acquire the License key:<\/strong><\/em><\/span><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><span style=\"font-weight: 400;\">Go to MirrorFly&#8217;s console page &#8211; <strong><a href=\"https:\/\/console.mirrorfly.com\/register\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/console.mirrorfly.com\/register<\/a><\/strong><\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">Add the basic details including name, business email, contact and organization details<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">Click on SignUp and your account gets created.<\/span><\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><b>Get The License Key<\/b><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><span style=\"font-weight: 400;\">Once you sign into your account, you will be taken to the overview page.<\/span><\/li>\n\n\n\n<li>In the &#8216;Application info&#8217; section,&nbsp; you will be able to find the &#8216;License Key&#8217; needed for the authentication process<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Download SDKs<\/strong><\/h3>\n\n\n\n<p><strong><em>Once you&#8217;ve noted down the License Key,&nbsp;<\/em><\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Navigate below where you will have the Android SDK available for download<\/li>\n\n\n\n<li>Click on &#8216;Download&#8217;<\/li>\n\n\n\n<li>Find the downloaded SDK folder on your device<\/li>\n\n\n\n<li>Extract the AAR files and get them ready for the integration process.<\/li>\n<\/ul>\n\n\n\n<section class=\"interested2\">\n<div class=\"interested-inn2\">\n<div class=\"flag2\">\n<div style=\"width: 47px; height: 47px; background:#ff0935; border-radius: 14px; transform: rotate(45deg);\">&nbsp;<\/div>\n<\/div><div class=\"flex-box\">\n<div class=\"left-part\">Want To Add Voice &#038; Video Chat To Your App? <\/div>\n<div class=\"right-part\">\n<a href=\"https:\/\/www.mirrorfly.com\/contact-sales.php\" class=\"btns\">Request Demo<\/a>\n<\/div>\n<\/div>\n<\/div>\n<\/section>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"SDK_Integration_to_Add_Voice_and_Video_Capabilities\"><\/span><strong>SDK Integration to Add Voice and Video Capabilitie<\/strong>s<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>The SDKs are already available as AAR files. They just need to be imported into the Android Project for the integration process to commence.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Create a new project in the Android Studio IDE or open an existing <a href=\"https:\/\/www.mirrorfly.com\/blog\/how-does-chat-solution-help-it-projects\/\">project<\/a><\/li>\n\n\n\n<li>In the project window, add the downloaded library files to the app\/libs folder.<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>appbase.aar<\/li>\n\n\n\n<li>flycommons.aar<\/li>\n\n\n\n<li>flynetwork.aar<\/li>\n\n\n\n<li>flydatabase.aar<\/li>\n\n\n\n<li>videocompression.aar<\/li>\n\n\n\n<li>xmpp.aar<\/li>\n\n\n\n<li>flywebrtc.aar<\/li>\n<\/ul>\n\n\n\n<p class=\"has-background\" style=\"background-color:#e3ebfa; padding:10px; border-radius:6px;\">\n  <strong>\ud83d\udccc Note:<\/strong><br>\n  Alongside this guide, you can explore our \n  <a href=\"https:\/\/www.mirrorfly.com\/videos.php\" target=\"_blank\">step-by-step integration video guides<\/a> \n  and \n  <a href=\"https:\/\/www.mirrorfly.com\/tutorials\/javascript-video-chat-app.php\" target=\"_blank\">Android Java Video Chat tutorials<\/a> \n  for more guided assistance with your development.\n<\/p>\n\n\n\n<p>3. Next, add the below code to the app\/build.gradle file<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>plugins {\n    ...\n    id 'kotlin-android'\n    id 'kotlin-kapt'\n}\n\nandroid {\n    compileOptions {\n        sourceCompatibility JavaVersion.VERSION_1_8\n        targetCompatibility JavaVersion.VERSION_1_8\n    }\n\n    kotlinOptions {\n        jvmTarget = '1.8'\n    }\n\n    packagingOptions {\n        exclude 'META-INF\/AL2.0'\n        exclude 'META-INF\/DEPENDENCIES'\n        exclude 'META-INF\/LICENSE'\n        exclude 'META-INF\/LICENSE.txt'\n        exclude 'META-INF\/license.txt'\n        exclude 'META-INF\/NOTICE'\n        exclude 'META-INF\/NOTICE.txt'\n        exclude 'META-INF\/notice.txt'\n        exclude 'META-INF\/ASL2.0'\n        exclude 'META-INF\/LGPL2.1'\n        exclude(\"META-INF\/*.kotlin_module\")\n    }\n}<\/code><\/pre>\n\n\n\n<p>4. In the same app\/build.gradle file, add the below dependencies that are needed by SDKs<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>dependencies {\n\n     ... \/\/ your app dependencies\n\n     implementation files('libs\/appbase.aar')\n     implementation files('libs\/flycommons.aar')\n     implementation files('libs\/flynetwork.aar')\n     implementation files('libs\/flydatabase.aar')\n     implementation files('libs\/videocompression.aar')\n     implementation files('libs\/xmpp.aar')\n     implementation files('libs\/flywebrtc.aar')\n }<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>dependencies {\n\n\tconfigurations \t{ \n\t    all {\n\t\texclude group: 'org.json', module: 'json' \n\t        exclude group: 'xpp3', module: 'xpp3'\n       \t}\n}\t\nimplementation files('libs\/appbase. aar') \nimplementation files('libs\/flycommons.aar') \nimplementation files('libs\/flynetwork.aar') \nimplementation files('libs\/flydatabase.aar') \nimplementation files('libs\/videocompression.aar') \nimplementation files ('libs\/xmpp.aar') \nimplementation files('libs\/flywebrtc.aar')\n}<\/code><\/pre>\n\n\n\n<p>5. Continue to add the next set of dependencies<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> dependencies {\n\n     ... \/\/ your app dependencies\n\n     configurations {\n         all {\n             exclude group: 'org.json', module: 'json'\n             exclude group: 'xpp3', module: 'xpp3'\n         }\n     }\n\n     \/\/For lifecycle listener\n     implementation 'android.arch.lifecycle:extensions:1.1.1'\n     annotationProcessor 'android.arch.lifecycle:compiler:1.1.1'\n\n     \/\/For GreenDao\n     implementation 'de.greenrobot:greendao:2.1.0'\n\n     \/\/For gson parsing\n     implementation 'com.google.code.gson:gson:2.8.1'\n\n     \/\/for smack implementation\n     implementation 'org.igniterealtime.smack:smack-android:4.4.4'\n     implementation 'org.igniterealtime.smack:smack-tcp:4.4.4'\n     implementation 'org.igniterealtime.smack:smack-im:4.4.4'\n     implementation 'org.igniterealtime.smack:smack-extensions:4.4.4'\n     implementation 'org.igniterealtime.smack:smack-sasl-provided:4.4.4'\n\n     Implementation           'androidx.localbroadcastmanager:localbroadcastmanager:1.0.0'\n     implementation 'androidx.multidex:multidex:2.0.1'\n     implementation 'com.google.android.gms:play-services-location:17.0.0'\n\n     \/\/Dagger Dependencies\n     api 'com.google.dagger:dagger:2.40.5'\n     kapt 'com.google.dagger:dagger-compiler:2.40.5'\n     api 'com.google.dagger:dagger-android:2.40.5'\n     api 'com.google.dagger:dagger-android-support:2.40.5'\n     kapt 'com.google.dagger:dagger-android-processor:2.40.5'\n\n     \/\/coroutines\n     implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.3'\n     implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-test:1.3.3'\n\n     \/\/apicalls\n     implementation 'com.squareup.retrofit2:retrofit:2.6.1'\n     implementation 'com.squareup.retrofit2:converter-gson:2.6.1'\n     implementation 'com.squareup.okhttp3:okhttp:4.2.0'\n     implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2'\n\n     \/\/stetho interceptor\n     implementation 'com.facebook.stetho:stetho-okhttp3:1.3.1'\n\n     \/\/okhttp interceptor\n     implementation 'com.squareup.okhttp3:logging-interceptor:3.14.3'\n\n     \/\/shared preference encryption\n     implementation 'androidx.security:security-crypto:1.1.0-alpha03'\n\n    \n \/\/Socket - versions.gradle\n     implementation 'com.github.nkzawa:socket.io-client:0.6.0'\n     \/\/Google - versions.gradle\n     implementation 'org.webrtc:google-webrtc:1.0.32006'\n\n     implementation 'androidx.core:core-ktx:+'\n     implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.4.31'\n\n     implementation 'androidx.media:media:1.0.0'\n\n     \/\/room database\n     implementation 'androidx.room:room-runtime:2.2.5'\n     kapt 'androidx.room:room-compiler:2.2.5'\n     implementation \"androidx.room:room-ktx:2.2.5\"\n\n     \/\/ Lifecycle\n     implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'\n     kapt 'androidx.lifecycle:lifecycle-compiler:2.2.0'\n\n }<\/code><\/pre>\n\n\n\n<p>6. To avoid imported library conflicts, you will need to add the below code to the gradle.properties file<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>android.enableJetifier=true<\/code><\/pre>\n\n\n\n<p>7. In order to resolve the WebRTC dependencies, add the below line in the setting.gradle file<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>dependencyResolutionManagement {\n repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)\n repositories {\n     google()\n     mavenCentral()\n     jcenter()\n }\n}<\/code><\/pre>\n\n\n\n<p>8. Add the below permissions to the AndroidManifest.xml. This manifests helps describe the characteristic feature of every element involved in the integration process<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;uses-permission android:name=\"android.permission.INTERNET\" \/&gt;\n&lt;uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\" \/&gt;\n&lt;uses-permission android:name=\"android.permission.RECORD_AUDIO\" \/&gt;\n&lt;uses-permission android:name=\"android.permission.DISABLE_KEYGUARD\" \/&gt;\n&lt;uses-permission android:name=\"android.permission.CAMERA\" \/&gt;\n&lt;uses-permission android:name=\"android.permission.READ_PHONE_STATE\" \/&gt;\n&lt;uses-permission android:name=\"android.permission.WAKE_LOCK\" \/&gt;<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Configuration of app\/build.gradle file<\/strong><\/h3>\n\n\n\n<p>Configure the elements in buildConfigField that includes License Key, acquired in the previous steps<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>buildTypes {\n  debug {\n    buildConfigField 'String', 'SDK_BASE_URL', '\"https:\/\/api-preprod-sandbox.mirrorfly.com\/api\/v1\/\"'\n    buildConfigField 'String', 'LICENSE', '\"xxxxxxxxxxxxxxxxxxxxxxxxx\"'\n    buildConfigField 'String', 'WEB_CHAT_LOGIN', '\"https:\/\/webchat-preprod-sandbox.mirrorfly.com\/\"'\n    buildConfigField \"String\", \"SUPPORT_MAIL\", '\"contussupport@gmail.com\"'\n  }\n}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Initialization of Data for Voice and Video Calls<\/strong><\/h3>\n\n\n\n<p>A call SDK needs specific data to perform its operations effectively. To do this, get into the onCreate() method of the Application class and define the ChatSDK Builder as follows<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\n\/\/For chat logging\nLogMessage.enableDebugLogging(BuildConfig.DEBUG);\n\nChatSDK.Builder()\n    .setDomainBaseUrl(BuildConfig.SDK_BASE_URL)\n    .setLicenseKey(BuildConfig.LICENSE)\n    .setIsTrialLicenceKey(true)\n    .build(); <\/code><\/pre>\n\n\n\n<p class=\"has-background\" style=\"background-color:#e3ebfa; padding:10px; border-radius:6px;\">\n  <strong>\ud83d\udccc Note:<\/strong><br>\n  Besides video, if you&#8217;re interested in adding messaging features, check out our guide on \n  <a href=\"https:\/\/www.mirrorfly.com\/instant-messaging-app-development.php\" target=\"_blank\">chat app development with MirrorFly<\/a>.\n<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Chat Builder Function Description<\/strong><\/h3>\n\n\n\n<figure class=\"wp-block-table is-style-stripes\"><table class=\"has-fixed-layout\"><thead><tr><th><strong><code>Function<\/code><\/strong><\/th><th><strong>Parameter Type<\/strong><\/th><th><strong>Description<\/strong><\/th><\/tr><\/thead><tbody><tr><td>setDomainBaseUrl<\/td><td>Sting<\/td><td>Url is provided to make API calls<\/td><\/tr><tr><td>setLicenseKey<\/td><td>Sting<\/td><td>License key is required to proceed with registration<\/td><\/tr><tr><td>setIsTrialLicenseKey<\/td><td>Boolean<\/td><td>If the provided license key is for trial version, display the text as \u2018true\u2019 else \u2018false\u2019<\/td><\/tr><tr><td>build<\/td><td>n\/a<\/td><td>Initializes the chat configuration<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p><strong>Note: <\/strong>When you enter the setDomainBaseUrl the http\/ https must close with a slash (\/). Otherwise an exception &#8211; bug message may appear.<\/p>\n\n\n\n<p>Configure your app&#8217;s backup rules and themes by using the code below, as mentioned in the image.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Register a User<\/strong><\/h3>\n\n\n\n<p>Based on the setIsTrialLicenceKey method, you need to register a user in the sandbox live mode. During this process, the FCM_TOKEN will be accepted as an optional parameter by the&nbsp; registerUser method. Here, you will have to call the function FlyCore.registerUser() in the main activity () as below:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>  FlyCore.registerUser(USER_IDENTIFIER, (isSuccess, throwable, data ) -&gt; {\n        if(isSuccess) {\n            Boolean isNewUser = (Boolean) data.get(\"is_new_user\");\n            JSONObject responseObject = (JSONObject) data.get(\"data\");\n           \/\/ Get Username and password from the object\n        } else {\n           \/\/ Register user failed print throwable to find the exception details.\n        }\n   });<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-table is-style-stripes\"><table class=\"has-fixed-layout\"><thead><tr><th><strong>Argument<\/strong><\/th><th><strong>Type<\/strong><\/th><th><strong>Description<\/strong><\/th><\/tr><\/thead><tbody><tr><td>USER_IDENTIFIER<\/td><td>String<\/td><td>A unique Id to Register the User<\/td><\/tr><tr><td>FCM_TOKEN<\/td><td>String<\/td><td>A registration token that is generated by FCM SDK for the user&#8217;s app instance to send message for free<\/td><\/tr><tr><td>CALLBACK<\/td><td>FlyCallback<\/td><td>FlyCallback is used as a callback, implemented and expressed as lambda expression for easy reading<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Establish the Chat Server Connection<\/strong><\/h3>\n\n\n\n<p>A Chat SDK needs a server connection to enable your app to send\/ receive messages. The SDK provides methods to start the chat connection to the server. Here we use the ChatManager.connect() function to start a connection between the<a href=\"https:\/\/www.apptha.com\/blog\/7-best-chat-solutions-for-your-business\/\" target=\"_blank\" rel=\"noreferrer noopener\"> Chat server<\/a> and the SDK.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>    ChatManager.connect(new ChatConnectionListener() {\n         @Override\n         public void onConnected() {\n             \/\/ Write your success logic here to navigate Profile Page or\n             \/\/ To Start your one-one chat with your friends\n         }\n\n         @Override\n         public void onDisconnected() {\n            \/\/ Connection disconnected\n            \/\/No need implementations\n         }\n\n        @Override\n         public void onConnectionNotAuthorized() {\n            \/\/ Connection Not authorized\n            \/\/No need implementations\n        }\n    });<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-table is-style-stripes\"><table class=\"has-fixed-layout\"><thead><tr><th><strong>Argument<\/strong><\/th><th><strong>Type<\/strong><\/th><th><strong>Description<\/strong><\/th><\/tr><\/thead><tbody><tr><td>CALLBACK<\/td><td>ChatConnectionListener<\/td><td>callback listener for chat connection<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Initialize the SDK for Voice and Video Calls<\/strong><\/h3>\n\n\n\n<p>Only when the SDK is initialized, you application will be able to run. To perform this, you&#8217;ll need to start the call SDK in the onCreate() method as follows<\/p>\n\n\n\n<figure class=\"wp-block-table is-style-stripes\"><table class=\"has-fixed-layout\"><thead><tr><th><strong>Argument<\/strong><\/th><th><strong>Type<\/strong><\/th><th><strong>Description<\/strong><\/th><\/tr><\/thead><tbody><tr><td>CALL_UI_ACTIVITY<\/td><td>Class<\/td><td>Activity which needs to be invoked during incoming calls. when a incoming call is received Call SDK will start this activity with the call details<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<pre class=\"wp-block-code\"><code>@Override\npublic void onCreate() {\nsuper.onCreate();\n\/\/Initialize call manager\nCallManager.init(this);\n\/\/set your call activity\nCallManager.setCallActivityClass(CALL_UI_ACTIVITY.class);\nCallManager.setMissedCallListener((isOneToOneCall, userJid, groupId, callType, userList) -&gt; {\n  \/\/show missed call notification\n});\n\nCallManager.setCallHelper(new CallHelper() {\n      @NonNull\n      @Override\n      public String getNotificationContent(@NonNull String callDirection) {\n          return CallNotificationHelper.getNotificationMessage();\n      }\n\n      @Override\n      public void sendCallMessage(@NotNull GroupCallDetails details, @NotNull List&lt;String&gt; users, @NotNull List&lt;String&gt; invitedUsers) {\n          CallMessenger.sendCallMessage(details, users, invitedUsers);\n      }\n  });\n\nCallManager.setCallNameHelper(new CallNameHelper() {\n      @NonNull\n      @Override\n      public String getDisplayName(@NonNull String jid) {\n          return ContactManager.getDisplayName(jid);\n      }\n  });\n}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Call Activity Setup<\/strong><\/h3>\n\n\n\n<p>In your manifest, you need to define the Call UI activity using the below method<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>     &lt;activity\n            android:name=\"YOUR_CALL_ACTIVITY\"\n            android:configChanges=\"screenSize|smallestScreenSize|screenLayout|orientation\"\n            android:excludeFromRecents=\"true\"\n            android:launchMode=\"singleTask\"\n            android:resizeableActivity=\"false\"\n            android:screenOrientation=\"portrait\"\n            android:supportsPictureInPicture=\"true\"\n            android:showOnLockScreen=\"true\"\n            android:turnScreenOn=\"true\"\n            android:taskAffinity=\"call.video\"\n            tools:targetApi=\"o_mr1\" \/&gt;<\/code><\/pre>\n\n\n\n<p>Next, you&#8217;ll have to configure the call activities in activityonCreate() as done below<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>CallManager.configureCallActivity(ACTIVITY);<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-table is-style-stripes\"><table class=\"has-fixed-layout\"><thead><tr><th><strong>Argument<\/strong><\/th><th><strong>Type<\/strong><\/th><th><strong>Description<\/strong><\/th><\/tr><\/thead><tbody><tr><td>ACTIVITY<\/td><td>Activity<\/td><td>Instance of the call activity<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>If you&#8217;ve decided not to show the ongoing call notification, you must remove it in the onStart() method and notify the call SDK as follows<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>CallManager.bindCallService();<\/code><\/pre>\n\n\n\n<p>Similarly, if you need to show the ongoing call notification, notify the call SDK by calling the onStop() method<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>CallManager.unbindCallService();<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Make the first Voice\/ Video Call from Your App<\/strong><\/h3>\n\n\n\n<p>If users need to make a live voice call or live video call from the client&#8217;s app, it will ask for runtime permissions when launched for the first time. These permissions must be&nbsp; requested before the calling the SDKs. Otherwise, it might lead to an error message in the callback, in the absence of required permissions.<\/p>\n\n\n\n<p>You need the below permissions to <a href=\"https:\/\/www.mirrorfly.com\/voice-call-solution.php\" target=\"_blank\" rel=\"noreferrer noopener\">make a voice call<\/a><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Manifest.permission.RECORD_AUDIO\nManifest.permission.READ_PHONE_STATE<\/code><\/pre>\n\n\n\n<p>Next, you&#8217;ll have to check for the voice\/ audio permissions using the below method<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> CallManager.isAudioCallPermissionsGranted();<\/code><\/pre>\n\n\n\n<p>You need the below permissions to make a video call<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Manifest.permission.RECORD_AUDIO\nManifest.permission.CAMERA\nManifest.permission.READ_PHONE_STATE<\/code><\/pre>\n\n\n\n<p>Next, you&#8217;ll have to check for the video permissions using the below method<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> CallManager.isVideoCallPermissionsGranted();<\/code><\/pre>\n\n\n\n<p>Next, for easy audio routing and gsm call handling,<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Check if android.permission.BLUETOOTH_CONNECT is provided to ensure that the bluetooth connectivity is routed.<\/li>\n\n\n\n<li>Also, check whether the android.permission.READ_PHONE_STATE is provided for recording audio and other gsm related functionalities.<\/li>\n\n\n\n<li>Having provided the permissions, use the below code to allow users to make a direct\/ one-to-one voice call to other SDK users<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code> CallManager.makeVoiceCall(\"TO_JID\", (isSuccess, message) -&gt; {       \n                    });<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-table is-style-stripes\"><table class=\"has-fixed-layout\"><thead><tr><th><strong>Argument<\/strong><\/th><th><strong>Type<\/strong><\/th><th>Description<\/th><\/tr><\/thead><tbody><tr><td><\/td><td><\/td><td><\/td><\/tr><tr><td>TO_JID<\/td><td>String<\/td><td>jid of the call receiver<\/td><\/tr><tr><td>CALLBACK<\/td><td>CallActionListener<\/td><td>callback to observe the action status<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Similarly, to make a video call, call the below method<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> CallManager.makeVideoCall(\"TO_JID\", (isSuccess, message) -&gt; {\n                    });<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Receive a Voice\/ Video Call<\/strong><\/h3>\n\n\n\n<p>When your Android version is greater than Android 10 (API level 29), a pop-up notification will appear when you receive a call. Otherwise, the CallManager.setCallActivityClass() method that you&#8217;ve set during the intialisation process will automatically start using the available call details.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Answer the Voice\/ Video Call<\/strong><\/h3>\n\n\n\n<p>Whenever a user receives a call from another user, he\/ she will be notified by the call SDK, in the UI. When the call is accepted by clicking on the &#8216;Accept&#8217; button, the call will be answered.<\/p>\n\n\n\n<figure class=\"wp-block-table is-style-stripes\"><table><tbody><tr><td><strong>Argument<\/strong><\/td><td><strong>Type<\/strong><\/td><td><strong>Description<\/strong><\/td><\/tr><tr><td>CALLBACK<\/td><td>CallActionListener<\/td><td>callback to observe the action status<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<pre class=\"wp-block-code\"><code>  CallManager.answerCall((isSuccess, message) -&gt; {\n                    });<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Decline the Voice\/ Video Call<\/strong><\/h3>\n\n\n\n<p>When a user declines an incoming call, the below SDK method will be called and the other user will be notified that the call has been declined.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>  CallManager.declineCall();<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Disconnect the ongoing voice call<\/strong><\/h3>\n\n\n\n<p>When a user needs to disconnect from an ongoing call or is cut off by factors like weak network or low battery, the below SDK method will disconnect the call and notify the user at the other end<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>  CallManager.disconnectCall();<\/code><\/pre>\n\n\n\n<div class=\"recommended-reading\">\n  <div class=\"recommended-header\"><svg class=\"gW_Lq\" style=\"float: left;width: 166px;\" viewBox=\"0 0 210 190\"><defs><path id=\"e26um264ea\" d=\"M18 0h174c9.941 0 18 8.059 18 18v154c0 9.941-8.059 18-18 18H18c-9.941 0-18-8.059-18-18V18C0 8.059 8.059 0 18 0z\"><\/path><\/defs><g fill=\"none\" fill-rule=\"evenodd\"><g><g transform=\"translate(-188 -8232) translate(188 8232)\"><mask id=\"pdc13wuw9b\" fill=\"#fff\"><use xlink:href=\"#e26um264ea\"><\/use><\/mask><circle cx=\"63\" cy=\"95\" r=\"147\" fill=\"#06F\" mask=\"url(#pdc13wuw9b)\"><\/circle><\/g><\/g><\/g><\/svg>\n       <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"122.88\" height=\"101.362\" viewBox=\"0 0 122.88 101.362\" style=\"position: absolute;left: 40px;width: 75px;top: 20px;\">\n       <g id=\"read-book\" transform=\"translate(0 0.002)\">\n         <path id=\"Path_14\" data-name=\"Path 14\" d=\"M12.64,77.27l.31-54.92H6.75V92.23a105.631,105.631,0,0,1,25.68-3.66A72.227,72.227,0,0,1,56.3,92.33a50.968,50.968,0,0,0-16.36-8.88,59.8,59.8,0,0,0-23.66-2.52,3.379,3.379,0,0,1-3.64-3.08,2.81,2.81,0,0,1,0-.58Zm90.98-57.79a4.059,4.059,0,0,1-.04-.51,2.922,2.922,0,0,1,.04-.51V7.34a51.6,51.6,0,0,0-22.86,2.78,31.5,31.5,0,0,0-15.9,12.44V85.9a80.643,80.643,0,0,1,17.58-9.1,50.565,50.565,0,0,1,21.18-3.02V19.48Zm6.75-3.88h9.14a3.372,3.372,0,0,1,3.37,3.37V96.63a3.372,3.372,0,0,1-3.37,3.37,3.28,3.28,0,0,1-1.09-.18c-9.4-2.69-18.74-4.48-27.99-4.54a64.964,64.964,0,0,0-27.08,5.52,3.4,3.4,0,0,1-1.92.56,3.445,3.445,0,0,1-1.92-.56,64.776,64.776,0,0,0-27.08-5.52c-9.25.06-18.58,1.85-27.99,4.54a3.28,3.28,0,0,1-1.09.18A3.352,3.352,0,0,1,0,96.64V18.97A3.372,3.372,0,0,1,3.37,15.6h9.61l.06-11.26a3.366,3.366,0,0,1,2.68-3.28h0a53.466,53.466,0,0,1,29.1,2.23A37.372,37.372,0,0,1,61.61,15.54,39.244,39.244,0,0,1,78.39,3.82a59.114,59.114,0,0,1,29.09-2.8,3.365,3.365,0,0,1,2.88,3.33h0V15.6ZM68.13,91.82a72.556,72.556,0,0,1,22.33-3.26,105.146,105.146,0,0,1,25.68,3.66V22.35h-5.77V77.57A3.372,3.372,0,0,1,107,80.94a3.331,3.331,0,0,1-.78-.09,43.167,43.167,0,0,0-21.51,2.29,75.366,75.366,0,0,0-16.58,8.68ZM58.12,85.25V22.46c-3.53-6.23-9.24-10.4-15.69-12.87A46.533,46.533,0,0,0,19.75,7.18l-.38,66.81a65.191,65.191,0,0,1,22.64,3.06,57.689,57.689,0,0,1,16.11,8.2Z\" fill=\"#fff\"><\/path>\n       <\/g>\n   <\/svg>\n<\/div>\n   <h3 class=\"has-text-align-center title\"><span class=\"ez-toc-section\" id=\"Now_Its_Tips_for_Build_Educational_Tutoring_Apps\"><\/span>Recommended Reading<span class=\"ez-toc-section-end\"><\/span><\/h3>\n   <ul class=\"guide\">\n       <li>\n<a style=\"float: left; padding-left: 0; cursor: pointer;\" href=\"https:\/\/www.mirrorfly.com\/blog\/build-a-video-chat-app-using-react-js\/\"> How to Build a Simple Video Chat App Using React JS?<\/a><\/li>\n<li><a style=\"float: left; cursor: pointer;\" href=\"https:\/\/www.mirrorfly.com\/tutorials\/build-video-chat-app-for-web.php\"> How to Build A Video Chat App For The Web?<\/a><\/li>\n   <\/ul>\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Conclusion\"><\/span><strong>Conclusion<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Remember, video chat apps are everywhere. But building an efficient one requires upskilling along with the right tools. The steps mentioned above are a quick and easy way to add voice and video calling capabilities to your Android app, provided you have an account with MirrorFly.<\/p>\n\n\n\n<p>To help you further, we offer a customizable chat solution that includes perks like 100% customization, on-premise hosting, complete ownership over sourcecodes, and a <a href=\"https:\/\/www.mirrorfly.com\/self-hosted-chat-solution.php\">white-label chat solution<\/a> that you can learn about on our <a href=\"https:\/\/www.mirrorfly.com\/docs\/audio-video\/android\/call-features\">official website<\/a>. Need guided assistance for adding chat features to your app? Check out this <a href=\"https:\/\/www.mirrorfly.com\/tutorials\/build-android-chat-app-in-java.php\">Android chat SDK integration guide<\/a> or contact our tech team.<\/p>\n\n\n\n<div class=\"cta-wrapper-two\">\n<summary class=\"cta-heading-two\">Ready to Add <span class=\"highlight\">Video &#038; Voice Features<\/span> to Your Web &#038; App?<\/summary>\n<p class=\"cta-content-two\">Get 1000+ Messaging Features along with Video &#038; Voice Calling, into Any Web or Mobile App with End-to-End Encryption.<\/p>\n<a href=\"https:\/\/www.mirrorfly.com\/contact-sales.php\" class=\"self-host-cta-btn\">Contact Sales<\/a>\n<ul class=\"cta-wrapper-list-two\">\n<li><img decoding=\"async\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=\" data-src=\"https:\/\/www.mirrorfly.com\/blog\/wp-content\/themes\/mirrorfly\/assets\/images\/tick-icon.svg\">\n200+ Happy Clients<\/li>\n<li><img decoding=\"async\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=\" data-src=\"https:\/\/www.mirrorfly.com\/blog\/wp-content\/themes\/mirrorfly\/assets\/images\/tick-icon.svg\">\nUnlimited Calls<\/li>\n<li><img decoding=\"async\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=\" data-src=\"https:\/\/www.mirrorfly.com\/blog\/wp-content\/themes\/mirrorfly\/assets\/images\/tick-icon.svg\">\nMulti-tenancy Support<\/li>\n<\/ul>\n<img decoding=\"async\" src=\"https:\/\/www.mirrorfly.com\/blog\/wp-content\/themes\/mirrorfly\/assets\/images\/saas-cta-bg.webp\" class=\"cta-image-thumbnail-two\">\n<\/div>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity custom-seperator\"\/>\n\n\n\n<p style=\"font-size:24px\"><strong>Related Articles<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/www.mirrorfly.com\/blog\/flutter-video-call\/\" target=\"_blank\" rel=\"noreferrer noopener\">How to Build A Flutter Video Call App in 2026?<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/www.mirrorfly.com\/blog\/build-a-video-chat-app-using-react-js\/\" target=\"_blank\" rel=\"noreferrer noopener\">How to Build a React JS Video Chat App in 2026?<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/www.mirrorfly.com\/blog\/flutter-packages-for-real-time-communication\/\">Top 10 Flutter Packages for Real-Time Communication<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/www.mirrorfly.com\/blog\/best-communication-protocols\/\">The 5 Best Communication Protocols of 2026<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/www.mirrorfly.com\/blog\/build-a-chat-app-like-discord\/\">Build Gaming Chat App Like Discord<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Voice and video calling apps have become an essential part of businesses these days. While there are so many options like Zoom, Skype, Google Duo, and Discord to choose from, most entrepreneurs and tech enthusiasts have started creating apps for their brands. Moving smart ahead, developers choose to add communication features to their apps instead [&hellip;]<\/p>\n","protected":false},"author":85,"featured_media":22906,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_stopmodifiedupdate":false,"_modified_date":"","footnotes":""},"categories":[1272],"tags":[2028,2027,2029],"class_list":["post-22424","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tech-talks","tag-build-an-android-app-using-java","tag-build-an-anroid-app","tag-java"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v20.6 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>How to Develop a Video Call App for Android Using Java?<\/title>\n<meta name=\"description\" content=\"Learn how to build an Android voice and video call app using Java. Follow steps for setup, SDK integration, permissions and launching real-time communication.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.mirrorfly.com\/blog\/build-android-app-with-voice-video-using-java\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"How to Create an Android Video Call App Using Java Technology\" \/>\n<meta property=\"og:description\" content=\"Explore how to create your own android app using Java in simple step-by-step tutorial. Add voice and video calling features to android app with MirrorFly SDK.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.mirrorfly.com\/blog\/build-android-app-with-voice-video-using-java\/\" \/>\n<meta property=\"og:site_name\" content=\"MirrorFly Blog - Chat API And Messaging SDK for your Mobile and Web Apps\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/MirrorFlyofficial\/\" \/>\n<meta property=\"article:published_time\" content=\"2022-08-16T06:11:04+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-02-13T12:37:18+00:00\" \/>\n<meta name=\"author\" content=\"Atchaya Jayabal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:title\" content=\"Step-by-Step Tutorial: How to Create an Android Video Call App in Java\" \/>\n<meta name=\"twitter:description\" content=\"In this tutorial, we provide a detailed Java tutorial for you to explore the power of MirrorFly Android SDK. Build a fully-functional android video call app today.\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Atchaya Jayabal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"11 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.mirrorfly.com\/blog\/build-android-app-with-voice-video-using-java\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.mirrorfly.com\/blog\/build-android-app-with-voice-video-using-java\/\"},\"author\":{\"name\":\"Atchaya Jayabal\",\"@id\":\"https:\/\/www.mirrorfly.com\/blog\/#\/schema\/person\/27e1ae59b77c7775bd63034148eb3294\"},\"headline\":\"How to Build an Android Video Calling App Using Java?\",\"datePublished\":\"2022-08-16T06:11:04+00:00\",\"dateModified\":\"2026-02-13T12:37:18+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.mirrorfly.com\/blog\/build-android-app-with-voice-video-using-java\/\"},\"wordCount\":1638,\"commentCount\":12,\"publisher\":{\"@id\":\"https:\/\/www.mirrorfly.com\/blog\/#organization\"},\"keywords\":[\"build an android app using java\",\"build an anroid app\",\"java\"],\"articleSection\":[\"Tech Talks\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.mirrorfly.com\/blog\/build-android-app-with-voice-video-using-java\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.mirrorfly.com\/blog\/build-android-app-with-voice-video-using-java\/\",\"url\":\"https:\/\/www.mirrorfly.com\/blog\/build-android-app-with-voice-video-using-java\/\",\"name\":\"How to Develop a Video Call App for Android Using Java?\",\"isPartOf\":{\"@id\":\"https:\/\/www.mirrorfly.com\/blog\/#website\"},\"datePublished\":\"2022-08-16T06:11:04+00:00\",\"dateModified\":\"2026-02-13T12:37:18+00:00\",\"description\":\"Learn how to build an Android voice and video call app using Java. Follow steps for setup, SDK integration, permissions and launching real-time communication.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.mirrorfly.com\/blog\/build-android-app-with-voice-video-using-java\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.mirrorfly.com\/blog\/build-android-app-with-voice-video-using-java\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.mirrorfly.com\/blog\/build-android-app-with-voice-video-using-java\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Blog\",\"item\":\"https:\/\/www.mirrorfly.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Tech Talks\",\"item\":\"https:\/\/www.mirrorfly.com\/blog\/category\/tech-talks\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"How to Build an Android Video Calling App Using Java?\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.mirrorfly.com\/blog\/#website\",\"url\":\"https:\/\/www.mirrorfly.com\/blog\/\",\"name\":\"MirrorFly Blog - Chat API And Messaging SDK for your Mobile and Web Apps\",\"description\":\"World&#039;s Most Scalable Chat APIs &amp; SDKs for Small, Medium &amp; Enterprises\",\"publisher\":{\"@id\":\"https:\/\/www.mirrorfly.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.mirrorfly.com\/blog\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.mirrorfly.com\/blog\/#organization\",\"name\":\"MirrorFly\",\"url\":\"https:\/\/www.mirrorfly.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.mirrorfly.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.mirrorfly.com\/blog\/wp-content\/uploads\/2020\/07\/mirrorfly-blue.png\",\"contentUrl\":\"https:\/\/www.mirrorfly.com\/blog\/wp-content\/uploads\/2020\/07\/mirrorfly-blue.png\",\"width\":520,\"height\":100,\"caption\":\"MirrorFly\"},\"image\":{\"@id\":\"https:\/\/www.mirrorfly.com\/blog\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/MirrorFlyofficial\/\",\"https:\/\/www.instagram.com\/mirrorflyofficial\/\",\"https:\/\/www.linkedin.com\/showcase\/mirrorfly-official\/\",\"https:\/\/x.com\/MirrorFlyTeam\/\",\"https:\/\/github.com\/mirrorfly\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.mirrorfly.com\/blog\/#\/schema\/person\/27e1ae59b77c7775bd63034148eb3294\",\"name\":\"Atchaya Jayabal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.mirrorfly.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/c7684e399858444026b2603501ecba15?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/c7684e399858444026b2603501ecba15?s=96&d=mm&r=g\",\"caption\":\"Atchaya Jayabal\"},\"description\":\"Atchaya Jayabal leads Content at MirrorFly and is an expert in writing Tech, SaaS & B2B. She regularly publishes articles on CPaaS & Conversational AI in blogs.\",\"url\":\"https:\/\/www.mirrorfly.com\/blog\/author\/atchaya-jayabal\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"How to Develop a Video Call App for Android Using Java?","description":"Learn how to build an Android voice and video call app using Java. Follow steps for setup, SDK integration, permissions and launching real-time communication.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.mirrorfly.com\/blog\/build-android-app-with-voice-video-using-java\/","og_locale":"en_US","og_type":"article","og_title":"How to Create an Android Video Call App Using Java Technology","og_description":"Explore how to create your own android app using Java in simple step-by-step tutorial. Add voice and video calling features to android app with MirrorFly SDK.","og_url":"https:\/\/www.mirrorfly.com\/blog\/build-android-app-with-voice-video-using-java\/","og_site_name":"MirrorFly Blog - Chat API And Messaging SDK for your Mobile and Web Apps","article_publisher":"https:\/\/www.facebook.com\/MirrorFlyofficial\/","article_published_time":"2022-08-16T06:11:04+00:00","article_modified_time":"2026-02-13T12:37:18+00:00","author":"Atchaya Jayabal","twitter_card":"summary_large_image","twitter_title":"Step-by-Step Tutorial: How to Create an Android Video Call App in Java","twitter_description":"In this tutorial, we provide a detailed Java tutorial for you to explore the power of MirrorFly Android SDK. Build a fully-functional android video call app today.","twitter_misc":{"Written by":"Atchaya Jayabal","Est. reading time":"11 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.mirrorfly.com\/blog\/build-android-app-with-voice-video-using-java\/#article","isPartOf":{"@id":"https:\/\/www.mirrorfly.com\/blog\/build-android-app-with-voice-video-using-java\/"},"author":{"name":"Atchaya Jayabal","@id":"https:\/\/www.mirrorfly.com\/blog\/#\/schema\/person\/27e1ae59b77c7775bd63034148eb3294"},"headline":"How to Build an Android Video Calling App Using Java?","datePublished":"2022-08-16T06:11:04+00:00","dateModified":"2026-02-13T12:37:18+00:00","mainEntityOfPage":{"@id":"https:\/\/www.mirrorfly.com\/blog\/build-android-app-with-voice-video-using-java\/"},"wordCount":1638,"commentCount":12,"publisher":{"@id":"https:\/\/www.mirrorfly.com\/blog\/#organization"},"keywords":["build an android app using java","build an anroid app","java"],"articleSection":["Tech Talks"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.mirrorfly.com\/blog\/build-android-app-with-voice-video-using-java\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.mirrorfly.com\/blog\/build-android-app-with-voice-video-using-java\/","url":"https:\/\/www.mirrorfly.com\/blog\/build-android-app-with-voice-video-using-java\/","name":"How to Develop a Video Call App for Android Using Java?","isPartOf":{"@id":"https:\/\/www.mirrorfly.com\/blog\/#website"},"datePublished":"2022-08-16T06:11:04+00:00","dateModified":"2026-02-13T12:37:18+00:00","description":"Learn how to build an Android voice and video call app using Java. Follow steps for setup, SDK integration, permissions and launching real-time communication.","breadcrumb":{"@id":"https:\/\/www.mirrorfly.com\/blog\/build-android-app-with-voice-video-using-java\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.mirrorfly.com\/blog\/build-android-app-with-voice-video-using-java\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.mirrorfly.com\/blog\/build-android-app-with-voice-video-using-java\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Blog","item":"https:\/\/www.mirrorfly.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Tech Talks","item":"https:\/\/www.mirrorfly.com\/blog\/category\/tech-talks\/"},{"@type":"ListItem","position":3,"name":"How to Build an Android Video Calling App Using Java?"}]},{"@type":"WebSite","@id":"https:\/\/www.mirrorfly.com\/blog\/#website","url":"https:\/\/www.mirrorfly.com\/blog\/","name":"MirrorFly Blog - Chat API And Messaging SDK for your Mobile and Web Apps","description":"World&#039;s Most Scalable Chat APIs &amp; SDKs for Small, Medium &amp; Enterprises","publisher":{"@id":"https:\/\/www.mirrorfly.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.mirrorfly.com\/blog\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.mirrorfly.com\/blog\/#organization","name":"MirrorFly","url":"https:\/\/www.mirrorfly.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.mirrorfly.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.mirrorfly.com\/blog\/wp-content\/uploads\/2020\/07\/mirrorfly-blue.png","contentUrl":"https:\/\/www.mirrorfly.com\/blog\/wp-content\/uploads\/2020\/07\/mirrorfly-blue.png","width":520,"height":100,"caption":"MirrorFly"},"image":{"@id":"https:\/\/www.mirrorfly.com\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/MirrorFlyofficial\/","https:\/\/www.instagram.com\/mirrorflyofficial\/","https:\/\/www.linkedin.com\/showcase\/mirrorfly-official\/","https:\/\/x.com\/MirrorFlyTeam\/","https:\/\/github.com\/mirrorfly"]},{"@type":"Person","@id":"https:\/\/www.mirrorfly.com\/blog\/#\/schema\/person\/27e1ae59b77c7775bd63034148eb3294","name":"Atchaya Jayabal","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.mirrorfly.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/c7684e399858444026b2603501ecba15?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/c7684e399858444026b2603501ecba15?s=96&d=mm&r=g","caption":"Atchaya Jayabal"},"description":"Atchaya Jayabal leads Content at MirrorFly and is an expert in writing Tech, SaaS & B2B. She regularly publishes articles on CPaaS & Conversational AI in blogs.","url":"https:\/\/www.mirrorfly.com\/blog\/author\/atchaya-jayabal\/"}]}},"_links":{"self":[{"href":"https:\/\/www.mirrorfly.com\/blog\/wp-json\/wp\/v2\/posts\/22424","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mirrorfly.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.mirrorfly.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.mirrorfly.com\/blog\/wp-json\/wp\/v2\/users\/85"}],"replies":[{"embeddable":true,"href":"https:\/\/www.mirrorfly.com\/blog\/wp-json\/wp\/v2\/comments?post=22424"}],"version-history":[{"count":47,"href":"https:\/\/www.mirrorfly.com\/blog\/wp-json\/wp\/v2\/posts\/22424\/revisions"}],"predecessor-version":[{"id":43165,"href":"https:\/\/www.mirrorfly.com\/blog\/wp-json\/wp\/v2\/posts\/22424\/revisions\/43165"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.mirrorfly.com\/blog\/wp-json\/wp\/v2\/media\/22906"}],"wp:attachment":[{"href":"https:\/\/www.mirrorfly.com\/blog\/wp-json\/wp\/v2\/media?parent=22424"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.mirrorfly.com\/blog\/wp-json\/wp\/v2\/categories?post=22424"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.mirrorfly.com\/blog\/wp-json\/wp\/v2\/tags?post=22424"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}