如何使用android.net.rtp包实现VOIP应用程序

时间:2012-08-09 13:38:35

标签: android sip voip rtp

我正在尝试使用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手机

3 个答案:

答案 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);