美文网首页
如何在 Android 中构建自己的语音通话 API?

如何在 Android 中构建自己的语音通话 API?

作者: 小城哇哇 | 来源:发表于2022-07-29 14:22 被阅读0次

    让我们探索吧!

    你想在android中构建一个语音通话应用程序吗?

    看了一圈还是一头雾水!加油,不要失去希望!

    这是您探索非凡的地方。让我们深入了解如何构建一个简单的 android 语音通话应用程序?

    在进入这个激动人心的旅程之前,有必要了解一下 Voice Calling API 的全部内容吗?

    什么是语音呼叫 API 以及它是如何工作的?

    首先,语音呼叫 api 是软件开发人员用来轻松拨打和接听电话的工具。换句话说,可以说它是连接公共交换电话网络 (PSTN) 和应用程序连接到互联网的语音 API。

    此 API 允许将软件轻松构建到任何现有应用程序中,包括 iOS、Android 和 Web 应用程序。

    继续了解此语音呼叫 API 如何执行任务。了解VoIP(互联网协议语音)非常重要,以便更好地理解。

    VoIP 是一项功能,当添加到应用程序时,您可以单独通过 Internet 拨打和接听电话,而无需与 PSTN 交互。

    语音 API 专为各种用途而构建,从基本电话到电话呼叫、应用程序到电话呼叫、电话会议等等。它主要是为开发人员提供对调用的编程控制。

    构建语音呼叫 API和 SDK的远景

    正如我们已经讨论过的语音通话 api,Android 通过内置应用程序拨打电话,这些应用程序很容易在任何地方拨打和接听电话。即使它允许我们通过应用程序拨打电话。

    在屏幕后面工作时,一切都与编程有关。这被称为旨在进一步进行的操作,但仍然是ACTION_CALL

    意图对象ACTION_CALL在使用并传递适当的数据时使用。它有助于启动内置电话应用程序来拨打电话。

    让我们知道如何?

    第 1 步:进行调用的动作意图- 执行调用此处使用的动作的过程是ACTION_CALL。以及此处用于添加操作调用的语法:

    意图 myIntent = **new** Intent(Intent.ACTION_CALL); // 这是用于 Action_call
    

    除此之外,您还可以使用ACTION_DIAL

    意图 myDialIntent = **new** Intent(Intent.ACTION_DIAL); // 这是 Action_Dial
    

    第 2 步: 拨打电话的数据意图- 例如,如果需要拨打电话,让我们说 -91-1234234679。我们需要使用 tel 中的setData设置数字,这是下面给出的 URL:

    myIntent.setData(Uri.parse("tel:91-123-456-7890"));
    

    如果我们想从用户那里获取数字,那么getData将类似于用户的以下内容:

    myIntent.setData(Uri.parse("tel:"+text_Phone.getText().toString()));startActivity(myIntent);
    

    探索语音呼叫 API 最常见的呼叫场景

    让我们看看一些常见的场景,语音通话应用程序如何使用 API 并对其进行控制?

    这三个场景可以得到最多

    1. 接听电话
    2. 接听电话
    3. 结束通话

    1.接听电话

    在从您的 android 手机拨打电话之前,您必须确保在该特定时刻没有执行任何呼叫。

    这是因为电信子系统在涉及其他应用程序中的活动呼叫时提供了某些限制。

    让我们考虑两种情况:

    I. 没有其他应用在主动待命:

    • 一旦您的应用接到电话
    • 呼叫通知将通过addNewIncomingCall(PhoneAccountHandle, Bundle)发送到电信子系统。
    • 然后,此子系统将绑定到您应用的ConnectionService实现。这样,使用onCreateIncomingConnection ****(PhoneAccountHandle, ConnectionRequest)就会产生一个 Connection 类的新实例。
    • 稍后,此电信子系统会通知应用程序并向用户显示传入呼叫onShowIncomingCallUi()。
    • 一旦用户接受来电,它就会被设置为setActive()。如果不是,则通过执行setDisconnected(DisconnectCause)获得****REJECTED,然后执行Destroy()方法。

    二、不能保持其他应用程序的活动呼叫:

    有时,确实会发生一些重要的电话需要参加并且不能被搁置的情况。在这种情况下,情况如下:

    • 一旦来电通过语音呼叫应用程序收到新呼叫。
    • 通知将作为 Call a ddNewIncomingCall (PhoneAccountHandle, Bundle)发送到电信子系统
    • 此子系统绑定到您应用的ConnectionService实现。它稍后会通过已使用的连接对象onCreateIncomingConnection (PhoneAccountHandle, ConnectionRequest)请求一个新实例。
    • 现在,在 UI 上显示来电的是电信子系统。
    • 如果用户倾向于接受呼叫,则此子系统将调用onAnswer() 方法。因此,将电信子系统指示为已设置的呼叫为setActive()
    • 如果反过来用户拒绝呼叫,该子系统将调用onReject() 方法。然后通过将调用设置为setDisconnected ****(DisconnectCause)将消息作为****REJECTED传递。
    • 后者将被称为Destroy()方法

    现在,接听电话或拨打电话都是关于当由于电信框架施加的一些限制而无法连接呼叫时我们应该处理的事情。

    一般来说,如果我们想拨打电话,我们必须遵循以下事项

    1. 首先必须通过应用程序发起呼叫。
    2. 使用方法placeCall (call, bundle)然后通知电信子系统有关新呼叫的信息。现在剩下的参数如下:
    • 这里,Uri参数代表被调用者的地址。对于数字必须使用电话:
    • 好吧,参数提供了有关应用程序的信息。所有这些都是通过将应用程序的phoneAccountHandle 对象添加到EXTRA_PHONE_ACCOUNT_HANDLE extra 来完成的。
    • 这些参数还可以通过执行EXTRA_START_CALL_WITH_VIDEO_STATE来指定捆绑包是否包含视频。
    • 总的来说,这个电信子系统绑定到语音通话应用的ConnectService实现。

    i) 如果应用程序无法调用,子系统调用:onCreateOutgoingConnectionFailed (PhoneAccountHandle, ConnectionRequest)。由于无法设置调用,它会向应用程序生成一条消息。

    ii)但是如果应用程序能够拨打电话,那么它将调用:onCreateOutgoingConnectionFailed (PhoneAccountHandle, ConnectionRequest)指定应用程序作为呼叫不能在第一时间设置通过激活呼叫立即进行更新,调用setActive ()通知电信子系统。

    一旦通话接通,我们需要在某个阶段结束通话,在那个地方结束会话,我们需要执行以下操作,

    • 调用方法setDisconnected (DisconnectCause)
    • 如果调用被用户LOCAL 参数终止,则将执行。类似地,如果呼叫被第三方断开,参数REMOTE将被执行。
    • 完成后,整个过程之后是参数destroy()

    在 Android 中构建语音呼叫 API 的步骤

    第 1 步:我们必须通过填写详细信息来创建一个新项目。然后需要通过activity_main,xml 文件打开,从而定义如下所示的布局:

    xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:tools="http://schemas.android.com/tools"
      android:orientation="vertical" android:layout_width="match_parent"
      android:layout_height="match_parent">
          android:id="@+id/textView2"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:layout_centerHorizontal="true"
          android:layout_marginLeft="100dp"
          android:layout_marginTop="100dp"
          android:fontFamily="@font/aclonica"
          android:text="DataFlair"
          android:textColor="@color/colorPrimaryDark"
          android:textSize="50dp" />
          android:id="@+id/fstTxt"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:layout_marginLeft="100dp"
          android:layout_marginTop="100dp"
          android:fontFamily="@font/acme"
          android:text="请输入手机号"
          安卓:textColor="#0F8B80"
          android:textSize="20dp" />
          android:id="@+id/mblTxt"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:layout_marginLeft="100dp"
          安卓:ems="10"
          android:hint="这里输入数字"
          android:textColor="#84E2DB"
          工具:layout_marginTop="20dp">
          android:id="@+id/btnCall"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:layout_marginLeft="150dp"
          android:layout_marginTop="20dp"
          android:text="拨号" />
    

    第 2 步:接下来是在mainActivity.java 文件中进行编码。因此如下:

    包 com.DataFlair.callexample;
    导入android.Manifest;
    导入android.content.Intent;
    导入 android.content.pm.PackageManager;
    导入android.net.Uri;
    导入android.os.Build;
    导入android.os.Bundle;
    导入android.view.View;
    导入android.widget.Button;
    导入 android.widget.EditText;
    导入androidx.appcompat.app.AppCompatActivity;
    导入androidx.core.app.ActivityCompat;
    公共类MainActivity扩展AppCompatActivity {
      私人EditText text_Phone;
      私人按钮 b_utton;
      @覆盖
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);
          text_Phone = (EditText) findViewById(R.id.mblTxt);
         mybutton = (Button) findViewById(R.id.btnCall);
         mybutton.setOnClickListener( new View.OnClickListener() {
              @覆盖
              公共无效onClick(查看 v){
                  电话号码();
              }
          });
      }
    @覆盖
      public void onRequestPermissionsResult(int requestCode, String[] 权限, int[] grantResults) {
           if (requestCode == 101) {
               if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                  电话号码();
              }
          }
      }
      public void callPhoneNumber() {
           try {
               if (Build.VERSION.SDK_INT > 22) {
                   if (ActivityCompat.checkSelfPermission( this , Manifest.permission.CALL_PHONE) !=PackageManager.PERMISSION_GRANTED) {
                      ActivityCompat.requestPermissions(MainActivity.this, new String[]{
                      Manifest.permission.CALL_PHONE}, 101);
                      返回;
                  }
                  意图 callIntent = new Intent(Intent.ACTION_CALL);
                  callIntent.setData(Uri.parse("tel:" + text_Phone.getText().toString()));
                  开始活动(调用意图);
              }其他{
                  意图 callIntent = new Intent(Intent.ACTION_CALL);
                  callIntent.setData(Uri.parse("tel:" + text_Phone.getText().toString()));
                  开始活动(调用意图);
              }
          }捕捉(异常前){
              ex.printStackTrace();
          }
      }
    }
    

    第 3 步:接下来是Manifest.xml文件:

      使用权限 android:name="android.permission.CALL_PHONE" />
      应用
              机器人:allowBackup="真"
              android:icon="@mipmap/ic_launcher"
              android:label="@string/app_name"
              android:roundIcon="@mipmap/ic_launcher_round"
              安卓:supportsRtl="true"
              android:theme="@style/AppTheme">
              活动 android:name=".MainActivity">
                      意图过滤器
                              动作 android:name="android.intent.action.MAIN"
                              类别 android:name="android.intent.category.LAUNCHER"
                   意图过滤器
            活动
            元数据
                    android:name="preloaded_fonts"
                    android:resource=" @array /preloaded_fonts"
        应用
    显现
    

    第 4 步:作为最后一步,应用程序需要被命令为“运行”。

    a) 申请的结果会有点像这样

    b) 完成后,需要输入电话号码

    c) 一旦输入电话号码,它就会请求允许继续前进

    d) 一旦,上述步骤自动完成,呼叫将被放置

    结语

    现在您一定对整个过程有了更深入的了解,并详细解释了如何为任何 Android 工作室构建语音通话 API。有了这个,现在轮到您实施相同的方法并以出色的方式探索结果了。

    但是,如果您认为您需要对此进行一些澄清。在评论部分让我们知道,以愉快地指导您!

    代码和图像参考取自:

    1. Data Flair.Training

    2. C Sharpcorner.com

    3.开发者 Android.com

    1. DBS Website.com

    5.集成语音通话API和SDK

    链接:https://dev.to/charalotteyog/how-to-build-your-own-voice-call-api-in-android-33ac

    相关文章

      网友评论

          本文标题:如何在 Android 中构建自己的语音通话 API?

          本文链接:https://www.haomeiwen.com/subject/okhqwrtx.html