package com.lovejia.WifiVoip;
import java.io.IOException;
import java.net.InetAddress;
import java.net.MulticastSocket;
import android.app.Activity;
import android.content.Context;
import android.net.wifi.WifiManager;
import android.net.wifi.WifiManager.MulticastLock;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends Activity {
MulticastLock multicastLock;
private Button btnStart = null;
private Button btnClose = null;
int port = 9876;
InetAddress group = null;
MulticastSocket ms = null;
AudioReader ar;
AudioWriter aw;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnStart = (Button) findViewById(R.id.btnStart);
btnClose = (Button) findViewById(R.id.btnClose);
btnStart.setOnClickListener(startClickListener);
btnClose.setOnClickListener(closeClickListener);
EnableWifiMulticast();
}
private void EnableWifiMulticast()
{
WifiManager wifiManager=(WifiManager)getSystemService(Context.WIFI_SERVICE);
multicastLock=wifiManager.createMulticastLock("multicast.test");
multicastLock.acquire();
}
private void ReleaseWifiMulticast()
{
multicastLock.release();
}
private OnClickListener startClickListener = new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
JoinCreateMuticast();
ar = new AudioReader(group,port,ms);
ar.run();
aw = new AudioWriter(group,port,ms);
aw.run();
}
private void JoinCreateMuticast() {
// TODO Auto-generated method stub
try {
ms = new MulticastSocket(port);
ms.setLoopbackMode(true);
// group = InetAddress.getByName("224.5.0.7");
group = InetAddress.getByName("224.0.0.1");
ms.joinGroup(group);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
ReleaseWifiMulticast();
}
}
};
private OnClickListener closeClickListener = new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
try {
ms.leaveGroup(group);
ReleaseWifiMulticast();
System.exit(0);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
package com.lovejia.WifiVoip;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaRecorder;
public class AudioWriter extends Thread{
private int port = 0;
private InetAddress group = null;
private MulticastSocket ms = null;
private int bufferSize = 0;
byte[] buffer;
AudioRecord ar;
public AudioWriter(InetAddress group,int port,MulticastSocket ms) {
// TODO Auto-generated constructor stub
this.group = group;
this.port = port;
this.ms = ms;
initRecord();
}
private void initRecord()
{
int frequency = 11025;
int channelConfiguration = AudioFormat.CHANNEL_IN_DEFAULT;
int audioEncoding = AudioFormat.ENCODING_PCM_16BIT;
bufferSize = AudioRecord.getMinBufferSize(frequency, channelConfiguration, audioEncoding);
ar = new AudioRecord(MediaRecorder.AudioSource.MIC,frequency, channelConfiguration,audioEncoding, bufferSize);
buffer = new byte[bufferSize];
}
private byte[] startRecord()
{
ar.startRecording();
ar.read(buffer, 0, bufferSize);
return buffer;
}
@Override
public void run() {
// TODO Auto-generated method stub
while(true)
{
byte[] date = startRecord();
DatagramPacket dp = new DatagramPacket(date, date.length,group,port);
try {
ms.send(dp);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
package com.lovejia.WifiVoip;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
import android.media.AudioFormat;
import android.media.AudioManager;
import android.media.AudioTrack;
public class AudioReader extends Thread
{
private int port = 0;
private InetAddress group = null;
private MulticastSocket ms = null;
public AudioReader(InetAddress group,int port,MulticastSocket ms) {
// TODO Auto-generated constructor stub
this.port = port;
this.group = group;
this.ms = ms;
}
public void run() {
byte[] buffer = new byte[8192];
while(true)
{
DatagramPacket dp = new DatagramPacket(buffer, buffer.length);
try {
ms.receive(dp);
AudioTrack at = new AudioTrack(AudioManager.STREAM_MUSIC,11025,AudioFormat.CHANNEL_OUT_MONO,AudioFormat.ENCODING_PCM_16BIT,buffer.length,AudioTrack.MODE_STREAM);
at.play();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String s = new String(dp.getData());
// System.out.println(s);
}
}
}