如何在其他呼叫运行时以编程方式合并呼叫(电话会议)

时间:2014-01-06 14:03:31

标签: android api merge

我的要求是这样的:假设我在那个时候拨打电话,我想以编程方式拨打另一个号码。到目前为止,我所做的是:我可以拨打特定号码,而某些电话已经开始。例如,假设我呼叫号码123并在1分钟后呼叫(通过使用Alarm Manger我触发一个事件来呼叫另一个号码456并完成!

Intent intent = new Intent(Intent.ACTION_CALL);
intent.setData(Uri.parse("tel:456"));
startActivity(intent);

我正在使用这样的意图打电话,现在我能够看到手机上的屏幕上有一个合并通话的按钮:

screenshot of phone

在此图片中,您可以看到合并通话按钮。现在,当用户点击合并时,它将合并所有3个呼叫。我想以编程方式进行,而不是使用用户界面。

6 个答案:

答案 0 :(得分:14)

你的问题似乎很有趣,所以我开始挖掘Android Source。这是我发现的:

您发布的图片中的活动称为InCallUI

当你开始环顾四周时,你会发现第{46}行的InCallPresenter

final boolean canMerge = activeCall.can(Capabilities.MERGE_CALLS);

然后在472:

CallCommandClient.getInstance().merge();

当您检查CallCommandClient中的merge()方法时,您会发现它使用ICallCommandService接口,我认为这就是您在寻找的地方:)

CallCommandClient的初始化位于第193行的CallHandlerService

希望这会有所帮助&祝你好运。

PS。我列出的API主要是内部Android内容。您可能必须使用反射来调用它或者根本不可能 - 它可能无法用于您的应用,因为它未标记为系统应用。

答案 1 :(得分:8)

Android API不支持呼叫合并功能,您可以看到此线程。 https://groups.google.com/forum/?fromgroups#!searchin/android-developers/conference $ 20call / Android的开发者/ 6OXDEe0tCks / 8cuKdW1J9b8J 但是你可以做的是打开手机的呼叫垫屏幕,使用来自那里的用户可以添加另一个电话或合并电话。

答案 2 :(得分:5)

您无法使用智能手机管理会议。您需要一个可以为您执行此操作的中间服务。您可以使用CCXML对会议管理员进行编程。

Voxeo有一个很好的CCXML实施托管平台,您可以查看他们的documentation如何设置会议。 “在CCXML 1.0中学习CCXML 1.0 \多方会议”中有一些示例。

您可以在Voxeo上免费开发和测试,如果您投入生产,他们只会开始向您收费。另一种选择是Twillio。

以下是how you program a conference call on their platform.

的链接

检查链接,您将获得有用的信息。 #courtesy- SO

答案 3 :(得分:4)

Afaik,SDK中没有以编程方式合并调用的API。

你必须处理用于电话呼叫的呼叫会议的RIL (Radio Interface Layer)

  

Android的无线电接口层(RIL)在Android电话服务(android.telephony)和无线电硬件之间提供了一个抽象层。 RIL与无线电无关,并且包括对基于全球移动通信系统(GSM)的无线电的支持。

见这里:http://www.kandroid.org/online-pdk/guide/telephony.html

更新

How does Modem code talk to Android code

http://fabiensanglard.net/cellphoneModem/index2.php

http://www.e-consystems.com/blog/android/?p=498

所以你必须在套接字中编写AT调制解调器命令,然后rild调用回调到供应商库,然后供应商库依次委托给无线电固件。

答案 4 :(得分:1)

在Android中没有api用于召开电话会议,你可能想要使用root系统来完成你的工作。

正式android没有为电话会议提供任何api。您可以在此处学习更多根访问权限

http://www.kandroid.org/online-pdk/guide/telephony.html

答案 5 :(得分:1)

经过大量搜索,我成功合并呼叫,在这里我想与您分享我的发现。 作为参考,我使用了此link

  1. 在您的项目中使用CallList.java
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"

...

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

    <application
        android:requestLegacyExternalStorage="true"
        android:allowBackup="true"

...

</manifest>

2。InCallService类的CallList.java的调用方法。

 PermissionListener permissionlistener = new PermissionListener() {
        @Override
        public void onPermissionGranted() {
            Toast.makeText(MainActivity.this, "Permission granted", Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onPermissionDenied(List<String> deniedPermissions) {
            Toast.makeText(MainActivity.this, "Permission denied\n" + deniedPermissions.toString(), Toast.LENGTH_SHORT).show();
        }
    };

    @RequiresApi(api = Build.VERSION_CODES.R)
    @Override
    public void onCreate(Bundle savedInstanceState) {
        TedPermission.with(this)
                .setPermissionListener(permissionlistener)
                .setDeniedMessage("External Storage READ/WRITE Denied")
                .setPermissions(Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE)
                .check();

...

   final String sdPath = Environment.getExternalStorageDirectory().getAbsolutePath();
   final File myDir = new File(sdPath + "/myDiary");
   string fileName = Integer.toString(year) + "_"
                        + Integer.toString(monthOfYear + 1) + "_"
                        + Integer.toString(dayOfMonth) + ".txt";

...

 btnWrite.setOnClickListener(new View.OnClickListener() {
            @RequiresApi(api = Build.VERSION_CODES.O)
            public void onClick(View v) {
                try {
                    //openFileoutput Methods does not allow path delimiters.                    
                    File current_file = new File(myDir + "/" + fileName);

                    if (!current_file.getParentFile().exists()) {
                        if (!current_file.getParentFile().mkdirs()) {
                            Toast.makeText(getApplicationContext(),
                                    "Failed to create folder : " + myDir, Toast.LENGTH_SHORT).show();
                        }
                    }

                    if (!current_file.exists()) {
                        if (!current_file.createNewFile()) {
                            Toast.makeText(getApplicationContext(),
                                    "Failed to create file : " + myDir + "/" + fileName, Toast.LENGTH_SHORT).show();
                        }
                    }

                    FileOutputStream outFs = new FileOutputStream(new File(String.valueOf(current_file)));

                    String str = edtDiary.getText().toString();
                    outFs.write(str.getBytes());
                    outFs.close();

                    Toast.makeText(getApplicationContext(),
                            fileName + " is saved", Toast.LENGTH_SHORT).show();

                } catch (IOException e) {
                    Toast.makeText(getApplicationContext(),
                            "Failed to save file : " + myDir + "/" + fileName, Toast.LENGTH_SHORT).show();
                    e.printStackTrace();
                }

            }
        });

...
//read text file from external storage
String readDiary(String fName) {
        String diaryStr = null;
        FileInputStream inFs;
        try {
            inFs = new FileInputStream(new File(fName));
            byte[] txt = new byte[500];
            inFs.read(txt);
            inFs.close();
            diaryStr = (new String(txt)).trim();
            btnWrite.setText("modify");
        } catch (IOException e) {
            edtDiary.setHint("no existing diary");
            btnWrite.setText("new save");
        }
        return diaryStr;
    }



  1. 最终通话功能以合并通话
2020-10-23 15:40:00.986 6178-6178/com.cookandroid.project8_1 W/System.err: java.io.IOException: No such file or directory
2020-10-23 15:40:00.986 6178-6178/com.cookandroid.project8_1 W/System.err:     at java.io.UnixFileSystem.createFileExclusively0(Native Method)
2020-10-23 15:40:00.986 6178-6178/com.cookandroid.project8_1 W/System.err:     at java.io.UnixFileSystem.createFileExclusively(UnixFileSystem.java:317)
2020-10-23 15:40:00.986 6178-6178/com.cookandroid.project8_1 W/System.err:     at java.io.File.createNewFile(File.java:1008)
2020-10-23 15:40:00.986 6178-6178/com.cookandroid.project8_1 W/System.err:     at com.cookandroid.project8_1.MainActivity$3.onClick(MainActivity.java:102)
2020-10-23 15:40:00.987 6178-6178/com.cookandroid.project8_1 W/System.err:     at android.view.View.performClick(View.java:7448)
2020-10-23 15:40:00.987 6178-6178/com.cookandroid.project8_1 W/System.err:     at android.view.View.performClickInternal(View.java:7425)
2020-10-23 15:40:00.987 6178-6178/com.cookandroid.project8_1 W/System.err:     at android.view.View.access$3600(View.java:810)
2020-10-23 15:40:00.987 6178-6178/com.cookandroid.project8_1 W/System.err:     at android.view.View$PerformClick.run(View.java:28305)
2020-10-23 15:40:00.987 6178-6178/com.cookandroid.project8_1 W/System.err:     at android.os.Handler.handleCallback(Handler.java:938)
2020-10-23 15:40:00.987 6178-6178/com.cookandroid.project8_1 W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:99)
2020-10-23 15:40:00.987 6178-6178/com.cookandroid.project8_1 W/System.err:     at android.os.Looper.loop(Looper.java:223)
2020-10-23 15:40:00.987 6178-6178/com.cookandroid.project8_1 W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:7656)
2020-10-23 15:40:00.987 6178-6178/com.cookandroid.project8_1 W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
2020-10-23 15:40:00.987 6178-6178/com.cookandroid.project8_1 W/System.err:     at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
2020-10-23 15:40:00.987 6178-6178/com.cookandroid.project8_1 W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)