2012-08-09 26 views
11

Tôi đang cố gắng triển khai ứng dụng VoIP bằng cách sử dụng các lớp AudioGroup và AudioStream của gói android.net.rtp. Nhưng ứng dụng của tôi không hoạt động đúng. Sau khi "Tham gia" đối tượng lớp "AudioGroup" với đối tượng "AudioStream", các gói udp gửi thành công. Tôi đã kiểm tra bằng cách sử dụng bộ phân tích gói. Nhưng giọng nói không được nghe từ điện thoại. Tôi chạy ứng dụng của mình trong 2 điện thoại và thử liên lạc thoại giữa chúng.Cách triển khai ứng dụng VOIP bằng gói android.net.rtp

Ở bên dưới, tôi đề cập đến mã nguồn của mình.

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

Tôi đặt quyền này trong Tệp kê khai.

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

Tôi đang sử dụng điện thoại Samsung GALAXY S3 với Android 4.0 OS

+0

Làm sao bạn giải quyết này? Tôi có chính xác cùng một câu hỏi –

Trả lời

4

tôi đã sử dụng cùng một mã mà bạn gửi và nhận nó làm việc với những thay đổi nhỏ. Về cơ bản tôi thấy vấn đề đã nhận được số cổng chính xác.

Khi tạo số audioStream số cổng có vẻ là ngẫu nhiên. Tại Android developer Tôi tìm thấy: Note that the local port is assigned automatically to conform with RFC 3550.

Điều tôi đã làm là tôi bắt đầu ứng dụng trên một điện thoại trước tiên và sử dụng audioStream.getLocalPort() để tìm số cổng. Sau đó, tôi kết nối với cổng này bằng cách sử dụng cổng khác. Điều này dẫn đến giao tiếp hai chiều, ngay cả khi tôi chỉ có số cổng chính xác trên một điện thoại.

Hy vọng điều này sẽ hữu ích.

+0

Cảm ơn bạn rất nhiều vì đã trả lời. Câu trả lời của bạn thật tuyệt. Nhưng tôi muốn thiết lập cổng địa phương RTP không bằng tay. Làm thế nào tôi sửa đổi lớp "AudioStream" để thiết lập cổng địa phương RTP từ mã. Cảm ơn bạn đã nâng cao. – user1576358

+0

Xin lỗi, nhưng tôi không biết. Tôi muốn làm điều này bản thân mình, nhưng tôi đã không thành công. Có vẻ như không thể - nó phải được tạo ngẫu nhiên khi khởi động. Tuy nhiên, nếu bạn sử dụng ví dụ SIP, bạn có thể gửi số cổng và các thông tin khác (ví dụ như Audiocodec) trước khi kết hợp. –

+0

Tôi đã thành công trong việc quản lý các thiết bị để phát trực tiếp giữa chúng và sử dụng giao thức báo hiệu của riêng tôi, để trao đổi các thông số của luồng giữa các máy khách (số cổng và codec, v.v.) – tristan2468

1

Tôi nghĩ bạn nên đặt loa lên!

lẽ bạn có thể sử dụng các phương pháp sau đây:

audioManager.setSpeakerphoneOn(true);