2012-08-09 145 views
11

我正在嘗試使用android.net.rtp包的AudioGroup和AudioStream類實現VoIP應用程序。但我的應用程序無法正常工作。使用「AudioStream」對象「加入」「AudioGroup」類對象後,其成功發送udp數據包。我檢查了使用數據包分析器。但語音不是從電話聽到的。我用兩部手機運行我的應用程序,並嘗試在它們之間傳遞聲音。如何使用android.net.rtp包實現VOIP應用程序

在下面我提到我的源代碼。

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();} 
} 

我設置在manifest資源配置文件這個權限。

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

我現在用的是三星GALAXY S3手機採用Android 4.0操作系統

+0

這個示例應用程序你是怎麼解決這個問題?我有完全相同的問題 – 2015-04-08 11:08:52

回答

4

我用您提交相同的代碼,並得到了其與細微的變化工作。基本上我發現問題得到正確的端口號。

創建audioStream時,端口號似乎是隨機的。在Android developer我發現:Note that the local port is assigned automatically to conform with RFC 3550.

我所做的是我首先在一個電話上啓動了應用程序,並使用audioStream.getLocalPort()來查找端口號。然後我用另一個連接到這個端口。這導致了雙向通信,即使我只在一部手機上擁有正確的端口號。

希望這會有所幫助。

+0

非常感謝您的回覆。你的答案很好。但我想手動設置RTP本地端口號。如何修改「AudioStream」類以從代碼中設置RTP本地端口。 謝謝先進。 – user1576358 2012-12-14 04:37:55

+0

對不起,但我不知道。我想自己做這件事,但我沒有成功。它似乎不可能 - 它必須在啓動時隨機生成。但是,如果您使用SIP,則可以在關聯之前發送端口號和其他信息(例如Audiocodec)。 – 2012-12-22 13:40:51

+0

我成功設法讓設備在它們自己之間使用這個加上我自己的信令協議進行流式傳輸,以交換客戶端之間的流參數(端口號和編解碼器等)。 – tristan2468 2013-10-25 14:31:42

1

我想你應該設置揚聲器!

也許你可以使用下面的方法:

audioManager.setSpeakerphoneOn(true); 
相關問題