我的要求是这样的:假设我在那个时候拨打电话,我想以编程方式拨打另一个号码。到目前为止,我所做的是:我可以拨打特定号码,而某些电话已经开始。例如,假设我呼叫号码123并在1分钟后呼叫(通过使用Alarm Manger
我触发一个事件来呼叫另一个号码456并完成!
Intent intent = new Intent(Intent.ACTION_CALL);
intent.setData(Uri.parse("tel:456"));
startActivity(intent);
我正在使用这样的意图打电话,现在我能够看到手机上的屏幕上有一个合并通话的按钮:
在此图片中,您可以看到合并通话按钮。现在,当用户点击合并时,它将合并所有3个呼叫。我想以编程方式进行,而不是使用用户界面。
答案 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。您可以在此处学习更多根访问权限答案 5 :(得分:1)
经过大量搜索,我成功合并呼叫,在这里我想与您分享我的发现。 作为参考,我使用了此link
<?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;
}
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)