Как реализовать приложение VOIP с использованием пакета android.net.rtp

Я пытаюсь реализовать приложение VoIP с помощью классов AudioGroup и AudioStream пакета android.net.rtp. Но мое приложение не работает должным образом. После того, как "Присоединиться" к объекту класса "AudioGroup" с объектом "AudioStream", его успешно удалите пакеты udp. Я проверил это с помощью анализатора пакетов. Но голос не слышен с телефона. Я запускаю свое приложение на двух телефонах и стараюсь общаться между ними.

Ниже я упоминаю свой исходный код.

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" />

Я использую телефон Samsung GALAXY S3 с ОС Android 4.0

Ответ 1

Фокус в том, чтобы правильно отобразить порт. Вам нужно использовать номер порта из audioStream.getLocalPort() и отправить этот номер порта в одноранговую сеть в пакете SDP в качестве сигнализации SIP.

Отметьте это примерное приложение, которое реализует функции sip https://github.com/Mobicents/restcomm-android-sdk/tree/master/Examples/JAIN%20SIP

Ответ 2

Я использовал тот же код, который вы отправили, и получил его с незначительными изменениями. В основном я обнаружил, что проблема заключается в правильности номера порта.

При создании audioStream номер порта кажется случайным. В Android developer я обнаружил: Note that the local port is assigned automatically to conform with RFC 3550.

Что я сделал, так это то, что я сначала запустил приложение на одном телефоне и использовал audioStream.getLocalPort(), чтобы найти номер порта. Затем я подключился к этому порту, используя другой. Это привело к двусторонней связи, даже если у меня был только правильный номер порта на одном телефоне.

Надеюсь, что это поможет.

Ответ 3

Думаю, вы должны установить динамик!

Возможно, вы можете использовать следующий метод:

audioManager.setSpeakerphoneOn(true);