- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我配置了 Freeswitch 服务器,能够在两个 FSClient 实例之间成功进行音频通话。但是,如果我使用相同的两个号码在 FSClient 实例和 Android 手机之间连接 VOIP 调用,则会收到并接听电话,但没有音频。请让我知道我在 Android 上可能做错了什么。我的代码粘贴在下面。
感谢您提供的任何帮助。
public class MainActivity extends Activity {
public SipManager mSipManager = null;
private SipProfile mSipProfile = null;
public SipAudioCall incomingCall = null;
private final MediaPlayer mediaPlayer = new MediaPlayer();
private class IncomingAudioCallReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
final Context appContext = context;
try {
SipAudioCall.Listener listener = new SipAudioCall.Listener() {
@Override
public void onRinging(SipAudioCall call, android.net.sip.SipProfile caller) {
try {
Toast.makeText(appContext, "Incoming Call Event", Toast.LENGTH_SHORT).show();
mediaPlayer.stop();
incomingCall = call;
incomingCall.answerCall(30);
incomingCall.startAudio();
incomingCall.setSpeakerMode(true);
if(incomingCall.isMuted()) {
incomingCall.toggleMute();
}
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onCallEstablished(SipAudioCall call) {
// Call picked UI
Toast.makeText(appContext, "Call is On", Toast.LENGTH_SHORT).show();
}
@Override
public void onCallEnded(SipAudioCall call) {
// Call ended. Back to normal UI
}
};
mediaPlayer.setDataSource(context, RingtoneManager
.getDefaultUri(RingtoneManager.TYPE_RINGTONE));
mediaPlayer.setAudioStreamType(AudioManager.STREAM_RING);
mediaPlayer.prepare();
mediaPlayer.start();
incomingCall = mSipManager.takeAudioCall(intent, null);
incomingCall.setListener(listener, true);
} catch (Exception e) {
if (incomingCall != null) {
incomingCall.close();
}
}
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
IntentFilter filter = new IntentFilter();
filter.addAction("android.TestVoip.INCOMING_CALL");
IncomingAudioCallReceiver callReceiver = new IncomingAudioCallReceiver();
registerReceiver(callReceiver, filter);
Button btnConnect = (Button) findViewById(R.id.connect);
btnConnect.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
instantiateSip();
}
});
Button btnCall = (Button) findViewById(R.id.testCall);
btnCall.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
initialiseCall();
}
});
Button btnDisconnect = (Button) findViewById(R.id.disconnect);
btnDisconnect.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
try {
mSipManager.close(mSipProfile.getUriString());
} catch (SipException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
Button btnAnswerCall = (Button) findViewById(R.id.answerCall);
btnAnswerCall.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
try {
Toast.makeText(getApplicationContext(), "Answer Incoming", Toast.LENGTH_SHORT).show();
incomingCall.answerCall(200);
incomingCall.startAudio();
incomingCall.setSpeakerMode(true);
if(incomingCall.isMuted())
incomingCall.toggleMute();
} catch (SipException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
private void instantiateSip()
{
try {
if(mSipManager == null) {
mSipManager = SipManager.newInstance(this);
}
EditText txtUserName = (EditText) findViewById(R.id.username);
EditText txtPassword = (EditText) findViewById(R.id.pass);
SipProfile.Builder builder = new SipProfile.Builder(txtUserName.getText().toString(), "14.49.56.12");
builder.setPassword(txtPassword.getText().toString());
builder.setPort(5060);
builder.setProtocol("TCP");
mSipProfile = builder.build();
SipRegistrationListener regnListener = new SipRegistrationListener() {
@Override
public void onRegistrationFailed(String localProfileUri, int errorCode,
String errorMessage) {
// TODO Auto-generated method stub
runOnUiThread(new Runnable() {
public void run() {
Toast.makeText(getApplicationContext(), "Registration failed. Please check settings.", Toast.LENGTH_SHORT).show();
}
});
}
@Override
public void onRegistrationDone(String localProfileUri, long expiryTime) {
// TODO Auto-generated method stub
runOnUiThread(new Runnable() {
public void run() {
Toast.makeText(getApplicationContext(), "Ready", Toast.LENGTH_SHORT).show();
}
});
}
@Override
public void onRegistering(String localProfileUri) {
// TODO Auto-generated method stub
runOnUiThread(new Runnable() {
public void run() {
Toast.makeText(getApplicationContext(), "Registering with SIP Server...", Toast.LENGTH_SHORT).show();
}
});
}
};
System.out.println(mSipProfile.getUriString());
Intent intent = new Intent();
intent.setAction("android.TestVoip.INCOMING_CALL");
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, Intent.FILL_IN_DATA);
//mSipManager.register(mSipProfile, 200, regnListener);
mSipManager.open(mSipProfile, pendingIntent, null);
Toast.makeText(getApplicationContext(), "Opened Connection", Toast.LENGTH_SHORT).show();
/*
if (mSipManager.isRegistered(mSipProfile.getUriString()))
{
mSipManager.open(mSipProfile);
}
else
{
mSipManager.register(mSipProfile, 200, regnListener);
}
*/
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SipException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private void initialiseCall()
{
try {
SipAudioCall.Listener listener = new SipAudioCall.Listener() {
@Override
public void onRinging(SipAudioCall call, android.net.sip.SipProfile caller) {
try {
Toast.makeText(getApplicationContext(), "Ringing", Toast.LENGTH_SHORT).show();
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onCallEstablished(SipAudioCall call) {
Toast.makeText(getApplicationContext(), "Answered Call", Toast.LENGTH_SHORT).show();
call.startAudio();
call.setSpeakerMode(true);
call.toggleMute();
}
@Override
public void onCallEnded(SipAudioCall call) {
// Do something.
super.onCallEnded(call);
Toast.makeText(getApplicationContext(), "Ended Call", Toast.LENGTH_SHORT).show();
}
};
EditText txtNumberToCall = (EditText) findViewById(R.id.numberToCall);
SipAudioCall call = mSipManager.makeAudioCall(
mSipProfile.getUriString(), "sip:" + txtNumberToCall.getText().toString() + "@14.49.56.12", listener, 30);
Toast.makeText(getApplicationContext(), "Call placed", Toast.LENGTH_SHORT).show();
} catch (SipException e) {
// TODO Auto-generated catch block
e.printStackTrace();
Toast.makeText(getApplicationContext(), "Exception :" + e.getMessage(), Toast.LENGTH_SHORT).show();
}
}
最佳答案
找到答案了!根据文档, startAudio() 需要设置两个权限,而我没有。添加它们后,我开始在两端获取音频。
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
关于android - 在 FSClient 和 Android 手机之间使用我的自定义 SIP 应用程序时没有音频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39080744/
让我先描述一下我的问题。我将 Sofia SIP 用于电话应用程序,而我使用的 SIP 代理位于 NAT 后面。这意味着来自代理的传入邀请将内部代理 IP(例如 10.0.0.1)作为 Contact
我试图找出 的可能值范围接受 和 接受-联系 header 字段,但我在 RFC 中找不到完整列表。有谁知道他们在哪里?我经常看到 Accept: application/sdp;level=1,
我使用的 SIP 服务器通过端口 5070 监听 SIP/TLS 请求。我正在尝试跟踪和分析为什么我的拨号器没有通过 Wireshark 在网络上注册。 我已经在 Wireshark 的首选项中编辑了
我一直非常坚持解决这个问题,我去过几乎所有谈论这个主题的网站(包括旧的堆栈溢出帖子),现在我正在尝试遵循 Android“官方”文档以便让我的 SIP 客户端在我的 Asterisk 服务器上注册,应
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
我已经从一个 Asterisk(版本 11.2.1)创建了一个 sip 中继,说“A”服务器到另一个 Asterisk 服务器(11.7.0)说“B”,我得到 sip 响应 200 ok。 但是当我开
我几乎设法发起了一个 2 方通话(点击通话):第一个到我的办公室,第二个到我的手机,使用 Michal Niklas 回答(感谢 Michal) Asterisk click to call . 主要
本地和远程标记以及Call-ID的组合用于识别对话。据说Call-ID是一次调用的唯一值。那么为什么 Call-ID 不单独用于识别对话呢? 最佳答案 一句话:“发夹”。 “Hairpinning”是
我想在SIPBYE报头中获取Custom-Order的值。我尝试使用${sip_yee_h_Custom-Order},但它是空的,因为头名称前没有X前缀。。我可以编辑freeswitch sofia
我在使用以下代码时遇到错误。 我已经包含了 Sip 所需的所有 jar ;但是,我仍然不明白为什么会发生这个错误。你能给我解释一下吗? 我的代码类是: import java.net.InetAddr
我有一个 res_mysql.conf 配置为使用从 db.sql 文件重新填充的一些数据库 db。加载转储后,我重新加载配置,我的 SIP 对等点消失了: dev-ast*CLI> sip show
我正在制作 SIP 电话并且必须开发一个功能来支持多个注册。如果手机的主注册服务器关闭,手机应自动注册到辅助注册器,并在主注册器处于事件状态时再次返回主注册器。我的问题是:如何确定主注册商再次活跃起来
我正在尝试实现一个 sip 服务器以连接到 HTML sip 客户端(使用 sipml5 制作)。在我研究这样做的过程中,我遇到了 sip over web-sockets,这可能对我有用,但是,我不
我需要通过 Lua 脚本在 Kamailio 3.3.1 中设置自定义 header 。理论上我可以像这样在配置脚本中设置一个 - append_hf("X-MyHeader: myvalue\r\n
我需要通过 Lua 脚本在 Kamailio 3.3.1 中设置自定义 header 。理论上我可以像这样在配置脚本中设置一个 - append_hf("X-MyHeader: myvalue\r\n
DTMF 用于一些基于 sip 的软电话来处理负载类型。但是我不清楚使用 DTMF 的过程和重要性。开源软件电话,如 Red5phone和 Sipdroid使用 DTMF。任何人都可以解释这个问题或指
我需要一种在使用 Asterisk 调用文件发起调用时添加 SIP header 的方法。 有什么办法可以在通话文件中添加SIP头吗? 我知道我可以使用 Asterisk AGI 完成此操作,但是我找
我目前在连接到我的 SIP 客户端(IVR 语音服务)的对称 NAT 后面存在 SIP 用户代理问题。 我读到 Asterisk 在 sip.conf 中有一个解决方案,我可以在那里设置属性 nat=
已关闭。这个问题是 off-topic 。目前不接受答案。 想要改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 已关闭11 年前。 Improve th
我的客户公司有一个简单的 Web 应用程序 (Python Flask),我需要向它添加电话通知功能。 主要要求是应用程序应该调用用户、播放某个声音文件并接受一些音调输入(“您好!这是来自您的 Web
我是一名优秀的程序员,十分优秀!