我正在尝试使用android.net.rtp包的AudioGroup和AudioStream类来实现VoIP应用程序。但我的应用程序无法正常运行。在使用“AudioStream”对象“加入”“AudioGroup”类对象后,它成功发送udp数据包。我使用数据包分析器检查了一下。但是手机没有听到声音。我在2部手机中运行我的应用程序并尝试在它们之间传递语音。
在下面我提到我的源代码。
public class MainActivity extends Activity {
private AudioStream audioStream;
private AudioGroup audioGroup;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
try {
audioGroup = new AudioGroup();
audioGroup.setMode(AudioGroup.MODE_NORMAL);
audioStream = new AudioStream(InetAddress.getByAddress(new byte[] {(byte)192, (byte)168, (byte)1, (byte)4 }));
audioStream.setCodec(AudioCodec.PCMU);
audioStream.setMode(RtpStream.MODE_NORMAL);
audioStream.associate(InetAddress.getByAddress(new byte[] {(byte)192, (byte)168, (byte)1, (byte)2 }), 5004);
audioStream.join(audioGroup);
AudioManager Audio = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
Audio.setMode(AudioManager.MODE_IN_COMMUNICATION);
}
catch (SocketException e) { e.printStackTrace();}
catch (UnknownHostException e) { e.printStackTrace();}
catch (Exception ex) { ex.printStackTrace();}
}
我在清单文件中设置了这个权限。
<uses-permission android:name="android.permission.USE_SIP" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-feature android:name="android.hardware.sip.voip" android:required="true" />
<uses-feature android:name="android.hardware.wifi" android:required="true" />
<uses-feature android:name="android.hardware.microphone" android:required="true" />
我正在使用带有Android 4.0操作系统的三星GALAXY S3手机
答案 0 :(得分:6)
诀窍是让端口映射正确。您需要使用audioStream.getLocalPort()中的端口号,并将此端口号作为SIP信令发送到SDP数据包中的对等端。
查看这个实现sip功能的示例应用程序 https://github.com/Mobicents/restcomm-android-sdk/tree/master/Examples/JAIN%20SIP
答案 1 :(得分:5)
我使用了您提交的相同代码,并使用了一些细微的更改。基本上我发现问题是让端口号正确。
创建audioStream
时,端口号似乎是随机的。在Android developer
,我发现:Note that the local port is assigned automatically to conform with RFC 3550.
我做的是先在一部手机上启动应用程序,然后使用audioStream.getLocalPort()
查找端口号。然后我用另一个连接到这个端口。这导致了双向通信,即使我在一部手机上只有正确的端口号。
希望这有帮助。
答案 2 :(得分:1)
我认为你应该设置扬声器!
也许您可以使用以下方法:
audioManager.setSpeakerphoneOn(true);